Skip to content

Commit ccf8d19

Browse files
committed
refactor!: revamp Web UI
1 parent cf3b3c4 commit ccf8d19

File tree

89 files changed

+2397
-3436
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+2397
-3436
lines changed

samples/Rules.Framework.WebUI.Sample/Program.cs

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,22 @@ public static void Main(string[] args)
1111
var builder = WebApplication.CreateBuilder(args);
1212

1313
// Add services to the container.
14-
builder.Services.AddControllersWithViews();
14+
builder.Services.AddControllersWithViews()
15+
.AddRulesFrameworkWebUI(registrar =>
16+
{
17+
registrar.AddInstance("Readme example", (_, _) => new BasicRulesEngineExample().RulesEngine)
18+
.AddInstance("Random rules example", async (_, _) =>
19+
{
20+
var rulesProvider = new RulesEngineProvider(new RulesBuilder(new List<IRuleSpecificationsProvider>()
21+
{
22+
new RulesRandomFactory()
23+
}));
24+
25+
return await rulesProvider.GetRulesEngineAsync();
26+
});
27+
});
28+
29+
builder.Logging.SetMinimumLevel(LogLevel.Trace).AddConsole();
1530

1631
var app = builder.Build();
1732

@@ -24,43 +39,24 @@ public static void Main(string[] args)
2439
app.UseHsts();
2540
}
2641

27-
app.UseHttpsRedirection();
28-
2942
app.UseStaticFiles();
3043

3144
app.UseRouting();
3245

46+
app.UseAntiforgery();
47+
3348
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
3449

35-
AddRulesFrameworkUI(app, useReadmeExample: false);
50+
app.UseRulesFrameworkWebUI(opt =>
51+
{
52+
opt.DocumentTitle = "Sample rules";
53+
});
3654

3755
app.MapControllerRoute(
3856
name: "default",
3957
pattern: "{controller=Home}/{action=Index}/{id?}");
4058

4159
app.Run();
4260
}
43-
44-
private static void AddRulesFrameworkUI(IApplicationBuilder app, bool useReadmeExample = false)
45-
{
46-
if (useReadmeExample)
47-
{
48-
app.UseRulesFrameworkWebUI(new BasicRulesEngineExample().RulesEngine);
49-
50-
return;
51-
}
52-
53-
var rulesProvider = new RulesEngineProvider(new RulesBuilder(new List<IRuleSpecificationsProvider>()
54-
{
55-
new RulesRandomFactory()
56-
}));
57-
58-
var rulesEngine = rulesProvider
59-
.GetRulesEngineAsync()
60-
.GetAwaiter()
61-
.GetResult();
62-
63-
app.UseRulesFrameworkWebUI(rulesEngine);
64-
}
6561
}
6662
}

samples/Rules.Framework.WebUI.Sample/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"commandName": "Project",
1313
"dotnetRunMessages": true,
1414
"launchBrowser": true,
15-
"launchUrl": "rules/index.html",
15+
"launchUrl": "rules-ui/instance-selection",
1616
"applicationUrl": "http://localhost:5000",
1717
"environmentVariables": {
1818
"ASPNETCORE_ENVIRONMENT": "Development"

samples/Rules.Framework.WebUI.Sample/ReadmeExample/BasicRulesEngineExample.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ namespace Rules.Framework.WebUI.Sample.ReadmeExample
22
{
33
using System;
44
using global::Rules.Framework.WebUI.Sample.Engine;
5-
using global::Rules.Framework.WebUI.Sample.Enums;
65

76
internal class BasicRulesEngineExample
87
{
@@ -35,7 +34,7 @@ protected void AddRules(IEnumerable<RuleSpecificationBase<BasicRulesetNames, Bas
3534

3635
protected void CreateRulesets()
3736
{
38-
foreach (var rulesetName in Enum.GetValues<RulesetNames>())
37+
foreach (var rulesetName in Enum.GetValues<BasicRulesetNames>())
3938
{
4039
this.RulesEngine.CreateRulesetAsync(rulesetName.ToString())
4140
.GetAwaiter()

samples/Rules.Framework.WebUI.Sample/Rules.Framework.WebUI.Sample.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Web">
22

33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
4+
<TargetFramework>net8.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<ImplicitUsings>enable</ImplicitUsings>
77
</PropertyGroup>
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
{
2-
"Logging": {
3-
"LogLevel": {
4-
"Default": "Information",
5-
"Microsoft.AspNetCore": "Warning"
2+
"DetailedErrors": true,
3+
"Logging": {
4+
"LogLevel": {
5+
"Default": "Information",
6+
"Microsoft.AspNetCore": "Warning"
7+
}
68
}
7-
}
8-
}
9+
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
html, body {
2+
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
3+
}
4+
5+
a, .btn-link {
6+
color: #006bb7;
7+
}
8+
9+
.btn-primary {
10+
color: #fff;
11+
background-color: #1b6ec2;
12+
border-color: #1861ac;
13+
}
14+
15+
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
16+
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
17+
}
18+
19+
.content {
20+
padding-top: 1.1rem;
21+
}
22+
23+
h1:focus {
24+
outline: none;
25+
}
26+
27+
.valid.modified:not([type=checkbox]) {
28+
outline: 1px solid #26b050;
29+
}
30+
31+
.invalid {
32+
outline: 1px solid #e50000;
33+
}
34+
35+
.validation-message {
36+
color: #e50000;
37+
}
38+
39+
.blazor-error-boundary {
40+
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
41+
padding: 1rem 1rem 1rem 3.7rem;
42+
color: white;
43+
}
44+
45+
.blazor-error-boundary::after {
46+
content: "An error has occurred."
47+
}
48+
49+
.darker-border-checkbox.form-check-input {
50+
border-color: #929292;
51+
}
52+
53+
.page {
54+
position: relative;
55+
display: flex;
56+
flex-direction: column;
57+
}
58+
59+
main {
60+
max-height: calc(100vh - 3.5rem);
61+
height: calc(100vh - 3.5rem);
62+
}
63+
64+
.sidebar {
65+
background-color: rgb(255, 255, 255, 100);
66+
}
67+
68+
.top-row {
69+
height: 3.5rem;
70+
background-color: rgb(255, 255, 255, 100);
71+
}
72+
73+
@media (max-width: 640.98px) {
74+
.top-row {
75+
justify-content: space-between;
76+
}
77+
78+
.top-row ::deep a, .top-row ::deep .btn-link {
79+
margin-left: 0;
80+
}
81+
}
82+
83+
@media (min-width: 641px) {
84+
article {
85+
padding-left: 2rem !important;
86+
padding-right: 1.5rem !important;
87+
}
88+
89+
.page {
90+
flex-direction: row;
91+
}
92+
93+
.sidebar {
94+
width: 250px;
95+
height: calc(100vh - 3.5rem);
96+
position: sticky;
97+
top: 0;
98+
}
99+
100+
.top-row {
101+
position: sticky;
102+
top: 0;
103+
z-index: 1;
104+
}
105+
106+
.top-row.auth ::deep a:first-child {
107+
flex: 1;
108+
text-align: right;
109+
width: 0;
110+
}
111+
112+
.top-row {
113+
padding-left: 0 !important;
114+
padding-right: 0 !important;
115+
}
116+
}
117+
118+
#blazor-error-ui {
119+
background: lightyellow;
120+
bottom: 0;
121+
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
122+
display: none;
123+
left: 0;
124+
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
125+
position: fixed;
126+
width: 100%;
127+
z-index: 1000;
128+
}
129+
130+
#blazor-error-ui .dismiss {
131+
cursor: pointer;
132+
position: absolute;
133+
right: 0.75rem;
134+
top: 0.5rem;
135+
}
Lines changed: 15 additions & 0 deletions
Loading
Lines changed: 17 additions & 0 deletions
Loading
Lines changed: 17 additions & 0 deletions
Loading
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
@attribute [ExcludeFromCodeCoverage]
2+
@inherits LayoutComponentBase
3+
4+
<div class="page">
5+
<div class="container-fluid">
6+
<div class="row top-row shadow-sm align-items-center">
7+
<div class="" style="width: 250px;">
8+
<a class="link-underline link-underline-opacity-0 align-middle" style="color: black; font-size: 1.5em;" href="/rules-ui">
9+
<Image Src="rules-ui/logo.svg" Style="width: 24px; height: 24px;" />
10+
<span class="fw-medium">Rules.Framework</span>
11+
</a>
12+
</div>
13+
<div class="col">
14+
<span style="font-size: 1.5em; color: rgba(0,0,0,0.37);">Web UI</span>
15+
</div>
16+
</div>
17+
<div class="row">
18+
<div class="sidebar border-end">
19+
<NavMenu />
20+
</div>
21+
22+
<main class="row">
23+
<article class="content">
24+
@Body
25+
</article>
26+
</main>
27+
</div>
28+
</div>
29+
</div>
30+
31+
<div id="blazor-error-ui">
32+
An unhandled error has occurred.
33+
<a href="" class="reload">Reload</a>
34+
<a class="dismiss">🗙</a>
35+
</div>

0 commit comments

Comments
 (0)