|
| 1 | +using Microsoft.JSInterop; |
| 2 | + |
| 3 | +namespace TDesign; |
| 4 | +partial class TUpload |
| 5 | +{ |
| 6 | + void BuildFile(RenderTreeBuilder builder) |
| 7 | + { |
| 8 | + if ( !new[] { UploadTheme.File, UploadTheme.FileInput }.Contains(Theme) ) |
| 9 | + { |
| 10 | + return; |
| 11 | + } |
| 12 | + |
| 13 | + builder.Div("t-upload__single") |
| 14 | + .Class($"t-upload__{Theme.GetCssClass()}") |
| 15 | + .Content(content => |
| 16 | + { |
| 17 | + if ( Theme == UploadTheme.FileInput ) |
| 18 | + { |
| 19 | + |
| 20 | + } |
| 21 | + |
| 22 | + BuildTrigger(content); |
| 23 | + BuildDisplayText(content); |
| 24 | + }) |
| 25 | + .Close(); |
| 26 | + |
| 27 | + } |
| 28 | + |
| 29 | + void BuildTrigger(RenderTreeBuilder builder) |
| 30 | + { |
| 31 | + builder.Div("t-upload__trigger") |
| 32 | + .Content(button => |
| 33 | + { |
| 34 | + button.Component<TButton>() |
| 35 | + .Attribute(m => m.Theme, ButtonTheme) |
| 36 | + .Attribute(m => m.Icon, ButtonIcon) |
| 37 | + .Attribute(m => m.Disabled, Disabled) |
| 38 | + .Attribute(m => m.OnClick, HtmlHelper.Instance.Callback().Create<MouseEventArgs>(this, async e => |
| 39 | + { |
| 40 | + await _uploadJSModule.Module.InvokeVoidAsync("upload.showDialog", RefInputFile, JSInvokeMethodFactory.Create<IReadOnlyList<UploadFileInfo>, Task>(SelectFiles)); |
| 41 | + })) |
| 42 | + .Content(Text) |
| 43 | + .Close(); |
| 44 | + }) |
| 45 | + .Close(); |
| 46 | + } |
| 47 | + |
| 48 | + /// <summary> |
| 49 | + /// 构建显示的文本。 |
| 50 | + /// </summary> |
| 51 | + /// <param name="builder"></param> |
| 52 | + void BuildDisplayText(RenderTreeBuilder builder) |
| 53 | + { |
| 54 | + if ( !_fileList.Any() ) |
| 55 | + { |
| 56 | + builder.Element("small", "t-upload__tips t-size-s", condition: Tip.IsNotNullOrEmpty()).Content(Tip).Close(); |
| 57 | + } |
| 58 | + |
| 59 | + builder.Content(FileListContent?.Invoke(_fileList)); |
| 60 | + } |
| 61 | + |
| 62 | + /// <summary> |
| 63 | + /// 默认的文件列表。 |
| 64 | + /// </summary> |
| 65 | + /// <param name="builder"></param> |
| 66 | + /// <param name="files"></param> |
| 67 | + void DefaultFileListContent(RenderTreeBuilder builder, IReadOnlyList<UploadFileInfo> files) |
| 68 | + { |
| 69 | + foreach ( var item in files ) |
| 70 | + { |
| 71 | + builder.Div("t-upload__single-display-text t-upload__display-text--margin") |
| 72 | + .Content(content => |
| 73 | + { |
| 74 | + if ( item.Status == UploadStatus.InProgress )//上传中 |
| 75 | + { |
| 76 | + BuildUploadingDisplayContent(content, item); |
| 77 | + } |
| 78 | + else |
| 79 | + { |
| 80 | + BuildUploadedDisplayContent(content, item); |
| 81 | + } |
| 82 | + }) |
| 83 | + .Close(); |
| 84 | + } |
| 85 | + } |
| 86 | + |
| 87 | + /// <summary> |
| 88 | + /// 上传中的显示 |
| 89 | + /// </summary> |
| 90 | + /// <param name="builder"></param> |
| 91 | + /// <param name="fileInfo">文件信息。</param> |
| 92 | + void BuildUploadingDisplayContent(RenderTreeBuilder builder, UploadFileInfo fileInfo) |
| 93 | + { |
| 94 | + builder.Span("t-upload__single-name").Content(fileInfo.Name).Close(); |
| 95 | + builder.Div("t-upload__single-progress") |
| 96 | + .Content(loader => |
| 97 | + { |
| 98 | + loader.Component<TLoading>().Attribute(m => m.Center, true).Close(); |
| 99 | + loader.Span("t-upload__single-percent").Content($"{fileInfo.Percent}%").Close(); |
| 100 | + }) |
| 101 | + .Close(); |
| 102 | + } |
| 103 | + |
| 104 | + /// <summary> |
| 105 | + /// 上传后的显示 |
| 106 | + /// </summary> |
| 107 | + /// <param name="builder"></param> |
| 108 | + /// <param name="fileInfo">文件信息。</param> |
| 109 | + void BuildUploadedDisplayContent(RenderTreeBuilder builder, UploadFileInfo fileInfo) |
| 110 | + { |
| 111 | + builder.Component<TLink>() |
| 112 | + .Attribute(m => m.Size, TDesign.Size.Small) |
| 113 | + .Attribute(m => m.Hover, LinkHover.Color) |
| 114 | + .Attribute(m => m.AdditionalClass, "t-upload__single-name") |
| 115 | + .Content(fileInfo.Name) |
| 116 | + .Close(); |
| 117 | + |
| 118 | + //状态图标 |
| 119 | + builder.Div("t-upload__flow-status").Content(status => |
| 120 | + { |
| 121 | + builder.Component<TIcon>(fileInfo.IsSucceed) |
| 122 | + .Attribute(m => m.Name, IconName.CheckCircleFilled) |
| 123 | + .Attribute(m => m.AdditionalClass, ICON_SUCCESS) |
| 124 | + .Close(); |
| 125 | + |
| 126 | + builder.Component<TIcon>(!fileInfo.IsSucceed) |
| 127 | + .Attribute(m => m.Name, IconName.InfoCircleFilled) |
| 128 | + .Attribute(m => m.AdditionalClass, ICON_FAILED) |
| 129 | + .Close(); |
| 130 | + }).Close(); |
| 131 | + |
| 132 | + builder.Component<TIcon>(!Disabled) |
| 133 | + .Attribute(m => m.Name, IconName.Close) |
| 134 | + .Attribute(m => m.AdditionalClass, "t-upload__icon-delete") |
| 135 | + .Callback("onclick", this, () => RemoveFile(fileInfo.Id)) |
| 136 | + .Close(); |
| 137 | + } |
| 138 | +} |
0 commit comments