Skip to content
Merged
Show file tree
Hide file tree
Changes from 72 commits
Commits
Show all changes
202 commits
Select commit Hold shift + click to select a range
fd4aa51
refactor: 更新基类逻辑
ArgoZhang May 15, 2025
3e67c0b
Revert "refactor: 更新基类逻辑"
ArgoZhang May 15, 2025
d03eaf8
refactor: 重构继承结构
ArgoZhang May 15, 2025
dc2234d
doc: 更新示例
ArgoZhang May 15, 2025
4d1a629
refactor: 重构代码
ArgoZhang May 15, 2025
8de6408
refactor: 更新 InputUpload 组件
ArgoZhang May 15, 2025
231d66d
refactor: 修复文件上传文件名丢失问题
ArgoZhang May 15, 2025
e76f749
refactor: 增加多文件与目录支持
ArgoZhang May 15, 2025
09a417d
refactor: 移除基类参数
ArgoZhang May 15, 2025
be8ee03
refactor: 更新 ButtonUpload 组件
ArgoZhang May 15, 2025
7a36446
doc: 更新示例
ArgoZhang May 15, 2025
35838bc
refactor: 更新样式
ArgoZhang May 16, 2025
109a00c
doc: 移除过期参数
ArgoZhang May 16, 2025
30c9836
Merge remote-tracking branch 'gitee.com/main' into feat-upload
ArgoZhang May 16, 2025
0fc262b
doc: 文档格式化
ArgoZhang May 16, 2025
394fa67
style: 调整间距
ArgoZhang May 16, 2025
dcbbb76
doc: 更新示例文档
ArgoZhang May 16, 2025
1788107
feat: 调整扩展方法默认参数
ArgoZhang May 16, 2025
5549f58
refactor: 调整头像上传组件逻辑
ArgoZhang May 16, 2025
5a289e8
refactor: 重构代码
ArgoZhang May 16, 2025
45b431d
doc: 调整格式
ArgoZhang May 16, 2025
236fad8
doc: 修复键值不正确问题
ArgoZhang May 16, 2025
5ee0751
refactor: 代码重构
ArgoZhang May 16, 2025
8ec1708
doc: 调整文档格式
ArgoZhang May 16, 2025
f793638
refactor: 重构代码
ArgoZhang May 16, 2025
4a511c5
refactor: 移除 GC 方法
ArgoZhang May 16, 2025
856c7dd
doc: 更新示例
ArgoZhang May 16, 2025
a080026
doc: 更新代码
ArgoZhang May 16, 2025
22994a1
style: 更新样式
ArgoZhang May 16, 2025
daed39d
feat: 增加显示上传列表功能
ArgoZhang May 16, 2025
7c14a92
doc: 更新示例
ArgoZhang May 16, 2025
47ea560
refactor: 更改错别字
ArgoZhang May 16, 2025
9819e7b
refactor: 更新预览逻辑
ArgoZhang May 16, 2025
4eaa8cc
refactor: 调整样式
ArgoZhang May 16, 2025
ef86ee2
refactor: 更新 DropUpload 组件
ArgoZhang May 16, 2025
5a62204
doc: 更新示例文档
ArgoZhang May 16, 2025
0a2cacd
doc: 增加字典
ArgoZhang May 16, 2025
1ad8b5e
doc: 拆分示例
ArgoZhang May 16, 2025
cbe55a1
chore: 增加源码映射
ArgoZhang May 16, 2025
43cd584
doc: 增加菜单
ArgoZhang May 16, 2025
4358855
chore: 设置默认参数
ArgoZhang May 16, 2025
dc25bbf
style: 更新样式
ArgoZhang May 16, 2025
d5ed8b5
feat: 增加 Radius 参数
ArgoZhang May 16, 2025
9716f95
doc: 更新示例
ArgoZhang May 16, 2025
f77dbff
doc: 更新资源文件
ArgoZhang May 16, 2025
73ec5f3
doc: 更新映射文件
ArgoZhang May 16, 2025
e5ace88
doc: 更新参数文档
ArgoZhang May 16, 2025
717f10a
doc: 增加参数说明
ArgoZhang May 16, 2025
b8a3f15
doc: 补充资源文件
ArgoZhang May 16, 2025
d4fcae6
doc: 更新示例文档
ArgoZhang May 16, 2025
bb0fa13
doc: 更新文档
ArgoZhang May 16, 2025
3ce17e7
doc: 更新文档
ArgoZhang May 16, 2025
11d12ab
Merge branch 'main' into feat-upload
ArgoZhang May 16, 2025
68eec72
doc: 更新 UploadInputs 文档
ArgoZhang May 17, 2025
7b0bfc7
refactor: 更新弹窗脚本
ArgoZhang May 17, 2025
acf69c7
Merge branch 'main' into feat-upload
ArgoZhang May 17, 2025
a4e2090
doc: 精简代码
ArgoZhang May 17, 2025
9fef5f3
doc: 更新 ButtonUpload 示例
ArgoZhang May 17, 2025
6430fac
refactor: 重构代码
ArgoZhang May 17, 2025
1c90797
doc: 更新文档
ArgoZhang May 17, 2025
51eb786
refactor: 代码格式化
ArgoZhang May 17, 2025
3715aa4
doc: 更新文档
ArgoZhang May 17, 2025
b0add02
refactor: 消除警告信息
ArgoZhang May 17, 2025
7b0d36f
doc: 更新示例
ArgoZhang May 17, 2025
b40364e
doc: 更新 CardUpload 文档
ArgoZhang May 17, 2025
cd5f7e0
doc: 更新重连组件文档
ArgoZhang May 17, 2025
1de80b9
doc: 更新文档
ArgoZhang May 17, 2025
a0d3db6
Merge branch 'main' into feat-upload
ArgoZhang May 18, 2025
fd3b65d
doc: 更新文档
ArgoZhang May 18, 2025
78c8bf2
chore: 更正配置
ArgoZhang May 18, 2025
19ffabc
Merge branch 'main' into feat-upload
ArgoZhang May 18, 2025
ba128bf
chore: 更新脚本
ArgoZhang May 18, 2025
704b322
refactor: 代码重构
ArgoZhang May 18, 2025
0937de2
refactor: 重构值格式化逻辑
ArgoZhang May 18, 2025
1139855
chore: 更新字典
ArgoZhang May 18, 2025
037a478
refactor: 更新 ValueString 格式化方法
ArgoZhang May 18, 2025
60a7b3c
Merge branch 'main' into feat-upload
ArgoZhang May 18, 2025
734db33
refactor: 修复 InputUpload 删除报错问题
ArgoZhang May 18, 2025
502ea4f
refactor: 重构删除文件逻辑
ArgoZhang May 18, 2025
a863535
doc: 更新本地化文档
ArgoZhang May 18, 2025
62437c1
test: 更新单元测试
ArgoZhang May 18, 2025
9071af3
Merge branch 'main' into feat-upload
ArgoZhang May 18, 2025
0835a3c
Merge branch 'main' into feat-upload
ArgoZhang May 18, 2025
39a5dfa
test: 更新 UploadInputTest 单元测试
ArgoZhang May 18, 2025
648c771
refactor: 重构示例
ArgoZhang May 18, 2025
4126a72
test: 代码格式化
ArgoZhang May 18, 2025
5fcbb88
test: 更新 ButtonUpload 单元测试
ArgoZhang May 18, 2025
3e344ad
refactor: 重构代码
ArgoZhang May 18, 2025
9ee2d2d
test: 更新单元测试
ArgoZhang May 18, 2025
275e721
doc: 更新示例
ArgoZhang May 18, 2025
bc714ae
refactor: 精简代码使用父类逻辑
ArgoZhang May 18, 2025
1e589b6
refactor: 重构代码
ArgoZhang May 18, 2025
2914daf
feat: 完善 Validate 逻辑
ArgoZhang May 18, 2025
22f2e24
refactor: 重构客户端验证逻辑
ArgoZhang May 18, 2025
34a88ef
style: 更新样式
ArgoZhang May 18, 2025
44be1cb
refactor: 微调样式
ArgoZhang May 18, 2025
dcb9711
test: 更新单元测试
ArgoZhang May 18, 2025
0f5a6ee
refactor: 更新单元测试
ArgoZhang May 19, 2025
d6d3d8e
Merge branch 'main' into feat-upload
ArgoZhang May 20, 2025
a714399
Merge branch 'main' into feat-upload
ArgoZhang May 21, 2025
051c1d2
fix: 修复禁用后 Add 框出现问题
ArgoZhang May 21, 2025
f4d37e9
refactor: 重构代码
ArgoZhang May 21, 2025
aead094
refactor: 代码格式化
ArgoZhang May 21, 2025
d1e1a96
doc: 更新示例
ArgoZhang May 21, 2025
f1494c3
refactor: 复写 CheckCanUpload 方法
ArgoZhang May 21, 2025
eced46f
Merge branch 'main' into feat-upload
ArgoZhang May 22, 2025
4588bdc
refactor: 更新是否可以继续上传判断条件
ArgoZhang May 22, 2025
5ef9c65
refactor: 更新逻辑
ArgoZhang May 22, 2025
8d2cd8b
refactor: 重构按钮禁用逻辑
ArgoZhang May 22, 2025
af0cdfd
doc: 更新 CardUpload 组件文档
ArgoZhang May 22, 2025
41059be
refactor: 移除参数说明文档
ArgoZhang May 22, 2025
d73751e
doc: 更新示例文档减少重复项
ArgoZhang May 22, 2025
921b06c
refactor: 统一使用 btn-browser 作为上传按钮
ArgoZhang May 22, 2025
c44c02c
feat: 调整禁用样式
ArgoZhang May 22, 2025
0dd8fda
refactor: 更新禁用样式位置
ArgoZhang May 23, 2025
5639bd0
doc: 更新示例
ArgoZhang May 23, 2025
f42d4ac
Merge branch 'main' into feat-upload
ArgoZhang May 23, 2025
d18973c
refactor: 新建预览组件准备复用
ArgoZhang May 23, 2025
fc8cb32
doc: 更新示例
ArgoZhang May 23, 2025
2d0d195
chore: 更新字典
ArgoZhang May 23, 2025
88a2bd9
refactor: 更新示例
ArgoZhang May 23, 2025
32218eb
refactor: 更新示例
ArgoZhang May 23, 2025
7e719ed
doc: 精简本地化资源
ArgoZhang May 23, 2025
918c778
Merge branch 'main' into feat-upload
ArgoZhang May 23, 2025
11a2d76
refactor: 使用 Files 属性提高性能
ArgoZhang May 23, 2025
0aaa130
doc: 更新示例
ArgoZhang May 24, 2025
37a2168
refactor: 调整已上传列表逻辑
ArgoZhang May 24, 2025
b482895
test: 更新 ButtonUpload 单元测试
ArgoZhang May 24, 2025
1d713bc
refactor: 拆分 ShowAddButton 方法
ArgoZhang May 24, 2025
f4c38e8
test: 更新单元测试
ArgoZhang May 24, 2025
128cfcd
refactor: 复用 CanUpload 方法
ArgoZhang May 24, 2025
22c413e
test: 更新单元测试
ArgoZhang May 24, 2025
276ca59
test: 更新单元测试
ArgoZhang May 24, 2025
d0ebb00
test: 更新单元测试
ArgoZhang May 24, 2025
b4eba4c
Merge branch 'main' into feat-upload
ArgoZhang May 25, 2025
b8fe562
refactor: 更新 InputUpload 组件
ArgoZhang May 25, 2025
7f97d7a
test: 增加单元测试
ArgoZhang May 25, 2025
431cc1b
test: 更新单元测试
ArgoZhang May 25, 2025
4b0ff0e
test: UploadDrop 增加 OnCancel 单元测试
ArgoZhang May 25, 2025
6b47ea9
refactor: 代码重构增加基类
ArgoZhang May 25, 2025
2f6cfe6
refactor: 更新逻辑
ArgoZhang May 25, 2025
97716a7
refactor: 精简代码
ArgoZhang May 25, 2025
f7f2a4a
refactor: 移除 ShowDeleteButton 参数
ArgoZhang May 25, 2025
7ee88fb
refactor: 减少冗余参数
ArgoZhang May 25, 2025
4c9f1aa
test: 增加 AllowExtensions 单元测试
ArgoZhang May 25, 2025
1703c2f
test: 增加 IsImage 扩展方法单元测试
ArgoZhang May 25, 2025
bd806a1
test: 更新单元测试
ArgoZhang May 25, 2025
a63da1a
test: 更新单元测试
ArgoZhang May 26, 2025
6b6f212
Merge branch 'main' into feat-upload
ArgoZhang May 27, 2025
18f273d
refactor: 更新 Reset 方法逻辑
ArgoZhang May 27, 2025
8c7060a
refactor: 更新 MaxFileCount 逻辑
ArgoZhang May 27, 2025
80e65ea
refactor: 更新 MaxFileCount 逻辑
ArgoZhang May 27, 2025
9bc11e0
test: 增加删除按钮单元测试
ArgoZhang May 27, 2025
02f5599
test: 增加 FileValidationAttribute 单元测试
ArgoZhang May 27, 2025
421e3b9
Merge branch 'main' into feat-upload
ArgoZhang May 27, 2025
3a302ae
Merge branch 'main' into feat-upload
ArgoZhang May 28, 2025
01ce5c9
refactor: 精简代码
ArgoZhang May 28, 2025
1d07fe3
refactor: 更改本地化描述文本
ArgoZhang May 28, 2025
50a9306
refactor: 更改 Footer 位置
ArgoZhang May 28, 2025
15c397a
refactor(Tooltip): 精简代码
ArgoZhang May 28, 2025
5491435
Merge branch 'main' into feat-upload
ArgoZhang May 28, 2025
9e44f70
refactor: 更新 MaxFileCount 逻辑
ArgoZhang May 28, 2025
35f8b1d
style: 增加样式
ArgoZhang May 28, 2025
2558663
feat: 更新拖动上传脚本
ArgoZhang May 28, 2025
d5af109
refactor: 更新禁用状态逻辑
ArgoZhang May 28, 2025
2f97d10
refactor: 更正合法状态图标
ArgoZhang May 28, 2025
3c27636
refactor: 移除 DropFooterText 本地化
ArgoZhang May 28, 2025
bb99f8e
test: 更新 MaxFileCount 单元测试
ArgoZhang May 28, 2025
854013c
test: 更新 FooterText 单元测试
ArgoZhang May 28, 2025
352da6b
test: 更新 MaxFileCount 溢出逻辑单元测试
ArgoZhang May 28, 2025
844230e
refactor: 更新 avatar 组件验证逻辑
ArgoZhang May 28, 2025
78382e0
style: 调整样式
ArgoZhang May 28, 2025
50b20cf
feat: 增加上传组件数据合规检查逻辑
ArgoZhang May 28, 2025
ecaf0bf
refactor: 更改数据合规检查结果集合
ArgoZhang May 28, 2025
82e416f
refactor: 更新客户端提示逻辑
ArgoZhang May 28, 2025
954dd32
refactor: ToggleMessage 方法更改为 Task
ArgoZhang May 29, 2025
1e99c95
refactor: 增加 await 关键字
ArgoZhang May 29, 2025
f082546
refactor: 增加 TriggerOnChanged 方法
ArgoZhang May 29, 2025
f77b3e9
fix(SelectGeneric): 修复 body 丢失高度问题
ArgoZhang May 29, 2025
66767c7
Merge branch 'main' into feat-upload
ArgoZhang May 29, 2025
f7a3b5c
refactor: 消除合并错误
ArgoZhang May 29, 2025
bdcb57e
doc: 更新示例
ArgoZhang May 29, 2025
5c1b475
feat: 增加对 Upload 组件支持
ArgoZhang May 29, 2025
f493b49
feat: 支持多文件格式检查功能
ArgoZhang May 29, 2025
8ea6535
test: 更新单元测试
ArgoZhang May 29, 2025
1dcbe29
refactor: 移除内部变量 IsValid 私有字段
ArgoZhang May 29, 2025
7650609
refactor: 弃用 FileCount 参数
ArgoZhang May 29, 2025
0f6b20a
Revert "refactor: 弃用 FileCount 参数"
ArgoZhang May 29, 2025
2d78e1a
refactor: 修复数据合规检查逻辑错误
ArgoZhang May 29, 2025
cfa692f
refactor: 更改脚本方法名称
ArgoZhang May 29, 2025
c16c4d9
test: 增加单元测试覆盖率
ArgoZhang May 29, 2025
2eeac0c
feat: 增加 AllowExtensions 参数
ArgoZhang May 29, 2025
3400a5d
test: 增加单元测试
ArgoZhang May 29, 2025
478ad07
test: 增加单元测试
ArgoZhang May 29, 2025
20bebc4
Merge branch 'main' into feat-upload
ArgoZhang May 30, 2025
91b5efb
Merge branch 'main' into feat-upload
ArgoZhang Jun 1, 2025
925c5e2
Merge branch 'main' into feat-upload
ArgoZhang Jun 2, 2025
0c334a8
Merge branch 'main' into feat-upload
ArgoZhang Jun 5, 2025
c8d3901
Merge branch 'main' into feat-upload
ArgoZhang Jun 5, 2025
272ce3e
Merge branch 'main' into feat-upload
ArgoZhang Jun 5, 2025
65b744d
doc: 更新示例
ArgoZhang Jun 5, 2025
9d18b75
chore: bump version 9.7.1-beta04
ArgoZhang Jun 5, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,4 @@ jobs:

- name: Check Localizer
run: |
dotnet test test/UnitTestLocalization
dotnet test test/UnitTest.Localization
2 changes: 2 additions & 0 deletions exclusion.dic
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,5 @@ inputmode
Totp
otpauth
Hotp
univer
rdkit
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
<div class="d-flex">
<div class="flex-fill">
<p>一套基于 <b>Bootstrap</b> 样式的企业级 <b>Blazor UI</b> 组件库,支持 Server 与 WebAssembly</p>
<p>适配移动端支持各种主流浏览器以及移动端,适配 <b>ABP</b>,同时支持 <b>NET6/NET7/NET8</b></p>
<p>适配移动端支持各种主流浏览器以及移动端,适配 <b>ABP</b>,同时支持 <b>NET6/NET7/NET8/NET9</b></p>
<p></p>
<div>已提供项目模板方便快速上手 <a class="connection-link" href="@TemplateUrl" target="_blank">项目模板</a></div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/BootstrapBlazor.Server/Components/Samples/Inputs.razor
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@

<DemoBlock Title="@Localizer["ClearableTitle"]"
Introduction="@Localizer["ClearableIntro"]"
Name="OnInput">
Name="IsClearable">
<div class="row g-3">
<div class="col-12 col-sm-6">
<BootstrapInput Value="Model.Name" IsClearable="true" ShowLabel="true" DisplayText="Clearable" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
<div class="d-flex">
<div class="flex-fill">
<p>基于 <b>Bootstrap</b> 样式的 <b>Blazor UI</b> 组件库</p>
<p>适配移动端支持各种主流浏览器,适配 <b>ABP</b>,同时支持 <b>NET6/NET7/NET8</b>,交流群 <b>795206915</b></p>
<p>适配移动端支持各种主流浏览器,适配 <b>ABP</b>,同时支持 <b>NET6/NET7/NET8/NET9</b>,交流群 <b>795206915</b></p>
<p>已提供项目模板方便快速上手 <a class="connection-link" href="@TemplateUrl">项目模板</a></p>
</div>
<div class="connection-body-tail d-none d-sm-block"></div>
Expand Down Expand Up @@ -126,7 +126,7 @@
&lt;div class="d-flex"&gt;
&lt;div class="flex-fill"&gt;
&lt;div class="mb-2"&gt;基于 &lt;b&gt;Bootstrap&lt;/b&gt; 样式的 &lt;b&gt;Blazor UI&lt;/b&gt; 组件库&lt;/div&gt;
&lt;div class="mb-2"&gt;适配移动端支持各种主流浏览器,适配 &lt;b&gt;ABP&lt;/b&gt;,同时支持 &lt;b&gt;NET6/NET7/NET8&lt;/b&gt;,交流群 &lt;b&gt;795206915&lt;/b&gt;&lt;/div&gt;
&lt;div class="mb-2"&gt;适配移动端支持各种主流浏览器,适配 &lt;b&gt;ABP&lt;/b&gt;,同时支持 &lt;b&gt;NET6/NET7/NET8/NET9&lt;/b&gt;,交流群 &lt;b&gt;795206915&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;已提供项目模板方便快速上手 &lt;a class="connection-link" href="@TemplateUrl"&gt;项目模板&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="connection-body-tail d-none d-sm-block"&gt;&lt;/div&gt;
Expand Down Expand Up @@ -187,7 +187,7 @@
&lt;div class="d-flex"&gt;
&lt;div class="flex-fill"&gt;
&lt;div class="mb-2"&gt;基于 &lt;b&gt;Bootstrap&lt;/b&gt; 样式的 &lt;b&gt;Blazor UI&lt;/b&gt; 组件库&lt;/div&gt;
&lt;div class="mb-2"&gt;适配移动端支持各种主流浏览器,适配 &lt;b&gt;ABP&lt;/b&gt;,同时支持 &lt;b&gt;NET6/NET7/NET8&lt;/b&gt;,交流群 &lt;b&gt;795206915&lt;/b&gt;&lt;/div&gt;
&lt;div class="mb-2"&gt;适配移动端支持各种主流浏览器,适配 &lt;b&gt;ABP&lt;/b&gt;,同时支持 &lt;b&gt;NET6/NET7/NET8/NET9&lt;/b&gt;,交流群 &lt;b&gt;795206915&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;已提供项目模板方便快速上手 &lt;a class="connection-link" href="@TemplateUrl"&gt;项目模板&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="connection-body-tail d-none d-sm-block"&gt;&lt;/div&gt;
Expand Down Expand Up @@ -248,7 +248,7 @@
&lt;div class="d-flex"&gt;
&lt;div class="flex-fill"&gt;
&lt;div class="mb-2"&gt;基于 &lt;b&gt;Bootstrap&lt;/b&gt; 样式的 &lt;b&gt;Blazor UI&lt;/b&gt; 组件库&lt;/div&gt;
&lt;div class="mb-2"&gt;适配移动端支持各种主流浏览器,适配 &lt;b&gt;ABP&lt;/b&gt;,同时支持 &lt;b&gt;NET6/NET7/NET8&lt;/b&gt;,交流群 &lt;b&gt;795206915&lt;/b&gt;&lt;/div&gt;
&lt;div class="mb-2"&gt;适配移动端支持各种主流浏览器,适配 &lt;b&gt;ABP&lt;/b&gt;,同时支持 &lt;b&gt;NET6/NET7/NET8/NET9&lt;/b&gt;,交流群 &lt;b&gt;795206915&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;已提供项目模板方便快速上手 &lt;a class="connection-link" href="@TemplateUrl"&gt;项目模板&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="connection-body-tail d-none d-sm-block"&gt;&lt;/div&gt;
Expand Down
72 changes: 72 additions & 0 deletions src/BootstrapBlazor.Server/Components/Samples/UploadAvatars.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
@page "/upload-avatar"
@inject IOptionsMonitor<WebsiteOptions> WebsiteOption
@inject IStringLocalizer<UploadAvatars> Localizer
@inject ToastService ToastService

<h3>@Localizer["UploadsTitle"]</h3>

<h4>@Localizer["UploadsSubTitle"]</h4>

<p>@((MarkupString)Localizer["UploadsNote"].Value)</p>

<Pre class="no-highlight">builder.Services.Configure&lt;HubOptions&gt;(option => option.MaximumReceiveMessageSize = null);</Pre>

<DemoBlock Title="@Localizer["AvatarUploadTitle"]"
Introduction="@Localizer["AvatarUploadIntro"]"
Name="Normal">
<section ignore>
<div class="row g-3">
<div class="col-12 col-sm-6">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="IsMultiple"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_isMultiple"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-6">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="IsUploadButtonAtFirst"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_isUploadButtonAtFirst"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-6">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="IsCircle"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_isCircle"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-6">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="BorderRadius"></BootstrapInputGroupLabel>
<Slider @bind-Value="@_radius" Min="0" Max="49" UseInputEvent="true"></Slider>
</BootstrapInputGroup>
</div>
</div>
</section>
<AvatarUpload TValue="string" IsMultiple="@_isMultiple" IsCircle="@_isCircle" BorderRadius="@RadiusString"></AvatarUpload>
</DemoBlock>

<DemoBlock Title="@Localizer["AvatarUploadAcceptTitle"]"
Introduction="@Localizer["AvatarUploadAcceptIntro"]"
Name="Accept">
<AvatarUpload TValue="string" Accept="image/*" OnChange="@OnChange"></AvatarUpload>
</DemoBlock>

<DemoBlock Title="@Localizer["AvatarUploadValidateTitle"]"
Introduction="@Localizer["AvatarUploadValidateIntro"]"
Name="ValidateForm">
<ValidateForm Model="@_foo" OnValidSubmit="OnAvatarValidSubmit">
<div class="row g-3">
<div class="col-12">
<BootstrapInput @bind-Value="@_foo.Name"></BootstrapInput>
</div>
<div class="col-12">
<AvatarUpload @bind-Value="@_foo.Picture"></AvatarUpload>
</div>
<div class="col-12">
<Button ButtonType="@ButtonType.Submit" Text="@Localizer["AvatarUploadButtonText"]"></Button>
</div>
</div>
</ValidateForm>
</DemoBlock>

<AttributeTable Items="@GetAttributes()"></AttributeTable>
185 changes: 185 additions & 0 deletions src/BootstrapBlazor.Server/Components/Samples/UploadAvatars.razor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
// 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([email protected]) Website: https://www.blazor.zone

using Microsoft.AspNetCore.Components.Forms;

namespace BootstrapBlazor.Server.Components.Samples;

/// <summary>
/// AvatarUpload sample code
/// </summary>
public partial class UploadAvatars : IDisposable
{
private static readonly long MaxFileLength = 5 * 1024 * 1024;
private CancellationTokenSource? _token;
private readonly List<UploadFile> _previewFileList = [];
private readonly Person _foo = new();
private bool _isMultiple = true;
private bool _isUploadButtonAtFirst;
private bool _isCircle;
private int _radius = 49;

private string? RadiusString => $"{_radius}px";

/// <summary>
/// <inheritdoc/>
/// </summary>
protected override void OnInitialized()
{
base.OnInitialized();

_previewFileList.AddRange(
[
new UploadFile { PrevUrl = $"{WebsiteOption.CurrentValue.AssetRootPath}images/Argo.png" }
]);
}

private async Task OnChange(UploadFile file)
{
// 示例代码,使用 base64 格式
if (file is { File: not null })
{
var format = file.File.ContentType;
if (file.IsImage())
{
_token ??= new CancellationTokenSource();
if (_token.IsCancellationRequested)
{
_token.Dispose();
_token = new CancellationTokenSource();
}

await file.RequestBase64ImageFileAsync(format, 640, 480, MaxFileLength, _token.Token);
}
else
{
file.Code = 1;
file.Error = Localizer["UploadsFormatError"];
}

if (file.Code != 0)
{
await ToastService.Error(Localizer["UploadsAvatarMsg"], $"{file.Error} {format}");
}
}
}

private Task OnAvatarValidSubmit(EditContext context)
{
return Task.CompletedTask;
}

/// <summary>
/// <inheritdoc/>
/// </summary>
public void Dispose()
{
_token?.Cancel();
GC.SuppressFinalize(this);
}

private List<AttributeItem> GetAttributes() =>
[
new()
{
Name = "Width",
Description = Localizer["UploadsWidth"],
Type = "int",
ValueList = " — ",
DefaultValue = "0"
},
new()
{
Name = "Height",
Description = Localizer["UploadsHeight"],
Type = "int",
ValueList = " — ",
DefaultValue = " — "
},
new()
{
Name = "IsCircle",
Description = Localizer["UploadsIsCircle"],
Type = "bool",
ValueList = "true|false",
DefaultValue = "false"
},
new()
{
Name = "BorderRadius",
Description = Localizer["UploadsBorderRadius"],
Type = "string?",
ValueList = " — ",
DefaultValue = " — "
},
new()
{
Name = "IsDirectory",
Description = Localizer["UploadsIsDirectory"],
Type = "bool",
ValueList = "true|false",
DefaultValue = "false"
},
new()
{
Name = "IsMultiple",
Description = Localizer["UploadsIsMultiple"],
Type = "bool",
ValueList = "true|false",
DefaultValue = "false"
},
new()
{
Name = "ShowProgress",
Description = Localizer["UploadsShowProgress"],
Type = "bool",
ValueList = "true|false",
DefaultValue = "false"
},
new()
{
Name = "Accept",
Description = Localizer["UploadsAccept"],
Type = "string",
ValueList = " — ",
DefaultValue = " — "
},
new()
{
Name = "DefaultFileList",
Description = Localizer["UploadsDefaultFileList"],
Type = "List<UploadFile>",
ValueList = " — ",
DefaultValue = " — "
},
new()
{
Name = "OnDelete",
Description = Localizer["UploadsOnDelete"],
Type = "Func<string, Task<bool>>",
ValueList = " — ",
DefaultValue = " — "
},
new()
{
Name = "OnChange",
Description = Localizer["UploadsOnChange"],
Type = "Func<UploadFile, Task>",
ValueList = " — ",
DefaultValue = " — "
}
];

class Person
{
[Required]
[StringLength(20, MinimumLength = 2)]
public string Name { get; set; } = "Blazor";

[Required]
[FileValidation(Extensions = [".png", ".jpg", ".jpeg"], FileSize = 5 * 1024 * 1024)]
public IBrowserFile? Picture { get; set; }
}
}
63 changes: 63 additions & 0 deletions src/BootstrapBlazor.Server/Components/Samples/UploadButtons.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
@page "/upload-button"
@inject IOptionsMonitor<WebsiteOptions> WebsiteOption
@inject IStringLocalizer<UploadButtons> Localizer
@inject ToastService ToastService

<h3>@Localizer["UploadsTitle"]</h3>

<h4>@Localizer["UploadsSubTitle"]</h4>

<p>@((MarkupString)Localizer["UploadsNote"].Value)</p>

<Pre class="no-highlight">builder.Services.Configure&lt;HubOptions&gt;(option => option.MaximumReceiveMessageSize = null);</Pre>

<DemoBlock Title="@Localizer["ButtonUploadTitle"]"
Introduction="@Localizer["ButtonUploadIntro"]"
Name="Normal">
<section ignore>
<div class="row g-3">
<div class="col-12 col-sm-4">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="IsDisabled"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_isDisabled"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-4">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="IsMultiple"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_isMultiple"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-4">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="IsDirectory"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_isDirectory"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-4">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="ShowProgress"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_showProgress"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-4">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="ShowUploadFileList"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_showUploadFileList"></Switch>
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-4">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="ShowDownloadButton"></BootstrapInputGroupLabel>
<Switch @bind-Value="@_showDownloadButton"></Switch>
</BootstrapInputGroup>
</div>
</div>
</section>
<ButtonUpload TValue="string" IsMultiple="@_isMultiple" IsDirectory="@_isDirectory" IsDisabled="@_isDisabled"
ShowProgress="@_showProgress"
ShowUploadFileList="@_showUploadFileList" ShowDownloadButton="@_showDownloadButton"
OnChange="@OnClickToUpload"></ButtonUpload>
</DemoBlock>

<AttributeTable Items="@GetAttributes()"></AttributeTable>
Loading
Loading