diff --git a/.github/workflows/deploy-mudblazor.yml b/.github/workflows/deploy-mudblazor.yml
index d4c8486ff2ae..ea1f38473679 100644
--- a/.github/workflows/deploy-mudblazor.yml
+++ b/.github/workflows/deploy-mudblazor.yml
@@ -10,7 +10,7 @@ on:
type: string
push:
tags:
- - "v7.[0-9]+.[0-9]+"
+ - "v8.[0-9]+.[0-9]+"
jobs:
get-version:
diff --git a/.github/workflows/deploy-trymudblazor.yml b/.github/workflows/deploy-trymudblazor.yml
index 544430021f9c..d20aa7995fac 100644
--- a/.github/workflows/deploy-trymudblazor.yml
+++ b/.github/workflows/deploy-trymudblazor.yml
@@ -4,7 +4,7 @@ on:
workflow_dispatch:
push:
tags:
- - "v7.[0-9]+.[0-9]+"
+ - "v8.[0-9]+.[0-9]+"
jobs:
wait-for-nuget:
diff --git a/src/MudBlazor.Docs/Components/ApiMemberTable.razor b/src/MudBlazor.Docs/Components/ApiMemberTable.razor
index 81543421b410..c8177a52c08b 100644
--- a/src/MudBlazor.Docs/Components/ApiMemberTable.razor
+++ b/src/MudBlazor.Docs/Components/ApiMemberTable.razor
@@ -57,8 +57,7 @@
T="ApiMemberGrouping"
Value="Grouping"
ValueChanged="OnGroupingChangedAsync"
- Size="Size.Small"
- Rounded="true">
+ Size="Size.Small">
None
Category
Inheritance
diff --git a/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor b/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor
index c9752dab5a48..16da34b65ec7 100644
--- a/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor
+++ b/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor
@@ -1,31 +1,13 @@
-
+
-
+
- @if (context.Value.Name == "Root")
- {
-
- @context.Text
- }
- else
- {
-
+
- @if (context.Value.NameFriendly == Type.NameFriendly)
- {
-
- @context.Text
- }
- else if(context.Text == "Enum")
- {
- @context.Text
- }
- else if (!string.IsNullOrEmpty(context.Value.ApiUrl))
- {
- @context.Text
- }
- }
+
+ @context.Text
+
-
\ No newline at end of file
+
diff --git a/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor.cs b/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor.cs
index 3081ea12360c..869f4c1276a4 100644
--- a/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor.cs
+++ b/src/MudBlazor.Docs/Components/ApiTypeHierarchy.razor.cs
@@ -40,6 +40,7 @@ public DocumentedType? Type
Children = [],
};
var root = new List>() { primaryItem };
+
// Walk up the hierarchy to build the tree
var parent = Type!.BaseType;
while (parent != null)
@@ -67,6 +68,7 @@ public DocumentedType? Type
break;
}
}
+
// Now check for types inheriting from this type
foreach (var descendant in ApiDocumentation.Types.Values.OrderBy(type => type.Name).Where(type => type.BaseTypeName == Type.Name))
{
@@ -77,6 +79,7 @@ public DocumentedType? Type
Value = descendant
});
}
+
// Set the items
Root = new ReadOnlyCollection>(root);
StateHasChanged();
@@ -99,15 +102,18 @@ public DocumentedType? Type
[Inject]
private NavigationManager? Browser { get; set; }
- ///
- /// Occurs when a type has been clicked.
- ///
- ///
- public void OnTypeClicked(TreeItemData item)
+ private string GetIcon(TreeItemData context)
{
- if (item.Value != null && !string.IsNullOrEmpty(item.Value.ApiUrl) && item.Value.Name != "Root")
+ if (context.Value!.Name == "Root")
{
- Browser?.NavigateTo(item.Value.ApiUrl);
+ return Icons.Material.Filled.Home;
}
+
+ return Icons.Custom.Uncategorized.Empty;
+ }
+
+ private bool GetReadOnly(TreeItemData context)
+ {
+ return context.Value!.Name == "Root" || context.Value.NameFriendly == Type?.NameFriendly || string.IsNullOrEmpty(context.Value.ApiUrl);
}
}
diff --git a/src/MudBlazor.Docs/Components/ApiTypeTable.razor b/src/MudBlazor.Docs/Components/ApiTypeTable.razor
index 6add8506e6a9..d98ac8c803ba 100644
--- a/src/MudBlazor.Docs/Components/ApiTypeTable.razor
+++ b/src/MudBlazor.Docs/Components/ApiTypeTable.razor
@@ -1,17 +1,13 @@
-
-
-
-
-
+
Name
diff --git a/src/MudBlazor.Docs/Pages/Api/Api.razor b/src/MudBlazor.Docs/Pages/Api/Api.razor
index fd47d23e252f..ae2bbe7e4fbf 100644
--- a/src/MudBlazor.Docs/Pages/Api/Api.razor
+++ b/src/MudBlazor.Docs/Pages/Api/Api.razor
@@ -3,8 +3,13 @@
@namespace MudBlazor.Docs.Pages.Api
@@ -13,6 +18,7 @@
+
@if (DocumentedType.Properties.Count > 0)
@@ -20,11 +26,7 @@
-
-
-
-
-
+
}
@@ -34,11 +36,7 @@
-
-
-
-
-
+
}
@@ -48,11 +46,7 @@
-
-
-
-
-
+
}
@@ -62,11 +56,7 @@
-
-
-
-
-
+
}
@@ -76,11 +66,7 @@
-
-
-
-
-
+
}
@@ -100,11 +86,7 @@
-
-
-
-
-
+
}
@@ -114,11 +96,7 @@
-
-
-
-
-
+
}
@@ -127,13 +105,13 @@
}
else
{
-
+
-
-
- Sorry, the type @TypeName was not found.
-
-
+
+
+
+ Sorry, the type @TypeName was not found.
+
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample1.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample1.razor
index e021c19ff038..0d93b4ef164a 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample1.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample1.razor
@@ -1,7 +1,7 @@
@namespace MudBlazor.Docs.Examples
-
@@ -11,9 +11,9 @@
- @for (int i = 0; i < _colors.Length; i++)
+ @for (var i = 0; i < _colors.Length; i++)
{
- _colorCount -1 ? string.Empty : "border: 2px solid black;" )}")">
}
@@ -24,8 +24,8 @@
@code {
private int _colorCount = 1;
private readonly string[] _colors = ["#5AC8FA", "#34C759", "#007AFF", "#FFCC00", "#e03131"];
- private List Series = [];
- private ChartOptions Options = new ChartOptions();
+ private List _series = [];
+ private ChartOptions _options = new();
private string[] _xLabels = [];
protected override void OnInitialized()
@@ -49,16 +49,18 @@
private void BuildOptions()
{
- var options = new ChartOptions();
- options.ChartPalette = _colors.Take(_colorCount).ToArray();
- Options = options;
+ var options = new ChartOptions
+ {
+ ChartPalette = _colors.Take(_colorCount).ToArray()
+ };
+ _options = options;
}
private void RandomizeData()
{
string[] xaxis = ["A", string.Empty, "C",];
var heatMapSeries = new List();
- int dataPoints = xaxis.Length;
+ var dataPoints = xaxis.Length;
foreach (var x in xaxis)
{
var data = new double[dataPoints];
@@ -69,7 +71,7 @@
heatMapSeries.Add(new ChartSeries { Name = x, Data = data });
}
_xLabels = xaxis;
- Series = heatMapSeries;
+ _series = heatMapSeries;
BuildOptions();
}
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample2.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample2.razor
index eab0ad1672d0..704826b8eea8 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample2.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample2.razor
@@ -1,7 +1,7 @@
@namespace MudBlazor.Docs.Examples
-
@@ -9,7 +9,7 @@
YAxis Labels
-
+
Left
Right
None
@@ -22,7 +22,7 @@
XAxis Labels
-
+
Top
Bottom
None
@@ -34,10 +34,10 @@
@code {
private readonly string[] _colors = ["#5AC8FA", "#34C759", "#007AFF"];
- private List Series = [];
- private ChartOptions Options = new ChartOptions();
- private XAxisLabelPosition _XAxisLabelPosition = XAxisLabelPosition.Top;
- private YAxisLabelPosition _YAxisLabelPosition = YAxisLabelPosition.Left;
+ private List _series = [];
+ private ChartOptions _options = new();
+ private XAxisLabelPosition _xAxisLabelPosition = XAxisLabelPosition.Top;
+ private YAxisLabelPosition _yAxisLabelPosition = YAxisLabelPosition.Left;
private string[] _xLabels = [];
protected override void OnInitialized()
@@ -49,18 +49,20 @@
private void BuildOptions()
{
- var options = new ChartOptions();
- options.ChartPalette = _colors;
- options.XAxisLabelPosition = _XAxisLabelPosition;
- options.YAxisLabelPosition = _YAxisLabelPosition;
- Options = options;
+ var options = new ChartOptions
+ {
+ ChartPalette = _colors,
+ XAxisLabelPosition = _xAxisLabelPosition,
+ YAxisLabelPosition = _yAxisLabelPosition
+ };
+ _options = options;
}
private void RandomizeData()
{
string[] xaxis = ["A", "B", "C",];
var heatMapSeries = new List();
- int dataPoints = xaxis.Length;
+ var dataPoints = xaxis.Length;
foreach (var x in xaxis)
{
var data = new double[dataPoints];
@@ -71,7 +73,7 @@
heatMapSeries.Add(new ChartSeries { Name = x, Data = data });
}
_xLabels = xaxis;
- Series = heatMapSeries;
+ _series = heatMapSeries;
BuildOptions();
}
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample3.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample3.razor
index 1d32115523e6..7f51ac607f66 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample3.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample3.razor
@@ -1,7 +1,7 @@
@namespace MudBlazor.Docs.Examples
-
@@ -16,8 +16,8 @@
@code {
private bool _enableSmoothGradient = true;
private readonly string[] _colors = ["#5AC8FA", "#34C759", "#007AFF"];
- private List Series = [];
- private ChartOptions Options = new ChartOptions();
+ private List _series = [];
+ private ChartOptions _options = new();
private string[] _xLabels = [];
protected override void OnInitialized()
@@ -29,17 +29,19 @@
private void BuildOptions()
{
- var options = new ChartOptions();
- options.ChartPalette = _colors;
- options.EnableSmoothGradient = _enableSmoothGradient;
- Options = options;
+ var options = new ChartOptions
+ {
+ ChartPalette = _colors,
+ EnableSmoothGradient = _enableSmoothGradient
+ };
+ _options = options;
}
private void RandomizeData()
{
string[] xaxis = ["A", string.Empty, "C",];
var heatMapSeries = new List();
- int dataPoints = xaxis.Length;
+ var dataPoints = xaxis.Length;
foreach (var x in xaxis)
{
var data = new double[dataPoints];
@@ -50,7 +52,7 @@
heatMapSeries.Add(new ChartSeries { Name = x, Data = data });
}
_xLabels = xaxis;
- Series = heatMapSeries;
+ _series = heatMapSeries;
BuildOptions();
}
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample4.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample4.razor
index 87dc2b4d60a9..535169cec901 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample4.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample4.razor
@@ -1,5 +1,7 @@
@namespace MudBlazor.Docs.Examples
+
+
@@ -40,8 +42,37 @@
-
+
+
+
+
+
+
+
+ N/A
+
+
+
+
+
+
+
+
+
+ NO
+
+
+
@@ -54,14 +85,14 @@
-
+
Left
Right
None
-
+
Top
Bottom
None
@@ -94,10 +125,10 @@
@code {
- private ChartOptions options = new ChartOptions();
- private List Series = new List();
- private XAxisLabelPosition _XAxisLabelPosition = XAxisLabelPosition.Bottom;
- private YAxisLabelPosition _YAxisLabelPosition = YAxisLabelPosition.Left;
+ private ChartOptions _options = new();
+ private List _series = [];
+ private XAxisLabelPosition _xAxisLabelPosition = XAxisLabelPosition.Bottom;
+ private YAxisLabelPosition _yAxisLabelPosition = YAxisLabelPosition.Left;
private bool _enableGradient = false;
private bool _showValueLabels = true;
private bool _showLegendValues = true;
@@ -107,79 +138,70 @@
private Origin _anchorOrigin = Origin.BottomCenter;
private int _colorCount = 5;
private readonly string[] _colors = ["#5AC8FA", "#34C759", "#007AFF", "#FFCC00", "#e03131"];
+ private readonly List _heatMapSeries =
+ [
+ new() { Name = "Mo", Data = [90, 79, 72, 69, 62, 62, 55, 65, 70] },
+ new() { Name = "Te", Data = [35, 41, 35, 51, 49, 62, 69, 91, 148] },
+ new() { Name = "We", Data = [22, 90, 62, 32, 05, 42, 63, 43, 155] },
+ new() { Name = "Th", Data = [35, 41, 35, 51, 49, 62, 69, 91, 148] },
+ new() { Name = "Fr", Data = [22, 90, 62, 32, 05, 42, 63, 43, 155] },
+ new() { Name = "Sa", Data = [35, 41, 35, 51, 49, 62, 69, 91, 148] },
+ new() { Name = "Su", Data = [22, 90, 62, 32, 05, 42, 63, 43, 155] }
+ ];
+ private string[] _xAxisLabels = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep"];
protected override void OnInitialized()
{
- Series = HeatMapSeries;
+ base.OnInitialized();
+ _series = _heatMapSeries;
BuildOptions();
}
private void ShowLegendPositionChanged(Position value)
{
_showLegendPosition = value;
- switch (value)
+ _anchorOrigin = value switch
{
- case Position.Top:
- _anchorOrigin = Origin.TopCenter;
- break;
- case Position.Left:
- _anchorOrigin = Origin.CenterLeft;
- break;
- case Position.Right:
- _anchorOrigin = Origin.CenterRight;
- break;
- case Position.Bottom:
- _anchorOrigin = Origin.BottomCenter;
- break;
- default:
- break;
- }
+ Position.Top => Origin.TopCenter,
+ Position.Left => Origin.CenterLeft,
+ Position.Right => Origin.CenterRight,
+ Position.Bottom => Origin.BottomCenter,
+ _ => _anchorOrigin
+ };
BuildOptions();
}
private void BuildOptions()
{
- options = new ChartOptions();
- options.XAxisLabelPosition = _XAxisLabelPosition;
- options.YAxisLabelPosition = _YAxisLabelPosition;
- options.EnableSmoothGradient = _enableGradient;
- options.ChartPalette = _colors.Take(_colorCount).ToArray();
- options.ShowLabels = _showValueLabels;
- options.ShowLegend = _legendVisible;
- options.ShowLegendLabels = _showLegendValues;
+ _options = new ChartOptions
+ {
+ XAxisLabelPosition = _xAxisLabelPosition,
+ YAxisLabelPosition = _yAxisLabelPosition,
+ EnableSmoothGradient = _enableGradient,
+ ChartPalette = _colors.Take(_colorCount).ToArray(),
+ ShowLabels = _showValueLabels,
+ ShowLegend = _legendVisible,
+ ShowLegendLabels = _showLegendValues
+ };
StateHasChanged();
}
- public readonly List HeatMapSeries = new List()
- {
- new ChartSeries() { Name = "Mo", Data = new double[] { 90, 79, 72, 69, 62, 62, 55, 65, 70 } },
- new ChartSeries() { Name = "Te", Data = new double[] { 35, 41, 35, 51, 49, 62, 69, 91, 148 } },
- new ChartSeries() { Name = "We", Data = new double[] { 22, 90, 62, 32, 05, 42, 63, 43, 155 } },
- new ChartSeries() { Name = "Th", Data = new double[] { 35, 41, 35, 51, 49, 62, 69, 91, 148 } },
- new ChartSeries() { Name = "Fr", Data = new double[] { 22, 90, 62, 32, 05, 42, 63, 43, 155 } },
- new ChartSeries() { Name = "Sa", Data = new double[] { 35, 41, 35, 51, 49, 62, 69, 91, 148 } },
- new ChartSeries() { Name = "Su", Data = new double[] { 22, 90, 62, 32, 05, 42, 63, 43, 155 } },
- };
-
- public string[] XAxisLabels = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep" };
-
private void RandomizeData()
{
var newSeries = new List();
- string[] days = { "Mo", "Te", "We", "Th", "Fr", "Sa", "Su" };
- int dataPoints = 9;
+ string[] days = ["Mo", "Te", "We", "Th", "Fr", "Sa", "Su"];
+ const int DataPoints = 9;
foreach (var day in days)
{
- var data = new double[dataPoints];
- for (int i = 0; i < dataPoints; i++)
+ var data = new double[DataPoints];
+ for (int i = 0; i < DataPoints; i++)
{
data[i] = Random.Shared.NextDouble() * 100;
}
- newSeries.Add(new ChartSeries() { Name = day, Data = data });
+ newSeries.Add(new ChartSeries { Name = day, Data = data });
}
- Series = newSeries;
+ _series = newSeries;
}
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample5.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample5.razor
index fdf8274c8b3f..a7efadc470ed 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample5.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample5.razor
@@ -1,7 +1,7 @@
@namespace MudBlazor.Docs.Examples
-
@@ -24,8 +24,8 @@
@code {
private readonly string[] _colors = ["#5AC8FA", "#34C759", "#007AFF"];
- private List Series = [];
- private ChartOptions Options = new ChartOptions();
+ private List _series = [];
+ private ChartOptions _options = new();
private bool _showValueLabels = true;
private bool _showValueToolTips = true;
private string[] _xLabels = [];
@@ -39,18 +39,20 @@
private void BuildOptions()
{
- var options = new ChartOptions();
- options.ChartPalette = _colors;
- options.ShowLabels = _showValueLabels;
- options.ShowToolTips = _showValueToolTips;
- Options = options;
+ var options = new ChartOptions
+ {
+ ChartPalette = _colors,
+ ShowLabels = _showValueLabels,
+ ShowToolTips = _showValueToolTips
+ };
+ _options = options;
}
private void RandomizeData()
{
string[] xaxis = ["A", "B", "C",];
var heatMapSeries = new List();
- int dataPoints = xaxis.Length;
+ var dataPoints = xaxis.Length;
foreach (var x in xaxis)
{
var data = new double[dataPoints];
@@ -61,7 +63,7 @@
heatMapSeries.Add(new ChartSeries { Name = x, Data = data });
}
_xLabels = xaxis;
- Series = heatMapSeries;
+ _series = heatMapSeries;
BuildOptions();
}
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample6.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample6.razor
new file mode 100644
index 000000000000..a109bc3b227e
--- /dev/null
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/HeatMapExample6.razor
@@ -0,0 +1,74 @@
+@namespace MudBlazor.Docs.Examples
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+ private readonly string[] _colors = ["#5AC8FA", "#34C759", "#007AFF"];
+ private List _series = [];
+ private ChartOptions _options = new();
+ private string[] _xLabels = [];
+
+ protected override void OnInitialized()
+ {
+ base.OnInitialized();
+ WeeklyData();
+ BuildOptions();
+ }
+
+ private void BuildOptions()
+ {
+ var options = new ChartOptions
+ {
+ ChartPalette = _colors,
+ YAxisLabelPosition = YAxisLabelPosition.None,
+ ShowLegend = false,
+ XAxisLabelPosition = XAxisLabelPosition.Top,
+ ShowToolTips = false,
+ ShowLabels = false
+ };
+ _options = options;
+ }
+
+ private void WeeklyData()
+ {
+ string[] xaxis = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",];
+ var heatMapSeries = new List();
+ var dataPoints = xaxis.Length;
+ var data = new double[dataPoints];
+ for (int i = 0; i < dataPoints; i++)
+ {
+ data[i] = i;
+ }
+ heatMapSeries.Add(new ChartSeries { Name = string.Empty, Data = data });
+ _xLabels = xaxis;
+ _series = heatMapSeries;
+ }
+}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/HeatMapChartPage.razor b/src/MudBlazor.Docs/Pages/Components/Charts/HeatMapChartPage.razor
index b4051f3500f2..565a9d5e88f7 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/HeatMapChartPage.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/HeatMapChartPage.razor
@@ -69,10 +69,25 @@
+
+
+
+ MudHeatMapCell allows you to customize many aspects of each individual heat map.
+ MudHeatMapCell can be used to display beautiful and comprehensive Heat Map charts.
+ You must set the Row and Column and all other values are optional. Any child content you add should either be sized appropriately by html or you should specify
+ the Width and Height of MudHeatMapCell. You can also override the Value and/or Color. Child Content can contain almost any type of html
+ element but if it's any type of image ensure to provide the Width and Height so it can be resized dynamically.
+
+
+
+
+
+
+
- By default the Legend is displayed at the bottom of a HeatMap without the Label Values being displayed. You can customize it using the MudChart.LegendPosition
+ By default, the Legend is displayed at the bottom of a HeatMap without the Label Values being displayed. You can customize it using the MudChart.LegendPosition
and ChartOptions.ShowLegendLabels. A Myriad of customization options allow for the HeatMap of your choice.
diff --git a/src/MudBlazor.Docs/Pages/Components/Chip/ChipPage.razor b/src/MudBlazor.Docs/Pages/Components/Chip/ChipPage.razor
index b458afb9e024..a654f109083e 100644
--- a/src/MudBlazor.Docs/Pages/Components/Chip/ChipPage.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Chip/ChipPage.razor
@@ -86,5 +86,32 @@
+
+
+
+ Set the Href parameter to render the chip as an anchor element.
+ rel="noopener" will be added automatically if Target == "_blank".
+ Link chips cannot use a close button or the OnClick event.
+
+
+
+
+
+
+
+
+
+
+ The relationship between a linked resource and the current document can be defined using the Rel property.
+ This overrides the automatic addition of rel="noopener" when setting Target to _blank and so you have to specify it manually if desired.
+
+
+
+
+
+
+
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/Chip/Examples/ChipLinkExample.razor b/src/MudBlazor.Docs/Pages/Components/Chip/Examples/ChipLinkExample.razor
new file mode 100644
index 000000000000..796b473b1c5e
--- /dev/null
+++ b/src/MudBlazor.Docs/Pages/Components/Chip/Examples/ChipLinkExample.razor
@@ -0,0 +1,39 @@
+@namespace MudBlazor.Docs.Examples
+
+
+ GitHub
+
+
+
+ With Icon
+
+
+
+
+ GH
+
+ With Avatar
+
+
+
+
+
+
+@code {
+ bool _disabled = false;
+}
diff --git a/src/MudBlazor.Docs/Pages/Components/Chip/Examples/ChipLinkRelExample.razor b/src/MudBlazor.Docs/Pages/Components/Chip/Examples/ChipLinkRelExample.razor
new file mode 100644
index 000000000000..41cd98f9c177
--- /dev/null
+++ b/src/MudBlazor.Docs/Pages/Components/Chip/Examples/ChipLinkRelExample.razor
@@ -0,0 +1,18 @@
+@namespace MudBlazor.Docs.Examples
+
+
+ Link with rel="nofollow"
+
+
+
+ Link with rel="nofollow noopener"
+
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample1.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample1.razor
index 9a2219a0ad78..be6ccd76106b 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample1.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample1.razor
@@ -1,38 +1,24 @@
@namespace MudBlazor.Docs.Examples
-
-
- I am a button
-
-
-
-
-
-
-
-
-
-
+
- Account
+ Button
-
-
+
- Disabled
+ Chip
-
@@ -46,21 +32,6 @@
-
-
-
- Dense Error
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample2.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample2.razor
index 8db0b5919c65..6a891f79d9df 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample2.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorExample2.razor
@@ -3,7 +3,7 @@
- Left click
+ Left Click
@@ -15,7 +15,7 @@
- Right click
+ Right Click
@@ -27,7 +27,7 @@
- Mouse over
+ Mouse Over
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorOnMouseExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorOnMouseExample.razor
index 3091fb497da0..0ee7b0e5c382 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorOnMouseExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuActivatorOnMouseExample.razor
@@ -13,10 +13,12 @@
+
+
+
-
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/ContextMenuExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuContextMenuExample.razor
similarity index 86%
rename from src/MudBlazor.Docs/Pages/Components/Menu/Examples/ContextMenuExample.razor
rename to src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuContextMenuExample.razor
index 66ea0b3872a0..f84d20831321 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/ContextMenuExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuContextMenuExample.razor
@@ -15,11 +15,13 @@
-
+
+
+
+
-
@code {
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuCustomizationExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuCustomizationExample.razor
index 9e608307e72d..d6086dcafcab 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuCustomizationExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuCustomizationExample.razor
@@ -1,36 +1,37 @@
@namespace MudBlazor.Docs.Examples
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
\ No newline at end of file
+
+
+
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuDenseExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuDenseExample.razor
new file mode 100644
index 000000000000..bed2b09200ea
--- /dev/null
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuDenseExample.razor
@@ -0,0 +1,7 @@
+@namespace MudBlazor.Docs.Examples
+
+
+
+
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuDividerExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuDividerExample.razor
new file mode 100644
index 000000000000..add4a4a32977
--- /dev/null
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuDividerExample.razor
@@ -0,0 +1,9 @@
+@namespace MudBlazor.Docs.Examples
+
+
+
+
+
+
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuIconButtonsExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuIconButtonsExample.razor
index 6a0e4a329f3e..73cb65e67f3c 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuIconButtonsExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuIconButtonsExample.razor
@@ -22,11 +22,3 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuItemCustomizationExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuItemCustomizationExample.razor
index 610e525e916e..e095fbfb84e4 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuItemCustomizationExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuItemCustomizationExample.razor
@@ -1,12 +1,12 @@
@namespace MudBlazor.Docs.Examples
-
+
-
+
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuSimpleExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuSimpleExample.razor
index c4917b311888..5df18e28ffa3 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuSimpleExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuSimpleExample.razor
@@ -1,13 +1,7 @@
@namespace MudBlazor.Docs.Examples
-
-
-
+
+
+
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuTwoWayBindingExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuTwoWayBindingExample.razor
index 50349f26433a..b3298e2ee77d 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuTwoWayBindingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuTwoWayBindingExample.razor
@@ -1,9 +1,9 @@
@namespace MudBlazor.Docs.Examples
-
-
-
+
+
+
Open for 1 Second
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuWithNestingExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuWithNestingExample.razor
index 7ba0d5f005f6..21f0f4b1de65 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuWithNestingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuWithNestingExample.razor
@@ -1,29 +1,29 @@
@namespace MudBlazor.Docs.Examples
-
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/MenuPage.razor b/src/MudBlazor.Docs/Pages/Components/Menu/MenuPage.razor
index c48b1f09bcd1..13803cbbbfca 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/MenuPage.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/MenuPage.razor
@@ -12,10 +12,7 @@
-
-
- This example demonstrates a basic menu with default behavior.
-
+
@@ -23,13 +20,27 @@
-
+
+
+ Dense menus are more compact than regular menus and open instantly, suitable for desktop platforms.
+
+
+
+
+
+
+
+
+
+
+ The activator is the element responsible for spawning the menu popover.
+
-
+
- The menu button provides the same options and behavior as a standard button.
+ The default menu button provides many of the same options as a standard button.
@@ -38,42 +49,63 @@
-
+
- Use the Icon property on a menu item to show an icon and IconColor to change its color.
+ When the @nameof(MudMenu.Icon) property is specified, the activator is rendered as a MudIconButton instead.
+ Note: This is not the same as @nameof(MudMenu.StartIcon) or @nameof(MudMenu.EndIcon) which are used to add icons to the default button activator as seen above.
-
-
+
+
-
+
- When an Icon is provided, the menu button is rendered as an IconButton.
+ If the regular customization options are not enough, use the ActivatorContent render fragment to define a custom activator element for opening the menu.
+ In this example, a custom button, chip, and avatar are each used to open a menu.
-
-
+
+
+
+
+
+
+
+
+
-
+
- Use the ActivatorContent render fragment to define a custom activator element for opening the menu.
+ Use the Icon property on a menu item to show an icon and IconColor to change its color.
-
-
+
+
+
+
+
+
+
+
+ You can insert a MudDivider between menu items to separate them.
+
+
+
+
- Set a maximum height for the menu using the MaxHeight property to enable scrolling.
+ The menu's height is automatically restricted to the viewport if it gets too large,
+ but if you need it to be a specific number of pixels you can use the MaxHeight property.
@@ -84,44 +116,45 @@
-
+
- Cascading menus, also known as nested menus, allow users to navigate through a wide range of options by presenting multiple levels of hierarchical menus.
- Using the pattern shown below, multiple menus can be nested.
- Hover your mouse over submenus (marked with a >) to open them.
+ Cascading menus, also known as nested menus, allow users to navigate a wide range of options by presenting menus with multiple levels of hierarchy.
+ Click or hover your mouse over submenus (denoted by an arrow icon) to open them.
-
+
-
-
- The Open parameter supports two-way binding,
- allowing you to control the menu's visibility programmatically and synchronize its state with a boolean property.
-
-
-
-
-
-
-
-
-
+
+
+
+
+ The Open parameter supports two-way binding,
+ allowing you to control the menu's visibility programmatically and synchronize its state with a boolean property.
+
+
+
+
+
+
+
Use the ActivationEvent property to specify which mouse event opens the menu.
+ If the menu is a nested menu, this property may act differently.
+
@@ -132,32 +165,33 @@
+
- Implement context menus with custom logic. When Label, Icon,
- and ActivatorContent are unset, no button is rendered and the menu can only be opened programmatically.
+ The previous example can be extended to create a contextual menu.
+ When Label, Icon, and ActivatorContent are unset, no button is rendered and the menu can only be opened programmatically.
-
-
+
+
+
+
+
+
+
+
+ The component uses MudPopover to place its menu. Adjust the
+ AnchorOrigin and TransformOrigin properties to control the menu's position.
+ For more details and examples, visit the popover documentation page.
+
+
+
+
-
-
-
-
- The component uses MudPopover to place its menu. Adjust the
- AnchorOrigin and TransformOrigin properties to control the menu's position.
- For more details and examples, visit the popover documentation page.
-
-
-
-
-
-
diff --git a/src/MudBlazor.Docs/Pages/Components/Progress/Examples/ProgressCircularRoundedExample.razor b/src/MudBlazor.Docs/Pages/Components/Progress/Examples/ProgressCircularRoundedExample.razor
new file mode 100644
index 000000000000..9bf66ab77775
--- /dev/null
+++ b/src/MudBlazor.Docs/Pages/Components/Progress/Examples/ProgressCircularRoundedExample.razor
@@ -0,0 +1,5 @@
+@namespace MudBlazor.Docs.Examples
+
+
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/Progress/ProgressPage.razor b/src/MudBlazor.Docs/Pages/Components/Progress/ProgressPage.razor
index 0c6fe2df9c6e..5b5d0f15ff08 100644
--- a/src/MudBlazor.Docs/Pages/Components/Progress/ProgressPage.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Progress/ProgressPage.razor
@@ -60,6 +60,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleBasicsExample.razor b/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleBasicsExample.razor
index 5d5564f83fbd..80d92441a540 100644
--- a/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleBasicsExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleBasicsExample.razor
@@ -3,13 +3,13 @@
-
+
-
+
@@ -27,7 +27,7 @@
-
+
@@ -58,7 +58,6 @@
}
-
@@ -70,7 +69,6 @@
@code {
Size _size = Size.Medium;
Color _color = Color.Primary;
- bool _rounded = false;
bool _checkMark = false;
bool _outlined = true;
bool _delimiters = true;
diff --git a/src/MudBlazor.Docs/Styles/components/_docspage.scss b/src/MudBlazor.Docs/Styles/components/_docspage.scss
index 10c8500dc059..2465843c911b 100644
--- a/src/MudBlazor.Docs/Styles/components/_docspage.scss
+++ b/src/MudBlazor.Docs/Styles/components/_docspage.scss
@@ -1,5 +1,18 @@
-.docs-page-content {
+.docs-page-content {
min-height: calc(100vh - 600px);
+
+ .docs-api-404-logo {
+ width: 25%;
+ height: 25%
+ }
+
+ &:has(.docs-api-404-alert) {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 4em;
+ }
}
.docs-page-content-navigation-drawer {
diff --git a/src/MudBlazor.Docs/Styles/components/_docssection.scss b/src/MudBlazor.Docs/Styles/components/_docssection.scss
index 982a7eb2d3f3..638cfc999e4c 100644
--- a/src/MudBlazor.Docs/Styles/components/_docssection.scss
+++ b/src/MudBlazor.Docs/Styles/components/_docssection.scss
@@ -229,3 +229,24 @@
width: 100%;
margin: 0 !important;
}
+
+.api-type-hierarchy {
+ .mud-link {
+ flex-grow: 1;
+ color: unset !important;
+ }
+
+ .mud-treeview-group {
+ border-left: 1px solid var(--mud-palette-text-primary);
+ }
+
+ .mud-treeview-item-content {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+ }
+
+ .mud-treeview .mud-treeview-item {
+ margin-left: 8px;
+ }
+}
diff --git a/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj b/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj
index 0581ac127e12..2927f89388f0 100644
--- a/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj
+++ b/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj
@@ -56,7 +56,7 @@
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
@@ -67,7 +67,7 @@
-
+
diff --git a/src/MudBlazor.UnitTests.Viewer/Pages/Index.razor b/src/MudBlazor.UnitTests.Viewer/Pages/Index.razor
index 55b12154aee0..7326e19bba82 100644
--- a/src/MudBlazor.UnitTests.Viewer/Pages/Index.razor
+++ b/src/MudBlazor.UnitTests.Viewer/Pages/Index.razor
@@ -1,6 +1,8 @@
@page "/"
@using System.Reflection
+
+
@@ -14,6 +16,9 @@
+
+
+
@@ -110,9 +115,9 @@
border-radius: var(--mud-default-borderradius);
}
- .docs-search-bar.mud-input-control .mud-input-root, .docs-search-bar.mud-input-control .mud-icon-default {
- color: #fafafa;
- }
+ .docs-search-bar.mud-input-control .mud-input-root, .docs-search-bar.mud-input-control .mud-icon-default {
+ color: #fafafa;
+ }
.docs-search-bar .mud-input.mud-input-outlined .mud-input-outlined-border {
border: none;
@@ -121,7 +126,7 @@
.mode-links.active {
color: var(--mud-palette-primary);
- background-color: var(--mud-palette-primary-hover)
+ background-color: var(--mud-palette-primary-hover);
}
.mud-nav-link {
@@ -151,9 +156,23 @@
private string _currentSearchText = string.Empty;
private Dictionary? _typeDirectories;
private MudAutocomplete _autocomplete = null!;
+ private bool _isDarkMode;
+ private readonly MudTheme _customTheme = new()
+ {
+ LayoutProperties = new LayoutProperties
+ {
+ DrawerWidthLeft = "400px"
+ }
+ };
private bool ShouldFilter => !string.IsNullOrWhiteSpace(_currentSearchText) && _currentSearchText.Length > 2;
+ private void ToggleTheme() => _isDarkMode = !_isDarkMode;
+
+ private string ThemeIcon => _isDarkMode ? Icons.Material.Filled.LightMode : Icons.Material.Filled.DarkMode;
+
+ private string ThemeLabel => _isDarkMode ? "Switch to light theme" : "Switch to dark theme";
+
private void DocsDrawerToggle() => _drawerOpen = !_drawerOpen;
private void ToggleExpanded()
@@ -254,4 +273,4 @@
return (string?)field.GetValue(null);
}
-}
\ No newline at end of file
+}
diff --git a/src/MudBlazor.UnitTests.Viewer/Shared/MainLayout.razor b/src/MudBlazor.UnitTests.Viewer/Shared/MainLayout.razor
index 235e7bf74689..dc0145162ed6 100644
--- a/src/MudBlazor.UnitTests.Viewer/Shared/MainLayout.razor
+++ b/src/MudBlazor.UnitTests.Viewer/Shared/MainLayout.razor
@@ -1,6 +1,5 @@
@inherits LayoutComponentBase
-
@@ -8,14 +7,6 @@
@Body
@code {
- private readonly MudTheme _customTheme = new()
- {
- LayoutProperties = new LayoutProperties
- {
- DrawerWidthLeft = "400px"
- }
- };
-
static MainLayout()
{
MudGlobal.TooltipDefaults.Delay = TimeSpan.FromMilliseconds(500);
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Charts/HeatMapDynamicFontTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Charts/HeatMapDynamicFontTest.razor
index 0f0b882f00b5..25e18ff1c7a1 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/Charts/HeatMapDynamicFontTest.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Charts/HeatMapDynamicFontTest.razor
@@ -2,7 +2,14 @@
+ XAxisLabels="@_xLabels" Width="100%" Height="350px">
+
+ test
+
+
+ test
+
+
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Chip/ChipHrefCursorTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Chip/ChipHrefCursorTest.razor
deleted file mode 100644
index 7b65bf3bdfae..000000000000
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/Chip/ChipHrefCursorTest.razor
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-@code
-{
- public static string __description__ = "Pointer cursor should be visible when hovering over chip with href set.";
-}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Chip/ChipLinkTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Chip/ChipLinkTest.razor
deleted file mode 100644
index 049d407da8dc..000000000000
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/Chip/ChipLinkTest.razor
+++ /dev/null
@@ -1,12 +0,0 @@
-
-@_event
-@code
-{
- public static string __description__ = "Chip with link";
-
- private string _event = string.Empty;
-
- private void Click() => _event = "OnClick";
-
- private void Close() => _event = "OnClose";
-}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetClearSelectionTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetClearSelectionTest.razor
index bd1c2f0c55ca..334490fb481d 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetClearSelectionTest.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetClearSelectionTest.razor
@@ -14,8 +14,8 @@
else {
Nothing selected.
}
-Set Null
-Set Empty
+Set Null
+Set Empty
@code
{
private IReadOnlyCollection? _selected;
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetKeyboardNavigationTests.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetKeyboardNavigationTests.razor
index 9eca4303bdb9..86aa1d7d9e22 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetKeyboardNavigationTests.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetKeyboardNavigationTests.razor
@@ -11,7 +11,8 @@
var localIndex = i;
+ Text="@_chips[localIndex]"
+ Color="Color.Primary" />
}
Add chip
+ Chips: @_chips.Count | Selected: @_selectedValues.Count
@code {
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetLateDefaultTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetLateDefaultTest.razor
index 100cff23e713..5725d80bb6e6 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetLateDefaultTest.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/ChipSet/ChipSetLateDefaultTest.razor
@@ -5,7 +5,9 @@
}
-Add chips Enable
+
+Add chips
+Enable
@if (_selectedValues is { Count: > 0 }) {
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingContentTest.razor
similarity index 77%
rename from src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingTest.razor
rename to src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingContentTest.razor
index 2901db2d852a..4a1b9c7c228d 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingTest.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingContentTest.razor
@@ -1,6 +1,4 @@
-
-
-
+
@@ -12,7 +10,7 @@
@code {
- private IEnumerable _items = new List();
+ private IEnumerable _items = [];
public record Model (string Name, int Age, Severity Status);
}
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingProgressTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingProgressTest.razor
new file mode 100644
index 000000000000..3509b5c45f75
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridLoadingProgressTest.razor
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+Show Loading
+
+@code {
+ public static string __description__ = "When Loading is set to true, a progress bar should appear in the table header without affecting the striped table rows.";
+
+ private bool _isLoading;
+
+ private IEnumerable _items = [
+ new ("Ash", 19, Severity.Info),
+ new ("Sam", 20, Severity.Info),
+ new ("Max", 20, Severity.Info)
+ ];
+
+ public record Model (string Name, int Age, Severity Status);
+}
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Menu/MenuWithNestingTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Menu/MenuWithNestingTest.razor
index 81711fd3b252..af704ac8d6b4 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/Menu/MenuWithNestingTest.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Menu/MenuWithNestingTest.razor
@@ -1,32 +1,18 @@
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Overlay/OverlayDialogTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Overlay/OverlayDialogTest.razor
new file mode 100644
index 000000000000..edf3653a70fb
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Overlay/OverlayDialogTest.razor
@@ -0,0 +1,39 @@
+@inject IDialogService Dialog
+
+TestPage
+Show dialog with MudSelect
+
+
+
+
+ Item 1
+ Item 2
+ Item 3
+
+
+ First select 1
+ First select 2
+
+
+ Second select 1
+ Second select 2
+
+
+ Third select 1
+ Third select 2
+
+
+ Item 1
+ Item 2
+ Item 3
+
+@code {
+ private string _firstText = string.Empty;
+ private string _secondText = string.Empty;
+ private string _thirdText = string.Empty;
+
+ private Task ShowTestDialogAsync()
+ {
+ return Dialog.ShowAsync("Test title");
+ }
+}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Overlay/OverlayTestDialog.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Overlay/OverlayTestDialog.razor
new file mode 100644
index 000000000000..85dd4afb5ab9
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Overlay/OverlayTestDialog.razor
@@ -0,0 +1,32 @@
+
+
+
+ Item 1
+ Item 2
+ Item 3
+
+
+ First select 1
+ First select 2
+
+
+ Second select 1
+ Second select 2
+
+
+ Third select 1
+ Third select 2
+
+
+ Item 1
+ Item 2
+ Item 3
+
+
+
+
+@code {
+ private string _firstText = string.Empty;
+ private string _secondText = string.Empty;
+ private string _thirdText = string.Empty;
+}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Select/SelectFocusAndTypeTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Select/SelectFocusAndTypeTest.razor
new file mode 100644
index 000000000000..233f52bacecd
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Select/SelectFocusAndTypeTest.razor
@@ -0,0 +1,26 @@
+
+
+
+ @foreach (var state in _states)
+ {
+ @state
+ }
+
+
+@code {
+ string? _value;
+
+ private string[] _states =
+ {
+ "Alabama", "Alaska", "Arizona", "Arkansas", "California",
+ "Colorado", "Connecticut", "Delaware", "Florida", "Georgia",
+ "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas",
+ "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts",
+ "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana",
+ "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",
+ "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma",
+ "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", "South Dakota",
+ "Tennessee", "Texas", "Utah", "Vermont", "Virginia",
+ "Washington", "West Virginia", "Wisconsin", "Wyoming"
+ };
+}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests/Components/ChartTests.cs b/src/MudBlazor.UnitTests/Components/ChartTests.cs
index 4a35eaf2f41b..e05b67d2e707 100644
--- a/src/MudBlazor.UnitTests/Components/ChartTests.cs
+++ b/src/MudBlazor.UnitTests/Components/ChartTests.cs
@@ -4,7 +4,10 @@
using Bunit;
using FluentAssertions;
+using Microsoft.AspNetCore.Components;
+using MudBlazor.Charts;
using MudBlazor.UnitTests.TestComponents.Charts;
+using MudBlazor.Utilities;
using NUnit.Framework;
namespace MudBlazor.UnitTests.Components
@@ -422,5 +425,150 @@ public void HeatMap_ShouldCalculateDynamicFontSize()
fontSize.Should().NotBeNull();
double.Parse(fontSize).Should().BeGreaterThan(0);
}
+
+ [Test]
+ public void HeatMap_ShouldGenerateCorrectColorPaletteForDifferentInputs()
+ {
+ // Single color palette
+ var singleColorOptions = new ChartOptions { ChartPalette = ["#587934"] };
+ var singleColorComp = Context.RenderComponent(parameters => parameters
+ .Add(p => p.ChartType, ChartType.HeatMap)
+ .Add(p => p.ChartOptions, singleColorOptions)
+ .Add(p => p.ChartSeries, [
+ new() { Name = "Series 1", Data = [1, 2, 3] }
+ ])
+ );
+
+ var singleColorPalette = singleColorComp.Instance.ChartOptions.ChartPalette;
+ singleColorPalette.Should().HaveCount(1);
+ singleColorPalette.Should().AllBeOfType();
+
+ // Multi-color palette
+ var multiColorOptions = new ChartOptions { ChartPalette = ["#587934", "#FF0000", "#00FF00"] };
+ var multiColorComp = Context.RenderComponent(parameters => parameters
+ .Add(p => p.ChartType, ChartType.HeatMap)
+ .Add(p => p.ChartOptions, multiColorOptions)
+ .Add(p => p.ChartSeries, [
+ new() { Name = "Series 1", Data = [1, 2, 3] }
+ ])
+ );
+
+ var multiColorPalette = multiColorComp.Instance.ChartOptions.ChartPalette;
+ multiColorPalette.Should().HaveCount(3);
+ multiColorPalette.Should().AllBeOfType();
+ }
+
+ [Test]
+ [TestCase(null, "")]
+ [TestCase(0, "0")]
+ [TestCase(1.23456, "1.234")]
+ [TestCase(1000.123, "1000.")]
+ public void HeatMap_ShouldFormatValuesCorrectly(double? input, string expected)
+ {
+ var series = new List
+ {
+ new() { Name = "Series 1", Data = input.HasValue ? [input.Value] : [] }
+ };
+
+ var options = new ChartOptions { ValueFormatString = "G" };
+
+ var comp = Context.RenderComponent(parameters => parameters
+ .Add(p => p.ChartType, ChartType.HeatMap)
+ .Add(p => p.ChartSeries, series)
+ .Add(p => p.ChartOptions, options)
+ );
+
+ var cellTexts = comp.FindAll(".mud-chart-cell text");
+
+ if (input.HasValue)
+ {
+ cellTexts.Should().NotBeEmpty();
+ cellTexts[0].TextContent.Trim().Should().Be(expected);
+ }
+ else
+ {
+ cellTexts.Should().BeEmpty();
+ }
+ }
+
+ [Test]
+ public void HeatMap_ShouldHandleCustomHeatMapCellOverrides()
+ {
+ static void CellFragment(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder builder)
+ {
+ builder.OpenComponent(0);
+ builder.AddAttribute(1, "Row", 0);
+ builder.AddAttribute(2, "Column", 0);
+ builder.AddAttribute(3, "Value", 10.05);
+ builder.AddAttribute(6, "MudColor", new MudColor("#FF5733"));
+ builder.AddAttribute(7, "ChildContent", (RenderFragment)(childBuilder =>
+ {
+ childBuilder.AddContent(0, "Custom Content");
+ }));
+ builder.CloseComponent();
+ }
+
+ var series = new List
+ {
+ new() { Name = "Series 1", Data = [1, 2, 3] },
+ new() { Name = "Series 2", Data = [4, 5, 6] }
+ };
+
+ var comp = Context.RenderComponent(parameters => parameters
+ .Add(p => p.ChartType, ChartType.HeatMap)
+ .Add(p => p.ChartSeries, series)
+ .AddChildContent(CellFragment) // Add custom cells as child content
+ );
+
+ // Verify that the custom cell content is rendered
+ var customContent = comp.Find(".mud-chart-cell div");
+ customContent.TextContent.Trim().Should().Be("Custom Content");
+
+ // Verify that the custom cell has the correct color
+ var customCell = comp.Find(".mud-chart-cell rect");
+ customCell.GetAttribute("fill").Should().Contain(new MudColor("#FF5733").ToString(MudColorOutputFormats.RGBA));
+
+ // Verify custom value override
+ var customValue = comp.Find(".mud-chart-cell title");
+ customValue.TextContent.Trim().Should().Be("10.05");
+ }
+
+ [Test]
+ public void MudHeatMapCell_ShouldThrowExceptionIfNotInMudChart()
+ {
+ // Attempt to render MudHeatMapCell outside of MudChart
+ var exception = Assert.Throws(() =>
+ Context.RenderComponent(parameters => parameters
+ .Add(p => p.Row, 0)
+ .Add(p => p.Column, 0)
+ )
+ );
+
+ // Verify that the exception message is appropriate
+ exception.Message.Should().Contain("MudHeatMapCell must be used inside a MudChart component.");
+ }
+
+ [TestCase(Position.Top)]
+ [TestCase(Position.Bottom)]
+ [TestCase(Position.Left)]
+ [TestCase(Position.Right)]
+ [TestCase(Position.Start)]
+ [TestCase(Position.End)]
+ [TestCase(Position.Center)]
+ [Test]
+ public void HeatMap_ShouldCorrectBadPositions(Position pos)
+ {
+ var comp = Context.RenderComponent(parameters => parameters
+ .Add(p => p.ChartType, ChartType.HeatMap)
+ .Add(p => p.LegendPosition, pos)
+ .Add(p => p.ChartSeries, [
+ new() { Name = "Series 1", Data = [1, 2, 3] }
+ ])
+ );
+
+ var heatMap = comp.FindComponent();
+ heatMap.Instance._legendPosition.Should().BeOneOf(Position.Top, Position.Bottom, Position.Left, Position.Right);
+ }
+
}
}
diff --git a/src/MudBlazor.UnitTests/Components/ChipSetTests.cs b/src/MudBlazor.UnitTests/Components/ChipSetTests.cs
index f5a6e5ea3cca..24745c75b0c1 100644
--- a/src/MudBlazor.UnitTests/Components/ChipSetTests.cs
+++ b/src/MudBlazor.UnitTests/Components/ChipSetTests.cs
@@ -23,23 +23,23 @@ public void ChipSet_SingleSelection()
{
var comp = Context.RenderComponent();
// initially nothing is selected
- comp.FindAll("div.mud-chip").Count.Should().Be(7);
+ comp.FindAll(".mud-chip").Count.Should().Be(7);
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("Corn flakes");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// de-select cornflakes by clicking again
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("Corn flakes");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select milk
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("Milk");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
}
@@ -63,23 +63,23 @@ public void ChipSet_SingleSelection_Mandatory()
.Add(p => p.SelectionMode, SelectionMode.SingleSelection)
);
// initially nothing is selected
- comp.FindAll("div.mud-chip").Count.Should().Be(7);
+ comp.FindAll(".mud-chip").Count.Should().Be(7);
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("Corn flakes");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// de-select cornflakes by clicking again
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("Corn flakes");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("Corn flakes");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select milk
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("Milk");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
}
@@ -89,31 +89,31 @@ public void ChipSet_MultiSelection()
{
var comp = Context.RenderComponent();
// select elements needed for the test
- comp.FindAll("div.mud-chip").Count.Should().Be(7);
+ comp.FindAll(".mud-chip").Count.Should().Be(7);
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Corn flakes");
// de-select cornflakes by clicking again
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Nothing selected");
// select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Corn flakes");
// select milk
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Corn flakes, Milk");
// select red wine
- comp.FindAll("div.mud-chip")[6].Click();
+ comp.FindAll("button.mud-chip")[6].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Corn flakes, Milk, Red wine");
// de-select milk
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Corn flakes, Red wine");
}
@@ -126,7 +126,7 @@ public void ChipSet_MultiSelection_WithInitialValues()
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Corn flakes, Milk, Red wine");
// de-select milk
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("div.selected-value").TrimmedText().Should().Be("");
comp.Find("div.selected-values").TrimmedText().Should().Be("Corn flakes, Red wine");
}
@@ -139,7 +139,7 @@ public void ChipSet_SingleSelection_WithMultipleDefaultChips()
{
var comp = Context.RenderComponent();
// select elements needed for the test
- comp.FindAll("div.mud-chip").Count.Should().Be(7);
+ comp.FindAll(".mud-chip").Count.Should().Be(7);
comp.Find(".selected-value").TrimmedText().Should().Be("Corn flakes");
}
@@ -147,13 +147,13 @@ public void ChipSet_SingleSelection_WithMultipleDefaultChips()
public void ChipSet_MultiSelection_DefaultChipsShouldBeInitiallySelected()
{
var comp = Context.RenderComponent(p => p.Add(x => x.SelectionMode, SelectionMode.MultiSelection));
- comp.FindAll("div.mud-chip").Count.Should().Be(7);
+ comp.FindAll(".mud-chip").Count.Should().Be(7);
comp.Find(".selected-values").TrimmedText().Should().Be("Corn flakes, Milk");
// de-select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find(".selected-values").TrimmedText().Should().Be("Milk");
// select eggs
- comp.FindAll("div.mud-chip")[1].Click();
+ comp.FindAll("button.mud-chip")[1].Click();
comp.Find(".selected-values").TrimmedText().Should().Be("Eggs, Milk");
}
@@ -164,13 +164,13 @@ public void ChipSet_MultiSelection_DefaultChipsShouldOverrideInitiallySelected()
.Add(x => x.SelectionMode, SelectionMode.MultiSelection)
.Add(x => x.InitialValues, ["Eggs", "Soap"])
);
- comp.FindAll("div.mud-chip").Count.Should().Be(7);
+ comp.FindAll(".mud-chip").Count.Should().Be(7);
comp.Find(".selected-values").TrimmedText().Should().Be("Corn flakes, Eggs, Milk");
// de-select cornflakes
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find(".selected-values").TrimmedText().Should().Be("Eggs, Milk");
// select soap
- comp.FindAll("div.mud-chip")[2].Click();
+ comp.FindAll("button.mud-chip")[2].Click();
comp.Find(".selected-values").TrimmedText().Should().Be("Eggs, Milk, Soap");
}
@@ -179,12 +179,12 @@ public void ChipSet_MultiSelection_LateDefaultChipsShouldBeInitiallySelected()
{
var comp = Context.RenderComponent();
// check that only one item is present
- comp.FindAll("div.mud-chip").Count.Should().Be(1);
+ comp.FindAll(".mud-chip").Count.Should().Be(1);
comp.FindAll("p")[0].TrimmedText().Should().Be("Primary");
// select extra item
- comp.FindAll("button")[0].Click();
+ comp.Find("#enable-button").Click();
// check that extra item is selected
- comp.FindAll("div.mud-chip").Count.Should().Be(2);
+ comp.FindAll(".mud-chip").Count.Should().Be(2);
comp.FindAll("p")[0].TrimmedText().Should().Be("Extra Chip, Primary");
}
@@ -203,9 +203,9 @@ public void ChipSet_ReadOnly()
comp.FindAll("div.mud-ripple").Count.Should().Be(0);
//Click test
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll(".mud-chip")[0].TagName.Should().Be("DIV");
- //Should not throw an error
+ //Should not throw an error because it won't click
comp.FindAll("button.mud-chip-close-button")[0].Click();
chipset.Instance.SelectedValue.Should().Be(null);
@@ -221,36 +221,36 @@ public void ChipSet_SelectedValues_TwoWayBinding()
var comp = Context.RenderComponent();
// initial values check
comp.Find("p.set").TrimmedText().Should().Be("Selection: 1");
- comp.FindComponents>()[0].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[1].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindComponents>()[2].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[3].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[0].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[1].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[2].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[3].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
// change selection and check state of both sets
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("p.set").TrimmedText().Should().Be("Selection:");
- comp.FindComponents>()[0].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindComponents>()[1].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindComponents>()[2].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindComponents>()[3].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindAll("div.mud-chip")[1].Click();
+ comp.FindComponents>()[0].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[1].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[2].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[3].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindAll("button.mud-chip")[1].Click();
comp.Find("p.set").TrimmedText().Should().Be("Selection: 2");
- comp.FindComponents>()[0].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindComponents>()[1].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[2].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindComponents>()[3].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindAll("div.mud-chip")[2].Click();
+ comp.FindComponents>()[0].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[1].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[2].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[3].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindAll("button.mud-chip")[2].Click();
comp.Find("p.set").TrimmedText().Should().Be("Selection: 1, 2");
- comp.FindComponents>()[0].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[1].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[2].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[3].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindAll("div.mud-chip")[3].Click();
+ comp.FindComponents>()[0].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[1].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[2].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[3].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindAll("button.mud-chip")[3].Click();
comp.Find("p.set").TrimmedText().Should().Be("Selection: 1");
- comp.FindComponents>()[0].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[1].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
- comp.FindComponents>()[2].Find("div.mud-chip").ClassList.Should().Contain("mud-chip-selected");
- comp.FindComponents>()[3].Find("div.mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[0].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[1].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindComponents>()[2].Find(".mud-chip").ClassList.Should().Contain("mud-chip-selected");
+ comp.FindComponents>()[3].Find(".mud-chip").ClassList.Should().NotContain("mud-chip-selected");
}
[Test]
@@ -261,7 +261,7 @@ public void ChipSetComparerTest()
comp.Find("p.sel").TrimmedText().Should().Be("Selection:");
// change selection and check state
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("p.sel").TrimmedText().Should().Be("Selection: Cappuccino");
// set new selection and see if the comparer works correctly
@@ -269,11 +269,11 @@ public void ChipSetComparerTest()
comp.Find("p.sel").TrimmedText().Should().Be("Selection: Cafe Latte!, Espresso!");
// change selection and check state
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("p.sel").TrimmedText().Should().Be("Selection: Cafe Latte!, Cappuccino, Espresso!");
// change selection and check state
- comp.FindAll("div.mud-chip")[1].Click();
+ comp.FindAll("button.mud-chip")[1].Click();
comp.Find("p.sel").TrimmedText().Should().Be("Selection: Cappuccino, Espresso!");
}
@@ -284,7 +284,7 @@ public void ChipSet_MultiSelection_AfterChipArraySetNull_ShouldBeAbleToSelectSam
var chipSet = comp.FindComponent>();
// Select one chip
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.WaitForAssertion(() => chipSet.Instance.SelectedValues.Count.Should().Be(1));
comp.FindAll("p")[0].TrimmedText().Should().Be("Milk");
@@ -296,7 +296,7 @@ public void ChipSet_MultiSelection_AfterChipArraySetNull_ShouldBeAbleToSelectSam
comp.FindAll("p")[0].TrimmedText().Should().Be("Nothing selected.");
// Select same chip again
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.WaitForAssertion(() => chipSet.Instance.SelectedValues.Count.Should().Be(1));
comp.FindAll("p")[0].TrimmedText().Should().Be("Milk");
@@ -309,19 +309,19 @@ public void ChipSet_MultiSelection_AfterChipArraySetEmpty_ShouldBeAbleToSelectSa
var chipSet = comp.FindComponent>();
// Select one chip
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.WaitForAssertion(() => chipSet.Instance.SelectedValues.Count.Should().Be(1));
comp.FindAll("p")[0].TrimmedText().Should().Be("Milk");
// Set chip array to empty
- comp.FindAll("button")[1].Click();
+ comp.Find("#set-empty").Click();
comp.WaitForAssertion(() => chipSet.Instance.SelectedValues.Count.Should().Be(0));
comp.FindAll("p")[0].TrimmedText().Should().Be("Nothing selected.");
// Select same chip again
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.WaitForAssertion(() => chipSet.Instance.SelectedValues.Count.Should().Be(1));
comp.FindAll("p")[0].TrimmedText().Should().Be("Milk");
@@ -418,9 +418,9 @@ public void ChipSet_With_NonValueTypes_DoesntCrash()
.AddChildContent>(chip => chip.Add(x => x.Value, b))
.AddChildContent>(chip => chip.Add(x => x.Value, c))
);
- comp.FindAll("div.mud-chip")[1].Click();
+ comp.FindAll("button.mud-chip")[1].Click();
selectedValues.Should().Contain(a).And.Contain(b);
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
selectedValues.Should().NotContain(a).And.Contain(b);
}
@@ -430,32 +430,32 @@ public void Chip_TwoWayBinding_ShouldUpdateSelection()
var comp = Context.RenderComponent();
comp.Find("div.selection").TrimmedText().Should().Be("Add ingredients to your cocktail.");
// initial state
- comp.FindAll("div.mud-chip")[0].ClassList.Should().NotContain("mud-chip-selected");
- comp.FindAll("div.mud-chip")[2].ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[0].ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[2].ClassList.Should().NotContain("mud-chip-selected");
comp.FindAll(".mud-checkbox span")[0].ClassList.Should().Contain("mud-checkbox-false");
comp.FindAll(".mud-checkbox span")[2].ClassList.Should().Contain("mud-checkbox-false");
// click Vodka chip
- comp.FindAll("div.mud-chip")[0].Click();
+ comp.FindAll("button.mud-chip")[0].Click();
comp.Find("div.selection").TrimmedText().Should().Be("Vodka");
- comp.FindAll("div.mud-chip")[0].ClassList.Should().Contain("mud-chip-selected");
- comp.FindAll("div.mud-chip")[2].ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[0].ClassList.Should().Contain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[2].ClassList.Should().NotContain("mud-chip-selected");
comp.FindAll(".mud-checkbox span")[0].ClassList.Should().Contain("mud-checkbox-true");
comp.FindAll(".mud-checkbox span")[2].ClassList.Should().Contain("mud-checkbox-false");
// click Olive checkbox
comp.FindAll("input.mud-checkbox-input")[2].Change(true);
comp.Find("div.selection").TrimmedText().Should().Be("Olive, Vodka");
- comp.FindAll("div.mud-chip")[0].ClassList.Should().Contain("mud-chip-selected");
- comp.FindAll("div.mud-chip")[2].ClassList.Should().Contain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[0].ClassList.Should().Contain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[2].ClassList.Should().Contain("mud-chip-selected");
comp.FindAll(".mud-checkbox span")[0].ClassList.Should().Contain("mud-checkbox-true");
comp.FindAll(".mud-checkbox span")[2].ClassList.Should().Contain("mud-checkbox-true");
// click Vodka checkbox
comp.FindAll("input.mud-checkbox-input")[0].Change(false);
comp.Find("div.selection").TrimmedText().Should().Be("Olive");
- comp.FindAll("div.mud-chip")[0].ClassList.Should().NotContain("mud-chip-selected");
- comp.FindAll("div.mud-chip")[2].ClassList.Should().Contain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[0].ClassList.Should().NotContain("mud-chip-selected");
+ comp.FindAll(".mud-chip")[2].ClassList.Should().Contain("mud-chip-selected");
comp.FindAll(".mud-checkbox span")[0].ClassList.Should().Contain("mud-checkbox-false");
comp.FindAll(".mud-checkbox span")[2].ClassList.Should().Contain("mud-checkbox-true");
}
@@ -477,7 +477,8 @@ public void Should_provide_accessible_keyboard_navigation()
// pressing a chip using Space or Enter should toggle their state
comp.Find("#chip-1").KeyDown(" ");
- comp.Find("#chip-2").KeyDown("Enter");
+ //comp.Find("#chip-2").KeyDown("Enter");
+ comp.Find("#chip-2").Click(); // https://github.com/MudBlazor/MudBlazor/pull/10488#issuecomment-2558409773
comp.FindComponent>().Instance.SelectedValues.Should().HaveCount(2);
// pressing the Delete or Backspace keys should have no impact when the chips are not closable
@@ -488,14 +489,16 @@ public void Should_provide_accessible_keyboard_navigation()
// re-pressing a chip with Space or Enter should un-toggle their state
comp.Find("#chip-1").KeyDown(" ");
- comp.Find("#chip-2").KeyDown("Enter");
+ //comp.Find("#chip-2").KeyDown("Enter");
+ comp.Find("#chip-2").Click(); // https://github.com/MudBlazor/MudBlazor/pull/10488#issuecomment-2558409773
comp.FindComponent>().Instance.SelectedValues.Should().BeNullOrEmpty();
// toggle the chips again, then delete them (the chipset should no longer consider them part of its group, and remove them from selected values)
comp.SetParametersAndRender(parameters => parameters
.Add(p => p.AreChipsClosable, true));
comp.Find("#chip-1").KeyDown(" ");
- comp.Find("#chip-2").KeyDown("Enter");
+ //comp.Find("#chip-2").KeyDown("Enter");
+ comp.Find("#chip-2").Click(); // https://github.com/MudBlazor/MudBlazor/pull/10488#issuecomment-2558409773
comp.FindComponent>().Instance.SelectedValues.Should().HaveCount(2);
// pressing the Delete or Backspace keys should remove the chips from the chipset now that they are closable
diff --git a/src/MudBlazor.UnitTests/Components/ChipTests.cs b/src/MudBlazor.UnitTests/Components/ChipTests.cs
index 9dbc83074602..96f947cdc4ea 100644
--- a/src/MudBlazor.UnitTests/Components/ChipTests.cs
+++ b/src/MudBlazor.UnitTests/Components/ChipTests.cs
@@ -2,13 +2,8 @@
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System;
-using System.Threading.Tasks;
using Bunit;
using FluentAssertions;
-using Microsoft.AspNetCore.Components.Web;
-using MudBlazor.Interfaces;
-using MudBlazor.UnitTests.TestComponents;
using MudBlazor.UnitTests.TestComponents.Chip;
using NUnit.Framework;
@@ -17,17 +12,113 @@ namespace MudBlazor.UnitTests.Components
[TestFixture]
public class ChipTests : BunitTest
{
+ [Test]
+ public void Chip_ShouldRenderDivByDefault()
+ {
+ var comp = Context.RenderComponent>();
+
+ var chip = comp.Find(".mud-chip");
+
+ chip.TagName.Should().Be("DIV");
+
+ chip.GetAttribute("tabindex").Should().Be("-1");
+ chip.GetAttribute("href").Should().BeNull();
+ chip.GetAttribute("target").Should().BeNull();
+ chip.GetAttribute("type").Should().BeNull();
+ chip.GetAttribute("rel").Should().BeNull();
+ }
+
+ [Test]
+ [Combinatorial]
+ public void Chip_ShouldRenderAnchorIfLinkSet(
+ [Values("", "ASDF", "nofollow", "_blank")] string target,
+ [Values(null, "noopener", "nofollow")] string rel)
+ {
+
+ var comp = Context.RenderComponent>(parameters => parameters
+ .Add(p => p.Href, "https://example.com")
+ .Add(p => p.Target, target)
+ .Add(p => p.Rel, rel)
+ );
+
+ var chip = comp.Find(".mud-chip");
+
+ chip.TagName.Should().Be("A");
+
+ chip.GetAttribute("href").Should().Be("https://example.com");
+ chip.GetAttribute("target").Should().Be(target);
+
+ var expectedRel = rel ?? (target == "_blank" ? "noopener" : null);
+ chip.GetAttribute("rel").Should().Be(expectedRel);
+ }
+
+ [Test]
+ [Combinatorial]
+ public void Chip_ShouldRenderButtonAndNotAnchorIfOnClickSet(
+ [Values(null, "", "https://example.com")] string href,
+ [Values(null, "", "ASDF", "_blank")] string target,
+ [Values(null, "", "noopener", "nofollow")] string rel)
+ {
+ var comp = Context.RenderComponent>(parameters => parameters
+ .Add(p => p.OnClick, () => { })
+ .Add(p => p.Href, href)
+ .Add(p => p.Target, target)
+ .Add(p => p.Rel, rel)
+ );
+
+ var chip = comp.Find(".mud-chip");
+
+ chip.TagName.Should().Be("BUTTON");
+
+ chip.GetAttribute("tabindex").Should().Be("0");
+ chip.GetAttribute("type").Should().Be("button");
+ chip.GetAttribute("href").Should().BeNull();
+ chip.GetAttribute("target").Should().BeNull();
+ chip.GetAttribute("rel").Should().BeNull();
+ }
+
+ [Test]
+ public void Chip_ShouldAllowUserDefinedAttributesToOverrideDefaults()
+ {
+ var userAttributes = new Dictionary
+ {
+ { "tabindex", 5 },
+ { "type", "submit" },
+ { "data-test", "testValue" }
+ };
+
+ var comp = Context.RenderComponent>(parameters => parameters
+ .Add(p => p.OnClick, () => { })
+ .Add(p => p.UserAttributes, userAttributes)
+ );
+
+ var chip = comp.Find(".mud-chip");
+
+ // User attributes should take precedence.
+ chip.GetAttribute("tabindex").Should().Be("5");
+ chip.GetAttribute("type").Should().Be("submit");
+ chip.GetAttribute("data-test").Should().Be("testValue");
+ }
+
+ [Test]
+ public void Chip_ShouldRenderAvatar()
+ {
+ var comp = Context.RenderComponent();
+
+ comp.Find("div.mud-chip").InnerHtml.Should().Contain("mud-avatar");
+ }
+
///
/// Clicks on the chip and tests if the OnClick event works
///
[Test]
- public void Chip_OnClick_Test()
+ public void Chip_OnClick()
{
var comp = Context.RenderComponent();
// print the generated html
// chip should have mud-clickable and mud-ripple classes
- var chip = comp.Find("div.mud-chip");
+ var chip = comp.Find("button.mud-chip");
chip.ClassName.Should().Contain("mud-clickable");
chip.ClassName.Should().Contain("mud-ripple");
@@ -42,13 +133,13 @@ public void Chip_OnClick_Test()
/// Clicks on the close button and tests if the OnClose event works
///
[Test]
- public void Chip_OnClose_Test()
+ public void Chip_OnClose()
{
var comp = Context.RenderComponent();
// print the generated html
// chip should have mud-clickable and mud-ripple classes
- var chip = comp.Find("div.mud-chip");
+ var chip = comp.Find("button.mud-chip");
chip.ClassName.Should().Contain("mud-clickable");
chip.ClassName.Should().Contain("mud-ripple");
@@ -58,45 +149,5 @@ public void Chip_OnClose_Test()
var expectedEvent = comp.Find("#chip-click-test-expected-value");
expectedEvent.InnerHtml.Should().Be("OnClose");
}
-
- [Test]
- public async Task Chip_Link_Test()
- {
- var comp = Context.RenderComponent();
- var chip = comp.FindComponent>();
-
- await comp.InvokeAsync(() => ((IMudStateHasChanged)chip.Instance).StateHasChanged());
- await comp.InvokeAsync(() => chip.Instance.OnClickAsync(new MouseEventArgs()));
-
- comp.WaitForAssertion(() => comp.Find("#chip-click-test-expected-value").InnerHtml.Should().Be(""));
-#pragma warning disable BL0005 // Component parameter should not be set outside of its component.
- await comp.InvokeAsync(() => chip.Instance.Target = "_blank");
-#pragma warning restore BL0005 // Component parameter should not be set outside of its component.
- await comp.InvokeAsync(() => chip.Instance.OnClickAsync(new MouseEventArgs()));
-
- comp.WaitForAssertion(() => comp.Find("#chip-click-test-expected-value").InnerHtml.Should().Be(""));
- }
-
- ///
- /// If href set on chip pointer cursor should be visible
- ///
- [Test]
- public void Chip_Href_Cursor_Test()
- {
- var comp = Context.RenderComponent();
-
- // chip should have mud-clickable and mud-ripple classes
- var chip = comp.Find("div.mud-chip");
- chip.ClassName.Should().Contain("mud-clickable");
- chip.ClassName.Should().Contain("mud-ripple");
- }
-
- [Test]
- public void Chip_Should_Render_Avatar_Test()
- {
- var comp = Context.RenderComponent();
-
- comp.Find("div.mud-chip").InnerHtml.Should().Contain("mud-avatar");
- }
}
}
diff --git a/src/MudBlazor.UnitTests/Components/DataGridTests.cs b/src/MudBlazor.UnitTests/Components/DataGridTests.cs
index 5d7015198063..649842a9ee9c 100644
--- a/src/MudBlazor.UnitTests/Components/DataGridTests.cs
+++ b/src/MudBlazor.UnitTests/Components/DataGridTests.cs
@@ -17,6 +17,7 @@
using Microsoft.AspNetCore.Components.Web;
using MudBlazor.Interfaces;
using MudBlazor.UnitTests.TestComponents.DataGrid;
+using MudBlazor.UnitTests.TestComponents.Table;
using MudBlazor.Utilities.Clone;
using NUnit.Framework;
using static Bunit.ComponentParameterFactory;
@@ -2995,14 +2996,45 @@ public void DataGridChildRowContentTest()
}
[Test]
- public void DataGridLoadingTest()
+ public void DataGridLoadingContentTest()
{
- var comp = Context.RenderComponent();
- var dataGrid = comp.FindComponent>();
+ var comp = Context.RenderComponent();
+ var dataGrid = comp.FindComponent>();
dataGrid.Find("th.mud-table-empty-row div").TextContent.Trim().Should().Be("Data loading, please wait...");
}
+ ///
+ /// Verifies that enabling the loading switch adds a new row to the table header without altering the table body.
+ ///
+ [Test]
+ public void DataGridLoadingProgressTest()
+ {
+ // Render the component
+ var comp = Context.RenderComponent();
+
+ // Initial count of header and body rows
+ var initialHeaderRows = comp.FindAll("thead tr");
+ var initialBodyRows = comp.FindAll("tbody tr");
+
+ // Verify initial state: 1 row in the header and 3 rows in the body
+ initialHeaderRows.Count.Should().Be(1);
+ initialBodyRows.Count.Should().Be(3);
+
+ // Toggle the loading switch to the 'loading' state
+ var loadingSwitch = comp.Find("#loadingSwitch");
+ loadingSwitch.Change(true);
+
+ // Count rows after toggling the switch
+ var updatedHeaderRows = comp.FindAll("thead tr");
+ var updatedBodyRows = comp.FindAll("tbody tr");
+
+ // Verify updated state:
+ // 2 rows in the header (original + loading row) and 3 rows in the body (unchanged)
+ updatedHeaderRows.Count.Should().Be(2);
+ updatedBodyRows.Count.Should().Be(3);
+ }
+
[Test]
public void DataGridNoRecordsContentTest()
{
diff --git a/src/MudBlazor.UnitTests/Components/MenuTests.cs b/src/MudBlazor.UnitTests/Components/MenuTests.cs
index 2bc4e550cd4e..a7687f63d3e5 100644
--- a/src/MudBlazor.UnitTests/Components/MenuTests.cs
+++ b/src/MudBlazor.UnitTests/Components/MenuTests.cs
@@ -2,7 +2,6 @@
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-using System.Text.RegularExpressions;
using AngleSharp.Dom;
using Bunit;
using FluentAssertions;
@@ -305,25 +304,14 @@ public void MenuTest_LeftAndRightClick_CheckClosed()
}
[Test]
- [TestCase(true)]
- [TestCase(false)]
- public void MenuItem_Should_RenderIcons(bool dense)
+ public void MenuItem_Should_RenderIcons()
{
- var comp = Context.RenderComponent(parameters => parameters
- .Add(p => p.Dense, dense)
- );
+ var comp = Context.RenderComponent();
comp.Find(".mud-menu-button-activator").Click();
comp.WaitForElement("div.mud-popover-open");
- if (dense)
- {
- comp.FindAll(".mud-menu-list div.mud-menu-item svg.mud-svg-icon.mud-menu-item-icon.mud-icon-size-small").Count.Should().Be(3);
- }
- else
- {
- comp.FindAll(".mud-menu-list div.mud-menu-item svg.mud-svg-icon.mud-menu-item-icon.mud-icon-size-medium").Count.Should().Be(3);
- }
+ comp.FindAll(".mud-menu-list div.mud-menu-item svg.mud-svg-icon.mud-menu-item-icon.mud-icon-size-medium").Count.Should().Be(3);
}
[Test]
@@ -560,5 +548,41 @@ public void ShouldRenderLabelOrChildContent()
comp.FindAll(".mud-menu-item")[2].InnerHtml.Should().Contain("ContentText");
comp.FindAll(".mud-menu-item")[2].InnerHtml.Should().NotContain("LabelText");
}
+
+ [Test]
+ public void OpenNestedMenu()
+ {
+ var comp = Context.RenderComponent();
+
+ // Open the first menu.
+ comp.Find("button:contains('1')").Click();
+ comp.FindAll("div.mud-popover-open").Count.Should().Be(1);
+
+ // Click the nested menu item to open the nested menu.
+ comp.Find("div.mud-menu-item:contains('1.3')").Click();
+
+ // Ensure both the main menu and the nested menu are open
+ comp.FindAll("div.mud-popover-open").Count.Should().Be(2);
+ }
+
+ [Test]
+ public void ClickingMenuItem_ClosesNestedMenu()
+ {
+ var comp = Context.RenderComponent();
+
+ // Open the first menu.
+ comp.Find("button:contains('1')").Click();
+ comp.FindAll("div.mud-popover-open").Count.Should().Be(1);
+
+ // Click the nested menu item to open the nested menu.
+ comp.Find("div.mud-menu-item:contains('1.3')").Click();
+ comp.FindAll("div.mud-popover-open").Count.Should().Be(2);
+
+ // Click a non-nested menu item inside the nested menu.
+ comp.Find("div.mud-menu-item:contains('2.2')").Click();
+
+ // Ensure all popovers are closed.
+ comp.FindAll("div.mud-popover-open").Count.Should().Be(0);
+ }
}
}
diff --git a/src/MudBlazor.UnitTests/Components/ProgressCircularTests.cs b/src/MudBlazor.UnitTests/Components/ProgressCircularTests.cs
new file mode 100644
index 000000000000..67a3d710aa72
--- /dev/null
+++ b/src/MudBlazor.UnitTests/Components/ProgressCircularTests.cs
@@ -0,0 +1,152 @@
+
+using System;
+using System.Globalization;
+using Bunit;
+using FluentAssertions;
+using NUnit.Framework;
+
+namespace MudBlazor.UnitTests.Components
+{
+ [TestFixture]
+ public class ProgressCircularTests : BunitTest
+ {
+ [Test]
+ public void DefaultValues()
+ {
+ var circular = new MudProgressCircular();
+
+ circular.Color.Should().Be(Color.Default);
+ circular.Size.Should().Be(Size.Medium);
+ circular.Indeterminate.Should().BeFalse();
+ circular.Rounded.Should().BeFalse();
+ circular.Min.Should().Be(0.0);
+ circular.Max.Should().Be(100.0);
+ circular.Value.Should().Be(0.0);
+ circular.StrokeWidth.Should().Be(3);
+ }
+
+ [Test]
+ [TestCase(true)]
+ [TestCase(false)]
+ public void DefaultStructure(bool indeterminate)
+ {
+ var minValue = -500;
+ var maxValue = 500;
+ var valueValue = -400;
+ var strokeWidthValue = 50;
+
+ var comp = Context.RenderComponent(x =>
+ {
+ x.Add(y => y.Value, valueValue);
+ x.Add(y => y.Min, minValue);
+ x.Add(y => y.Max, maxValue);
+ x.Add(y => y.StrokeWidth, strokeWidthValue);
+ x.Add(y => y.Class, "my-custom-class");
+ x.Add(y => y.Indeterminate, indeterminate);
+ });
+
+ var container = comp.Find(".my-custom-class");
+ container.GetAttribute("role").Should().Be("progressbar");
+ container.GetAttribute("aria-valuenow").Should().Be(valueValue.ToString());
+ container.GetAttribute("aria-valuemin").Should().Be(minValue.ToString());
+ container.GetAttribute("aria-valuemax").Should().Be(maxValue.ToString());
+ container.GetAttribute("aria-live").Should().Be(
+ indeterminate ?
+ null : "polite");
+ container.ChildElementCount.Should().Be(1);
+
+ var circleContainer = container.Children[0];
+ circleContainer.ClassList.Should().Contain("mud-progress-circular-svg");
+ circleContainer.ChildElementCount.Should().Be(1);
+
+ var circleElement = circleContainer.Children[0];
+ circleElement.ClassList.Should().Contain("mud-progress-circular-circle");
+
+ if (indeterminate)
+ {
+ circleElement.GetAttribute("stroke-width").Should().Be(strokeWidthValue.ToString());
+ circleElement.GetAttribute("style").Should().BeNullOrEmpty();
+ }
+ else
+ {
+ circleElement.GetAttribute("stroke-width").Should().Be(strokeWidthValue.ToString());
+ circleElement.GetAttribute("style").Should().Be("stroke-dasharray: 126; stroke-dashoffset: 113;");
+ }
+ }
+
+ [Test]
+ [TestCase(true)]
+ [TestCase(true)]
+ public void TestClassesForRounded(bool rounded)
+ {
+ var comp = Context.RenderComponent(x => x.Add(y => y.Rounded, rounded));
+
+ var container = comp.Find(".mud-progress-circular-circle");
+
+ if (rounded)
+ {
+ container.ClassList.Should().Contain("mud-progress-circular-circle-rounded");
+ }
+ else
+ {
+ container.ClassList.Should().NotContain("mud-progress-circular-circle-rounded");
+ }
+ }
+
+ [Test]
+ [TestCase(true)]
+ [TestCase(true)]
+ public void TestClassesForIntermediate(bool indeterminate)
+ {
+ var comp = Context.RenderComponent(x => x.Add(y => y.Indeterminate, indeterminate));
+
+ var container = comp.Find(".mud-progress-circular");
+
+ if (indeterminate)
+ {
+ container.ClassList.Should().Contain("mud-progress-indeterminate");
+ }
+ else
+ {
+ container.ClassList.Should().NotContain("mud-progress-static");
+ }
+
+ var circleContainer = comp.Find(".mud-progress-circular-circle");
+
+ if (indeterminate)
+ {
+ circleContainer.ClassList.Should().Contain("mud-progress-indeterminate");
+ }
+ else
+ {
+ circleContainer.ClassList.Should().NotContain("mud-progress-static");
+ }
+ }
+
+ [Test]
+ [TestCase(Size.Large, "large")]
+ [TestCase(Size.Medium, "medium")]
+ [TestCase(Size.Small, "small")]
+ public void TestClassesForSize(Size size, string expectedString)
+ {
+ var comp = Context.RenderComponent(x => x.Add(y => y.Size, size));
+
+ var container = comp.Find(".mud-progress-circular");
+
+ container.ClassList.Should().Contain($"mud-progress-{expectedString}");
+ }
+
+ [Test]
+ [TestCase(Color.Success, "success")]
+ [TestCase(Color.Surface, "surface")]
+ [TestCase(Color.Error, "error")]
+ public void TestClassesForColor(Color color, string expectedString)
+ {
+ var comp = Context.RenderComponent(x => x.Add(y => y.Color, color));
+
+ var container = comp.Find(".mud-progress-circular");
+
+ container.ClassList.Should().Contain($"mud-{expectedString}-text");
+ }
+ }
+}
diff --git a/src/MudBlazor.UnitTests/Components/SelectTests.cs b/src/MudBlazor.UnitTests/Components/SelectTests.cs
index f25ba69c54b8..f09e20770929 100644
--- a/src/MudBlazor.UnitTests/Components/SelectTests.cs
+++ b/src/MudBlazor.UnitTests/Components/SelectTests.cs
@@ -88,6 +88,46 @@ public async Task SelectTest1()
comp.WaitForAssertion(() => @switch.Instance.Value.Should().Be(false));
}
+ [Test]
+ public async Task SelectTest_KeyDown_WhileClosed()
+ {
+ var comp = Context.RenderComponent();
+ var select = comp.FindComponent>();
+
+ //open menu on keydown
+ comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "t", Type = "keydown" }));
+ comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
+ comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Tennessee"));
+
+ //cycle through matching results
+ await Task.Delay(210);
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "t", Type = "keydown" }));
+ comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Texas"));
+ await Task.Delay(210);
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "t", Type = "keydown" }));
+ comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Tennessee"));
+
+ //multi-string search
+ await Task.Delay(210);
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "c", Type = "keydown" }));
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "o", Type = "keydown" }));
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "l", Type = "keydown" }));
+ comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Colorado"));
+
+ //paused search
+ await Task.Delay(210);
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "i", Type = "keydown" }));
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "o", Type = "keydown" }));
+ comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Iowa"));
+
+ await Task.Delay(210);
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "i", Type = "keydown" }));
+ await Task.Delay(210);
+ await comp.InvokeAsync(() => select.Instance.HandleKeyDownAsync(new KeyboardEventArgs() { Key = "o", Type = "keydown" }));
+ comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Ohio"));
+ }
+
///
/// Click should not close the menu and selecting multiple values should update the bindable value with a comma separated list.
///
diff --git a/src/MudBlazor.UnitTests/Components/StepperTests.cs b/src/MudBlazor.UnitTests/Components/StepperTests.cs
index 07190686f5c5..c11100b7d491 100644
--- a/src/MudBlazor.UnitTests/Components/StepperTests.cs
+++ b/src/MudBlazor.UnitTests/Components/StepperTests.cs
@@ -614,9 +614,52 @@ public void ResetButton_ShouldResetActiveStep()
stepper.Instance.GetState(x => x.ActiveIndex).Should().Be(0);
}
+ [Test]
+ public void ResetButton_ShouldTriggerResetStepActionOnAllStepsThenActivateFirstStep()
+ {
+ var cancel = false;
+ var actions = new List();
+ var index = -1;
+ Task OnPreviewInteraction(StepperInteractionEventArgs args)
+ {
+ actions.Add(args.Action);
+ index = args.StepIndex;
+ // ReSharper disable once AccessToModifiedClosure
+ args.Cancel = cancel;
+ return Task.CompletedTask;
+ }
+ var stepper = Context.RenderComponent(self =>
+ {
+ self.Add(x => x.OnPreviewInteraction, OnPreviewInteraction);
+ self.Add(x => x.ShowResetButton, true);
+ self.Add(x => x.NonLinear, true);
+ self.AddChildContent(step => { });
+ self.AddChildContent(step => { });
+ self.AddChildContent(step => { });
+ });
+
+ // clicking next sends Complete action requests to get us in a state that reset is a valid click
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
+ stepper.Find(".mud-stepper-button-next").Click();
+ index.Should().Be(0);
+ actions[0].Should().Be(StepAction.Complete);
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(1);
+ stepper.Find(".mud-stepper-button-next").Click();
+ index.Should().Be(1);
+ actions[1].Should().Be(StepAction.Complete);
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(2);
+
+ // check that clicking reset sends Reset StepAction
+ stepper.Find(".mud-stepper-button-reset").Click();
+ actions[2].Should().Be(StepAction.Reset);
+ actions[3].Should().Be(StepAction.Reset);
+ actions[4].Should().Be(StepAction.Reset);
+ actions[5].Should().Be(StepAction.Activate);
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
+ }
[Test]
- public void Stepper_ControlledNavigationTest()
+ public void NextButton_ShouldTriggerCompleteStepAction()
{
var cancel = false;
var action = StepAction.Reset;
@@ -639,48 +682,128 @@ Task OnPreviewInteraction(StepperInteractionEventArgs args)
self.AddChildContent(step => { });
});
- // check that clicking next sends Complete action requests
+ // clicking next sends Complete action requests
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
stepper.Find(".mud-stepper-button-next").Click();
index.Should().Be(0);
action.Should().Be(StepAction.Complete);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(1);
+ }
+
+ [Test]
+ public void BackButton_ShouldTriggerActivateStepAction()
+ {
+ var cancel = false;
+ var action = StepAction.Reset;
+ var index = -1;
+ Task OnPreviewInteraction(StepperInteractionEventArgs args)
+ {
+ action = args.Action;
+ index = args.StepIndex;
+ // ReSharper disable once AccessToModifiedClosure
+ args.Cancel = cancel;
+ return Task.CompletedTask;
+ }
+ var stepper = Context.RenderComponent(self =>
+ {
+ self.Add(x => x.OnPreviewInteraction, OnPreviewInteraction);
+ self.Add(x => x.ShowResetButton, true);
+ self.Add(x => x.NonLinear, true);
+ self.AddChildContent(step => { });
+ self.AddChildContent(step => { });
+ self.AddChildContent(step => { });
+ });
+
+ // clicking next sends Complete action requests to get us in a state that back is a valid click
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
stepper.Find(".mud-stepper-button-next").Click();
- index.Should().Be(1);
+ index.Should().Be(0);
action.Should().Be(StepAction.Complete);
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(1);
+
+ // check that clicking reset sends Reset StepAction
+ stepper.Find(".mud-stepper-button-previous").Click();
+ index.Should().Be(0);
+ action.Should().Be(StepAction.Activate);
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
+ }
+
+
+ [Test]
+ public void Stepper_ControlledNavigationTest()
+ {
+ var cancel = false;
+ var actions = new List();
+ var index = -1;
+ Task OnPreviewInteraction(StepperInteractionEventArgs args)
+ {
+ actions.Add(args.Action);
+ index = args.StepIndex;
+ // ReSharper disable once AccessToModifiedClosure
+ args.Cancel = cancel;
+ return Task.CompletedTask;
+ }
+ var stepper = Context.RenderComponent(self =>
+ {
+ self.Add(x => x.OnPreviewInteraction, OnPreviewInteraction);
+ self.Add(x => x.ShowResetButton, true);
+ self.Add(x => x.NonLinear, true);
+ self.AddChildContent(step => { });
+ self.AddChildContent(step => { });
+ self.AddChildContent(step => { });
+ });
+
+ // check that clicking next sends Complete action requests
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
+ stepper.Find(".mud-stepper-button-next").Click();
+ index.Should().Be(0);
+ actions[0].Should().Be(StepAction.Complete);
+ stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(1);
+ stepper.Find(".mud-stepper-button-next").Click();
+ index.Should().Be(1);
+ actions[1].Should().Be(StepAction.Complete);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(2);
stepper.Find(".mud-stepper-button-complete").Click();
index.Should().Be(2);
- action.Should().Be(StepAction.Complete);
+ actions[2].Should().Be(StepAction.Complete);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(2);
// cancel next
stepper.Find(".mud-stepper-button-reset").Click();
+ actions[3].Should().Be(StepAction.Reset); // one reset for each step
+ actions[4].Should().Be(StepAction.Reset);
+ actions[5].Should().Be(StepAction.Reset);
+ actions[6].Should().Be(StepAction.Activate);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
cancel = true; // this should cancel the completion of step 1
stepper.Find(".mud-stepper-button-next").Click();
+ actions[7].Should().Be(StepAction.Complete);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
// cancel previous
cancel = false;
stepper.Find(".mud-stepper-button-next").Click(); // go to step2
+ actions[8].Should().Be(StepAction.Complete);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(1);
cancel = true; // this should cancel the activation of step 1
stepper.Find(".mud-stepper-button-previous").Click(); // try to go to step1
index.Should().Be(0);
- action.Should().Be(StepAction.Activate);
+ actions[9].Should().Be(StepAction.Activate);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(1);
// cancel jumping via header click
cancel = false;
stepper.Find(".mud-stepper-button-reset").Click();
+ actions[10].Should().Be(StepAction.Reset); // On reset for each step
+ actions[11].Should().Be(StepAction.Reset);
+ actions[12].Should().Be(StepAction.Reset);
+ actions[13].Should().Be(StepAction.Activate);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
cancel = true; // this should cancel the activation of step 3
stepper.FindAll(".mud-step")[2].Click(); // try to go to step3
index.Should().Be(2);
- action.Should().Be(StepAction.Activate);
+ actions[14].Should().Be(StepAction.Activate);
stepper.Instance.GetState(nameof(MudStepper.ActiveIndex)).Should().Be(0);
-
}
[TestCase(true, true)]
diff --git a/src/MudBlazor.UnitTests/Components/ToggleGroupTests.cs b/src/MudBlazor.UnitTests/Components/ToggleGroupTests.cs
index cbe628e14b47..92a51f2edef6 100644
--- a/src/MudBlazor.UnitTests/Components/ToggleGroupTests.cs
+++ b/src/MudBlazor.UnitTests/Components/ToggleGroupTests.cs
@@ -169,7 +169,6 @@ public void ToggleGroup_ItemRegistration_Test()
{
var comp = Context.RenderComponent>(builder =>
{
- builder.Add(x => x.Rounded, false);
builder.AddChildContent>(item => item.Add(x => x.Value, "a"));
builder.AddChildContent>(item => item.Add(x => x.Value, "b"));
builder.AddChildContent>(item => item.Add(x => x.Value, "c"));
diff --git a/src/MudBlazor.UnitTests/Components/TreeViewTests.cs b/src/MudBlazor.UnitTests/Components/TreeViewTests.cs
index 8860b788b441..7d1fc7817b54 100644
--- a/src/MudBlazor.UnitTests/Components/TreeViewTests.cs
+++ b/src/MudBlazor.UnitTests/Components/TreeViewTests.cs
@@ -1065,7 +1065,7 @@ public void TreeViewAutoExpansionTest()
var comp = Context.RenderComponent(self => self.Add(x => x.AutoExpand, true));
var isExpanded = (string value) => comp.FindComponents>()
.FirstOrDefault(x => x.Instance.Value == value)?.Instance.GetState(nameof(MudTreeViewItem.Expanded));
- var select = (string value) => comp.FindComponents>().FirstOrDefault(x => x.Instance.Text == value)?.Find("div.mud-chip").Click();
+ var select = (string value) => comp.FindComponents>().FirstOrDefault(x => x.Instance.Text == value)?.Find("button.mud-chip").Click();
isExpanded("C:").Should().Be(false);
isExpanded("config").Should().Be(false);
isExpanded("launch.json").Should().Be(false);
@@ -1105,7 +1105,7 @@ public void TreeViewAutoExpansion_ShouldNot_ExpandNonExpandableItems()
var comp = Context.RenderComponent(self => self.Add(x => x.AutoExpand, true).Add(x => x.ConfigCanExpand, false));
var isExpanded = (string value) => comp.FindComponents>()
.FirstOrDefault(x => x.Instance.Value == value)?.Instance.GetState(nameof(MudTreeViewItem.Expanded));
- var select = (string value) => comp.FindComponents>().FirstOrDefault(x => x.Instance.Text == value)?.Find("div.mud-chip").Click();
+ var select = (string value) => comp.FindComponents>().FirstOrDefault(x => x.Instance.Text == value)?.Find("button.mud-chip").Click();
isExpanded("C:").Should().Be(false);
isExpanded("config").Should().Be(false);
isExpanded("launch.json").Should().Be(false);
diff --git a/src/MudBlazor.UnitTests/Components/UserAttributes/UserAttributesTests.cs b/src/MudBlazor.UnitTests/Components/UserAttributes/UserAttributesTests.cs
index d88df2e7a699..67309a85b955 100644
--- a/src/MudBlazor.UnitTests/Components/UserAttributes/UserAttributesTests.cs
+++ b/src/MudBlazor.UnitTests/Components/UserAttributes/UserAttributesTests.cs
@@ -46,7 +46,7 @@ public void AllMudComponents_ShouldForwardUserAttributes()
// these components do not need to have user attributes
var excludedComponents = new HashSet()
{
- nameof(MudPopover), nameof(MudStep), nameof(MudContextualActionBar),
+ nameof(MudPopover), nameof(MudStep), nameof(MudContextualActionBar), nameof(MudHeatMapCell),
"Column`1", "FooterCell`1", "HeaderCell`1", "FilterHeaderCell`1", "SelectColumn`1",
"HierarchyColumn`1", "PropertyColumn`2", "TemplateColumn`1",
};
@@ -75,7 +75,7 @@ private Type[] GetMudComponentTypes()
.ToArray();
}
- private static ConcurrentBag _excludedComponents = new();
+ private static ConcurrentBag _excludedComponents = [];
private static void Exclude(Type componentType) => _excludedComponents.Add(componentType);
}
}
diff --git a/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj b/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj
index 09fa34e28e77..48935cf25b52 100644
--- a/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj
+++ b/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj
@@ -16,7 +16,7 @@
-
+
runtime; build; native; contentfiles; analyzers; buildtransitive
all
@@ -28,7 +28,7 @@
-
+
diff --git a/src/MudBlazor.UnitTests/Utilities/BindingConverterTests.cs b/src/MudBlazor.UnitTests/Utilities/BindingConverterTests.cs
index b34942fb4fc7..80aae79cc244 100644
--- a/src/MudBlazor.UnitTests/Utilities/BindingConverterTests.cs
+++ b/src/MudBlazor.UnitTests/Utilities/BindingConverterTests.cs
@@ -2,10 +2,12 @@
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
+using System;
using System.Drawing;
using System.Globalization;
using System.Text.Json;
using FluentAssertions;
+using MudBlazor.Resources;
using NUnit.Framework;
namespace MudBlazor.UnitTests.Utilities
@@ -13,98 +15,69 @@ namespace MudBlazor.UnitTests.Utilities
[TestFixture]
public class BindingConverterTests
{
-
[Test]
- public void GlobalConverterTests()
+ public void BaseConverter_ErrorCases()
{
- var c10 = new DefaultConverter();
- DefaultConverter.GlobalGetFunc = x => $"[{x.X},{x.Y}]";
- DefaultConverter.GlobalSetFunc = x => { var tmp = JsonSerializer.Deserialize(x); return new Point(tmp[0], tmp[1]); };
+ string errorMessage = LanguageResource.Converter_ConversionFailed;
+
+ // Test null
+ var c1 = new Converter