Skip to content

Commit 3df4dec

Browse files
authored
Dotnetconf samples (#33)
* Basic example tests * Add missing MarkupMatches overload * Added docs to MockHttp extensions * dotnet conf samples
1 parent 7464e49 commit 3df4dec

23 files changed

+823
-10
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,4 @@ ASALocalRun/
328328

329329
# MFractors (Xamarin productivity tool) working folder
330330
.mfractor/
331+
*.playlist

sample/src/Components/Alert.razor

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
@inject IJSRuntime jsRuntime
2+
3+
@if (IsVisible)
4+
{
5+
<div role="alert" @attributes="AdditionalAttributes" class=@CssClass>
6+
@if (Header is { })
7+
{
8+
<h4 class="alert-heading">@Localizer[Header]</h4>
9+
}
10+
<div class="alert-content">
11+
@ChildContent
12+
</div>
13+
<button @onclick="DismissClicked" type="button" class="close" aria-label="Close">
14+
<span aria-hidden="true">&times;</span>
15+
</button>
16+
</div>
17+
}
18+
19+
@code {
20+
private const string DefaultCssClass = "alert alert-info alert-dismissible fade";
21+
22+
private string ShowCssClass => Dismissing ? "" : "show";
23+
private string CssClass => AdditionalAttributes?.ContainsKey("class") ?? false
24+
? $"{DefaultCssClass} {AdditionalAttributes["class"]} {ShowCssClass}"
25+
: $"{DefaultCssClass} {ShowCssClass}";
26+
27+
private bool Dismissing { get; set; }
28+
29+
[CascadingParameter]
30+
private Localizer Localizer { get; set; } = Localizer.Empty;
31+
32+
[Parameter(CaptureUnmatchedValues = true)]
33+
public IReadOnlyDictionary<string, object>? AdditionalAttributes { get; set; }
34+
35+
[Parameter]
36+
public string? Header { get; set; }
37+
38+
[Parameter]
39+
public RenderFragment? ChildContent { get; set; }
40+
41+
[Parameter]
42+
public EventCallback<DismissingEventArgs> OnDismissing { get; set; }
43+
44+
[Parameter]
45+
public EventCallback<Alert> OnDismissed { get; set; }
46+
47+
public bool IsVisible { get; private set; } = true;
48+
49+
public async Task Dismiss()
50+
{
51+
await DismissClicked();
52+
await InvokeAsync(StateHasChanged);
53+
}
54+
55+
private async Task DismissClicked()
56+
{
57+
var dismissingArgs = new DismissingEventArgs(this);
58+
59+
await OnDismissing.InvokeAsync(dismissingArgs);
60+
61+
if (dismissingArgs.Cancel)
62+
return;
63+
64+
Dismissing = true;
65+
66+
await jsRuntime.InvokeVoidAsync("window.transitionFinished");
67+
68+
Dismissing = false;
69+
IsVisible = false;
70+
71+
await OnDismissed.InvokeAsync(this);
72+
}
73+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace Egil.RazorComponents.Testing.SampleApp.Components
8+
{
9+
public class DismissingEventArgs
10+
{
11+
public Alert Sender { get; }
12+
13+
public bool Cancel { get; set; }
14+
15+
public DismissingEventArgs(Alert sender)
16+
{
17+
Sender = sender;
18+
}
19+
}
20+
}

sample/src/Components/Paragraph.razor

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@if(ChildContent is { })
2+
{
3+
<p class=@CssClass>
4+
@ChildContent
5+
</p>
6+
}
7+
@code{
8+
private string CssClass => IsLast ? "mb-0" : string.Empty;
9+
10+
[Parameter]
11+
public bool IsLast { get; set; }
12+
13+
[Parameter]
14+
public RenderFragment? ChildContent { get; set; }
15+
}

sample/src/Components/WikiSearch.razor

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
@inject IJSRuntime jsRuntime
22

3-
<p>@searchResult</p>
3+
<pre class="pre-scrollable w-50">@searchResult</pre>
44

55
@code {
66
string searchResult = string.Empty;

sample/src/Data/Localizer.cs

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Threading.Tasks;
5+
using Microsoft.AspNetCore.Components;
6+
7+
namespace Egil.RazorComponents.Testing.SampleApp.Data
8+
{
9+
public class Localizer
10+
{
11+
private readonly Dictionary<string, string> _localizations
12+
= new Dictionary<string, string>();
13+
14+
public string CultureCode { get; set; } = "en";
15+
16+
public string this[string key]
17+
{
18+
get => _localizations.TryGetValue(key, out var localized)
19+
? localized
20+
: key;
21+
}
22+
23+
public void Add(string key, string text)
24+
{
25+
_localizations.Add(key, text);
26+
}
27+
28+
public static Localizer Empty { get; } = new Localizer();
29+
}
30+
}

sample/src/Pages/DotNetConf.razor

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@page "/dotnetconf"
2+
3+
<Alert Header="It is time to focus on Blazor"
4+
OnDismissing="DissingAlert"
5+
OnDismissed="DismissedAlert"
6+
@ref="alert">
7+
<p class="mb-0">.NET Conf: Focus on Blazor is a free, one-day livestream event that features speakers from the community and .NET product teams that are working on building web apps with C# and Blazor. You don't need to use JavaScript anymore with Blazor technology! Blazor lets you build interactive web UIs using C# instead of JavaScript.</p>
8+
</Alert>
9+
10+
<h1>Hello .NET Conf</h1>
11+
<p><button @onclick="_ => alert?.Dismiss()" class="btn btn-primary">Dismiss alert</button></p>
12+
<h3>Alert status:</h3>
13+
<ol>
14+
@foreach (var msg in dismissMessages)
15+
{
16+
<li class="h4">@msg</li>
17+
}
18+
</ol>
19+
20+
@code {
21+
Alert? alert;
22+
private List<string> dismissMessages = new List<string>();
23+
24+
private void DissingAlert(DismissingEventArgs dismissingEvent)
25+
{
26+
dismissMessages.Add($"Alert Dismissing");
27+
}
28+
29+
private void DismissedAlert(Alert dismissedAlert)
30+
{
31+
dismissMessages.Add($"Alert Dismissed");
32+
}
33+
}

sample/src/Pages/_Host.cshtml

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@
2323
return fetch('https://en.wikipedia.org/w/api.php?origin=*&action=opensearch&search=' + query)
2424
.then(x => x.text());
2525
}
26+
27+
function transitionFinished() {
28+
return new Promise(function (resolve, reject) {
29+
setTimeout(resolve, 1000);
30+
});
31+
}
2632
</script>
2733
</body>
2834
</html>

sample/src/Shared/NavMenu.razor

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
<span class="oi oi-circle-check" aria-hidden="true"></span> Todos
2828
</NavLink>
2929
</li>
30+
<li class="nav-item px-3">
31+
<NavLink class="nav-link" href="dotnetconf">
32+
<span class="oi oi-eye" aria-hidden="true"></span> Alert example
33+
</NavLink>
34+
</li>
3035
</ul>
3136
</div>
3237

0 commit comments

Comments
 (0)