From f7e5f4c9d6d9e6347de21a9e466f6ac048d0448b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 14 Mar 2026 18:06:58 +0000
Subject: [PATCH 1/2] Initial plan
From f6a7d6c99da8bccb6de15c0a1180e60a46f3238b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 14 Mar 2026 18:19:44 +0000
Subject: [PATCH 2/2] Add Result parameter to ServerStatusSquareWidget and
WidgetClass enum to CircleCIBuildStatusWidget; fix ListWidget nullable
warning
Co-authored-by: AlexHedley <1573469+AlexHedley@users.noreply.github.com>
---
.../Components/List/ListWidget.razor | 4 +-
.../Pages/AdditionalWidgets.razor | 8 +--
.../CircleCIBuildStatusWidget.stories.razor | 7 +--
.../ServerStatusSquareWidget.stories.razor | 5 +-
.../CircleCIBuildStatusWidgetTest.cs | 52 +++++++++++++++++++
.../ServerStatusSquareWidgetTest.cs | 39 ++++++++++++++
.../CircleCIBuildStatusWidget.razor.cs | 20 +++++++
.../ServerStatusSquareWidget.razor.cs | 7 +++
8 files changed, 131 insertions(+), 11 deletions(-)
diff --git a/src/Blashing.Core/Components/List/ListWidget.razor b/src/Blashing.Core/Components/List/ListWidget.razor
index fba1ce5..bd2fad4 100644
--- a/src/Blashing.Core/Components/List/ListWidget.razor
+++ b/src/Blashing.Core/Components/List/ListWidget.razor
@@ -5,7 +5,7 @@
@if (Ordered) {
- @foreach (var item in Items)
+ @foreach (var item in Items ?? Enumerable.Empty<(string label, string value)>())
{
-
@item.label
@@ -15,7 +15,7 @@
} else {
- @foreach (var item in Items)
+ @foreach (var item in Items ?? Enumerable.Empty<(string label, string value)>())
{
-
@item.label
diff --git a/src/Blashing.Shared/Pages/AdditionalWidgets.razor b/src/Blashing.Shared/Pages/AdditionalWidgets.razor
index 519e1ed..90383f9 100644
--- a/src/Blashing.Shared/Pages/AdditionalWidgets.razor
+++ b/src/Blashing.Shared/Pages/AdditionalWidgets.razor
@@ -29,7 +29,7 @@
State="SUCCESS"
Time="1h 36m ago"
UpdatedAtMessage="Last updated at 0:00"
- BackgroundColor="#8fb347">
+ WidgetClass="@CircleCIWidgetClass.Passed">
@@ -45,11 +45,11 @@
-
+
-
+
@@ -62,7 +62,7 @@
State="SUCCESS"
Time="1h 36m ago"
UpdatedAtMessage="Last updated at 0:00"
- BackgroundColor="#8fb347">
+ WidgetClass="@CircleCIWidgetClass.Passed">
diff --git a/src/Blashing.Stories/Stories/CircleCIBuildStatusWidget.stories.razor b/src/Blashing.Stories/Stories/CircleCIBuildStatusWidget.stories.razor
index 2ba79ff..bc00238 100644
--- a/src/Blashing.Stories/Stories/CircleCIBuildStatusWidget.stories.razor
+++ b/src/Blashing.Stories/Stories/CircleCIBuildStatusWidget.stories.razor
@@ -6,6 +6,7 @@
+
@@ -39,7 +40,7 @@
-
+
@@ -60,7 +61,7 @@
-
+
@@ -81,7 +82,7 @@
-
+
diff --git a/src/Blashing.Stories/Stories/ServerStatusSquareWidget.stories.razor b/src/Blashing.Stories/Stories/ServerStatusSquareWidget.stories.razor
index 4adbd27..8c54760 100644
--- a/src/Blashing.Stories/Stories/ServerStatusSquareWidget.stories.razor
+++ b/src/Blashing.Stories/Stories/ServerStatusSquareWidget.stories.razor
@@ -7,6 +7,7 @@
+
@@ -28,7 +29,7 @@
-
+
@@ -43,7 +44,7 @@
-
+
diff --git a/src/Blashing.Widgets.Tests/CircleCIBuildStatusWidgetTest.cs b/src/Blashing.Widgets.Tests/CircleCIBuildStatusWidgetTest.cs
index c89ac48..650527f 100644
--- a/src/Blashing.Widgets.Tests/CircleCIBuildStatusWidgetTest.cs
+++ b/src/Blashing.Widgets.Tests/CircleCIBuildStatusWidgetTest.cs
@@ -117,4 +117,56 @@ public void CircleCIBuildStatusWidgetShouldContainPassedInValues()
Assert.Equal(circleCIBuildStatusWidget.State, state);
Assert.Equal(circleCIBuildStatusWidget.Time, time);
}
+
+ [Fact]
+ public void CircleCIBuildStatusWidgetWidgetClassFailedShouldSetRedBackgroundColor()
+ {
+ var cut = Render(parameters => parameters
+ .Add(p => p.Title, "Payment Service")
+ .Add(p => p.WidgetClass, CircleCIWidgetClass.Failed)
+ );
+
+ var circleCIBuildStatusWidget = cut.Instance;
+ Assert.Equal(CircleCIWidgetClass.Failed, circleCIBuildStatusWidget.WidgetClass);
+ Assert.Equal("#a31f1f", circleCIBuildStatusWidget.BackgroundColor);
+ }
+
+ [Fact]
+ public void CircleCIBuildStatusWidgetWidgetClassPendingShouldSetPendingBackgroundColor()
+ {
+ var cut = Render(parameters => parameters
+ .Add(p => p.Title, "Dashboard")
+ .Add(p => p.WidgetClass, CircleCIWidgetClass.Pending)
+ );
+
+ var circleCIBuildStatusWidget = cut.Instance;
+ Assert.Equal(CircleCIWidgetClass.Pending, circleCIBuildStatusWidget.WidgetClass);
+ Assert.Equal("#47bbb3", circleCIBuildStatusWidget.BackgroundColor);
+ }
+
+ [Fact]
+ public void CircleCIBuildStatusWidgetWidgetClassPassedShouldSetGreenBackgroundColor()
+ {
+ var cut = Render(parameters => parameters
+ .Add(p => p.Title, "GoCardless")
+ .Add(p => p.WidgetClass, CircleCIWidgetClass.Passed)
+ );
+
+ var circleCIBuildStatusWidget = cut.Instance;
+ Assert.Equal(CircleCIWidgetClass.Passed, circleCIBuildStatusWidget.WidgetClass);
+ Assert.Equal("#8fb347", circleCIBuildStatusWidget.BackgroundColor);
+ }
+
+ [Fact]
+ public void CircleCIBuildStatusWidgetExplicitBackgroundColorOverridesWidgetClass()
+ {
+ var cut = Render(parameters => parameters
+ .Add(p => p.Title, "GoCardless")
+ .Add(p => p.WidgetClass, CircleCIWidgetClass.Failed)
+ .Add(p => p.BackgroundColor, "#123456")
+ );
+
+ var circleCIBuildStatusWidget = cut.Instance;
+ Assert.Equal("#123456", circleCIBuildStatusWidget.BackgroundColor);
+ }
}
\ No newline at end of file
diff --git a/src/Blashing.Widgets.Tests/ServerStatusSquareWidgetTest.cs b/src/Blashing.Widgets.Tests/ServerStatusSquareWidgetTest.cs
index 6cb05a9..f120e97 100644
--- a/src/Blashing.Widgets.Tests/ServerStatusSquareWidgetTest.cs
+++ b/src/Blashing.Widgets.Tests/ServerStatusSquareWidgetTest.cs
@@ -46,4 +46,43 @@ public void ServerStatusSquareWidgetShouldContainPassedInValues()
Assert.Equal(serverStatusSquareWidget.Title, title);
Assert.Equal(serverStatusSquareWidget.UpdatedAtMessage, updatedAtMessage);
}
+
+ [Fact]
+ public void ServerStatusSquareWidgetResultUpShouldSetGreenBackgroundColor()
+ {
+ var cut = Render(parameters => parameters
+ .Add(p => p.Title, "Server Up")
+ .Add(p => p.Result, true)
+ );
+
+ var serverStatusSquareWidget = cut.Instance;
+ Assert.Equal(true, serverStatusSquareWidget.Result);
+ Assert.Equal("#96BF48", serverStatusSquareWidget.BackgroundColor);
+ }
+
+ [Fact]
+ public void ServerStatusSquareWidgetResultDownShouldSetRedBackgroundColor()
+ {
+ var cut = Render(parameters => parameters
+ .Add(p => p.Title, "Server Down")
+ .Add(p => p.Result, false)
+ );
+
+ var serverStatusSquareWidget = cut.Instance;
+ Assert.Equal(false, serverStatusSquareWidget.Result);
+ Assert.Equal("#BF4848", serverStatusSquareWidget.BackgroundColor);
+ }
+
+ [Fact]
+ public void ServerStatusSquareWidgetExplicitBackgroundColorOverridesResult()
+ {
+ var cut = Render(parameters => parameters
+ .Add(p => p.Title, "Server Up")
+ .Add(p => p.Result, true)
+ .Add(p => p.BackgroundColor, "#123456")
+ );
+
+ var serverStatusSquareWidget = cut.Instance;
+ Assert.Equal("#123456", serverStatusSquareWidget.BackgroundColor);
+ }
}
\ No newline at end of file
diff --git a/src/Blashing.Widgets/CircleCIBuildStatus/CircleCIBuildStatusWidget.razor.cs b/src/Blashing.Widgets/CircleCIBuildStatus/CircleCIBuildStatusWidget.razor.cs
index e640549..6a95c2b 100644
--- a/src/Blashing.Widgets/CircleCIBuildStatus/CircleCIBuildStatusWidget.razor.cs
+++ b/src/Blashing.Widgets/CircleCIBuildStatus/CircleCIBuildStatusWidget.razor.cs
@@ -3,6 +3,13 @@
namespace Blashing.Widgets.CircleCIBuildStatus;
+public enum CircleCIWidgetClass
+{
+ Failed,
+ Pending,
+ Passed
+}
+
public partial class CircleCIBuildStatusWidget : BaseWidget
{
[Parameter]
@@ -31,9 +38,22 @@ public partial class CircleCIBuildStatusWidget : BaseWidget
[Parameter]
public string? Time { get; set; }
+
+ [Parameter]
+ public CircleCIWidgetClass? WidgetClass { get; set; }
protected override void OnParametersSet()
{
+ if (WidgetClass.HasValue && BackgroundColor == null)
+ {
+ BackgroundColor = WidgetClass.Value switch
+ {
+ CircleCIWidgetClass.Failed => "#a31f1f",
+ CircleCIWidgetClass.Pending => "#47bbb3",
+ CircleCIWidgetClass.Passed => "#8fb347",
+ _ => null
+ };
+ }
BackgroundColor ??= "#8fb347";
}
}
\ No newline at end of file
diff --git a/src/Blashing.Widgets/ServerStatusSquares/ServerStatusSquareWidget.razor.cs b/src/Blashing.Widgets/ServerStatusSquares/ServerStatusSquareWidget.razor.cs
index 5171457..4c8793d 100644
--- a/src/Blashing.Widgets/ServerStatusSquares/ServerStatusSquareWidget.razor.cs
+++ b/src/Blashing.Widgets/ServerStatusSquares/ServerStatusSquareWidget.razor.cs
@@ -11,8 +11,15 @@ public partial class ServerStatusSquareWidget : BaseWidget
[Parameter]
public string? UpdatedAtMessage { get; set; }
+ [Parameter]
+ public bool? Result { get; set; }
+
protected override void OnParametersSet()
{
+ if (Result.HasValue && BackgroundColor == null)
+ {
+ BackgroundColor = Result.Value ? "#96BF48" : "#BF4848";
+ }
BackgroundColor ??= "#12b0c5";
}
}
\ No newline at end of file