From af8682c0f2a4a68826d9261ffd6adae580ff4d73 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Mon, 1 Jun 2026 04:46:24 -0400 Subject: [PATCH] feat(theme): StatusPill widget --- .../Components/StatusPill.razor | 16 ++++++++++++++ .../src/ZB.MOM.WW.Theme/StatusState.cs | 3 +++ .../src/ZB.MOM.WW.Theme/_Imports.razor | 1 + .../ZB.MOM.WW.Theme.Tests/StatusPillTests.cs | 21 +++++++++++++++++++ .../tests/ZB.MOM.WW.Theme.Tests/_Imports.cs | 1 + 5 files changed, 42 insertions(+) create mode 100644 ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/StatusPill.razor create mode 100644 ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/StatusState.cs create mode 100644 ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/StatusPillTests.cs diff --git a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/StatusPill.razor b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/StatusPill.razor new file mode 100644 index 0000000..6a6503e --- /dev/null +++ b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/Components/StatusPill.razor @@ -0,0 +1,16 @@ +@* Components/StatusPill.razor *@ +@ChildContent + +@code { + [Parameter, EditorRequired] public StatusState State { get; set; } + [Parameter] public RenderFragment? ChildContent { get; set; } + + private string ChipClass => State switch + { + StatusState.Ok => "chip-ok", + StatusState.Warn => "chip-warn", + StatusState.Bad => "chip-bad", + StatusState.Info => "chip-info", + _ => "chip-idle", + }; +} diff --git a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/StatusState.cs b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/StatusState.cs new file mode 100644 index 0000000..c39b646 --- /dev/null +++ b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/StatusState.cs @@ -0,0 +1,3 @@ +namespace ZB.MOM.WW.Theme; + +public enum StatusState { Ok, Warn, Bad, Idle, Info } diff --git a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/_Imports.razor b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/_Imports.razor index c41ccac..f74d448 100644 --- a/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/_Imports.razor +++ b/ZB.MOM.WW.Theme/src/ZB.MOM.WW.Theme/_Imports.razor @@ -2,3 +2,4 @@ @using Microsoft.AspNetCore.Components.Routing @using Microsoft.AspNetCore.Components.Web @using ZB.MOM.WW.Theme +@using ZB.MOM.WW.Theme.Components diff --git a/ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/StatusPillTests.cs b/ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/StatusPillTests.cs new file mode 100644 index 0000000..de42144 --- /dev/null +++ b/ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/StatusPillTests.cs @@ -0,0 +1,21 @@ +namespace ZB.MOM.WW.Theme.Tests; + +public class StatusPillTests : TestContext +{ + [Theory] + [InlineData(StatusState.Ok, "chip-ok")] + [InlineData(StatusState.Warn, "chip-warn")] + [InlineData(StatusState.Bad, "chip-bad")] + [InlineData(StatusState.Idle, "chip-idle")] + [InlineData(StatusState.Info, "chip-info")] + public void Maps_state_to_chip_class(StatusState state, string expected) + { + var cut = RenderComponent(p => p + .Add(x => x.State, state) + .AddChildContent("Connected")); + var span = cut.Find("span"); + Assert.Contains("chip", span.ClassList); + Assert.Contains(expected, span.ClassList); + Assert.Equal("Connected", span.TextContent.Trim()); + } +} diff --git a/ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/_Imports.cs b/ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/_Imports.cs index 393ba04..0dedb18 100644 --- a/ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/_Imports.cs +++ b/ZB.MOM.WW.Theme/tests/ZB.MOM.WW.Theme.Tests/_Imports.cs @@ -1,3 +1,4 @@ global using Bunit; global using Xunit; global using ZB.MOM.WW.Theme; +global using ZB.MOM.WW.Theme.Components;