Skip to content

Commit 6da1628

Browse files
authored
feat(Message): support ChildContent parameter (dotnetcore#2904)
* feat: 支持 ChildContent 自定义模板 * doc: 更新自定义模板示例 * test: 更新单元测试
1 parent 4bd3bcc commit 6da1628

File tree

8 files changed

+113
-24
lines changed

8 files changed

+113
-24
lines changed

src/BootstrapBlazor.Server/Components/Samples/Messages.razor

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ private MessageService? MessageService { get; set; }
7676
<Message @ref="Message1" Placement="Placement.Bottom" />
7777
</DemoBlock>
7878

79+
<DemoBlock Title="@Localizer["MessagesTemplateTitle"]"
80+
Introduction="@Localizer["MessagesTemplateIntro"]"
81+
Name="Template">
82+
<button class="btn btn-primary" @onclick="@ShowTemplateMessage">@Localizer["MessagesTemplatePrompt"]</button>
83+
<Message @ref="Message1" Placement="Placement.Bottom" />
84+
</DemoBlock>
85+
7986
<AttributeTable Items="@GetAttributes()" />
8087

8188
<AttributeTable Title="@Localizer["MessagesItem"]" Items="@GetMessageItemAttributes()" />
89+
90+
@code {
91+
private RenderFragment RenderContent =>
92+
@<div class="message-custom">
93+
<p class="text-primary">Message Header</p>
94+
<p>Message Body</p>
95+
<div class="text-warning">Message Footer</div>
96+
</div>;
97+
}

src/BootstrapBlazor.Server/Components/Samples/Messages.razor.cs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@ await MessageService.Show(new MessageOption()
7777
}, Message1);
7878
}
7979

80+
private async Task ShowTemplateMessage()
81+
{
82+
await MessageService.Show(new MessageOption()
83+
{
84+
Icon = "fa-solid fa-circle-info",
85+
ChildContent = RenderContent
86+
});
87+
}
88+
8089
private static AttributeItem[] GetAttributes() =>
8190
[
8291
new()
@@ -104,14 +113,6 @@ private static AttributeItem[] GetMessageItemAttributes() =>
104113
DefaultValue = " — "
105114
},
106115
new()
107-
{
108-
Name = "Class",
109-
Description = "Style",
110-
Type = "string",
111-
ValueList = " — ",
112-
DefaultValue = " — "
113-
},
114-
new()
115116
{
116117
Name = "Color",
117118
Description = "Color",
@@ -142,6 +143,30 @@ private static AttributeItem[] GetMessageItemAttributes() =>
142143
Type = "bool",
143144
ValueList = "true|false",
144145
DefaultValue = "false"
146+
},
147+
new()
148+
{
149+
Name = "ShowShadow",
150+
Description = "Whether to show the shadow",
151+
Type = "bool",
152+
ValueList = "true|false",
153+
DefaultValue = "false"
154+
},
155+
new()
156+
{
157+
Name = "ShowBorder",
158+
Description = "Whether to show the border",
159+
Type = "bool",
160+
ValueList = "true|false",
161+
DefaultValue = "false"
162+
},
163+
new()
164+
{
165+
Name = "OnDismiss",
166+
Description = "The callback when click close button",
167+
Type = "Func<Task>",
168+
ValueList = " — ",
169+
DefaultValue = " — "
145170
}
146171
];
147172
}

src/BootstrapBlazor.Server/Locales/en-US.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,10 @@
468468
"MessagesDifferentColorSecondary": "Secondary message",
469469
"MessagesPositionTitle": "message box pop-up location",
470470
"MessagesPositionIntro": "Specify the <code>Message</code> component that has set the bottom display position by setting the component parameter of the <code>MessageService</code> service",
471-
"MessagesItem": "MessageItem property"
471+
"MessagesItem": "MessageOption property",
472+
"MessagesTemplateTitle": "Custom template",
473+
"MessagesTemplateIntro": "By setting the <code>ChildContent</code> template, rich custom styles and content prompt information can be achieved",
474+
"MessagesTemplatePrompt": "Custom message"
472475
},
473476
"BootstrapBlazor.Server.Components.Samples.Lights": {
474477
"LightsTitle": "Light indicator",

src/BootstrapBlazor.Server/Locales/zh-CN.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,10 @@
468468
"MessagesDifferentColorSecondary": "Secondary 消息",
469469
"MessagesPositionTitle": "消息框弹出位置",
470470
"MessagesPositionIntro": "通过设置 <code>MessageService</code> 服务的组件参数,指定已经设置底部显示位置的 <code>Message</code> 组件",
471-
"MessagesItem": "MessageItem 属性"
471+
"MessagesItem": "MessageOption 属性",
472+
"MessagesTemplateTitle": "自定义模板",
473+
"MessagesTemplateIntro": "通过设置 <code>ChildContent</code> 模板可以实现丰富的自定义样式与内容的提示信息",
474+
"MessagesTemplatePrompt": "自定义消息"
472475
},
473476
"BootstrapBlazor.Server.Components.Samples.Lights": {
474477
"LightsTitle": "Light 指示灯",

src/BootstrapBlazor/Components/Message/Message.razor

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@
1212
{
1313
<i class="@item.Icon"></i>
1414
}
15-
<span>@item.Content</span>
15+
<div>
16+
@if (item.ChildContent != null)
17+
{
18+
@item.ChildContent
19+
}
20+
else
21+
{
22+
@item.Content
23+
}
24+
</div>
1625
@if (item.ShowDismiss)
1726
{
1827
<button type="button" class="btn-close" aria-label="close"></button>
@@ -30,7 +39,16 @@
3039
{
3140
<i class="@item.Icon"></i>
3241
}
33-
<span>@item.Content</span>
42+
<div>
43+
@if (item.ChildContent != null)
44+
{
45+
@item.ChildContent
46+
}
47+
else
48+
{
49+
@item.Content
50+
}
51+
</div>
3452
@if (item.ShowDismiss)
3553
{
3654
<button type="button" class="btn-close" aria-label="close"></button>
Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
.message {
1+
.message {
22
position: fixed;
33
left: 1rem;
44
right: 1rem;
55
z-index: 1090;
66
pointer-events: none;
7-
}
87

9-
.message .alert {
8+
.alert {
109
display: flex;
1110
align-items: baseline;
1211
min-width: 160px;
@@ -18,30 +17,31 @@
1817
margin: 1rem auto 0 auto;
1918
transition: opacity .3s linear, top .3s linear, bottom .3s linear;
2019
pointer-events: auto;
21-
}
2220

23-
.message .alert.show {
21+
&.show {
2422
opacity: 1;
2523
bottom: unset;
2624
top: 20px;
2725
}
2826

29-
.message .alert > i + span {
27+
> i + div {
3028
margin-left: .5rem;
3129
}
3230

33-
.message .alert > span {
31+
> div {
3432
flex: 1;
3533
flex-wrap: wrap;
3634
word-break: break-all;
3735
}
36+
}
3837

39-
.message.is-bottom .alert {
38+
&.is-bottom .alert {
4039
top: unset;
4140
bottom: -20px;
4241
}
4342

44-
.message.is-bottom .alert.show {
45-
top: unset;
46-
bottom: 20px;
47-
}
43+
&.is-bottom .alert.show {
44+
top: unset;
45+
bottom: 20px;
46+
}
47+
}

src/BootstrapBlazor/Components/Message/MessageOption.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ public class MessageOption : PopupOptionBase
4343
/// 获得/设置 关闭当前 MessageItem 回调委托 默认 null
4444
/// </summary>
4545
public Func<Task>? OnDismiss { get; set; }
46+
47+
/// <summary>
48+
/// 获得/设置 内容模板 默认 null 设置此参数后 <see cref="PopupOptionBase.Content"/> 将失效
49+
/// </summary>
50+
public RenderFragment? ChildContent { get; set; }
4651
}

test/UnitTest/Components/MessageTest.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,5 +97,24 @@ await cut.InvokeAsync(() => service.Show(new MessageOption()
9797

9898
await cut.Instance.Dismiss(alert.Id);
9999
await cut.Instance.Dismiss("test_id");
100+
await cut.InvokeAsync(() => cut.Instance.Clear());
101+
102+
await cut.InvokeAsync(() => service.Show(new MessageOption()
103+
{
104+
ChildContent = builder => builder.AddContent(0, new MarkupString("<div class=\"custom-message-template\">Custom Message</div>"))
105+
}, cut.Instance));
106+
Assert.Contains("<div class=\"custom-message-template\">Custom Message</div>", cut.Markup);
107+
}
108+
109+
[Fact]
110+
public async Task ChildContent_Ok()
111+
{
112+
var service = Context.Services.GetRequiredService<MessageService>();
113+
var cut = Context.RenderComponent<Message>();
114+
await cut.InvokeAsync(() => service.Show(new MessageOption()
115+
{
116+
ChildContent = builder => builder.AddContent(0, new MarkupString("<div class=\"custom-message-template\">Custom Message</div>"))
117+
}, cut.Instance));
118+
Assert.Contains("<div class=\"custom-message-template\">Custom Message</div>", cut.Markup);
100119
}
101120
}

0 commit comments

Comments
 (0)