diff --git a/.github/workflows/deploy-mudblazor-nuget.yml b/.github/workflows/deploy-mudblazor-nuget.yml
index 5274598fb1dc..578e7f4868e6 100644
--- a/.github/workflows/deploy-mudblazor-nuget.yml
+++ b/.github/workflows/deploy-mudblazor-nuget.yml
@@ -55,6 +55,12 @@ jobs:
- name: Pack nuget package
run: dotnet pack -c Release --output nupkgs /p:Version=${{ needs.get-version.outputs.VERSION }}
working-directory: ./src/MudBlazor
+ - name: Check package contains css
+ shell: pwsh
+ run: ./tools/CheckPackageContainsStaticAssets.ps1 ./src/MudBlazor/nupkgs MudBlazor.min.css
+ - name: Check package contains js
+ shell: pwsh
+ run: ./tools/CheckPackageContainsStaticAssets.ps1 ./src/MudBlazor/nupkgs MudBlazor.min.js
- name: Publish nuget package
run: dotnet nuget push nupkgs/*.nupkg -k ${{ secrets.NUGET_KEY }} -s https://api.nuget.org/v3/index.json --skip-duplicate
working-directory: ./src/MudBlazor
diff --git a/src/MudBlazor.Docs/MudBlazor.Docs.csproj b/src/MudBlazor.Docs/MudBlazor.Docs.csproj
index 1720930ebc5e..9ad837cd1b22 100644
--- a/src/MudBlazor.Docs/MudBlazor.Docs.csproj
+++ b/src/MudBlazor.Docs/MudBlazor.Docs.csproj
@@ -83,7 +83,7 @@
-
+
all
diff --git a/src/MudBlazor.Docs/Pages/Components/AppBar/Examples/AppBarMenuExample.razor b/src/MudBlazor.Docs/Pages/Components/AppBar/Examples/AppBarMenuExample.razor
index 17367150ebf9..32977fdc1be0 100644
--- a/src/MudBlazor.Docs/Pages/Components/AppBar/Examples/AppBarMenuExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/AppBar/Examples/AppBarMenuExample.razor
@@ -33,8 +33,4 @@
-
-
-@code {
-
-}
+
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/BreakpointProvider/Examples/BreakpointProviderPageHiddenExample.razor b/src/MudBlazor.Docs/Pages/Components/BreakpointProvider/Examples/BreakpointProviderPageHiddenExample.razor
index afcf469e1756..d7c66a3f22f7 100644
--- a/src/MudBlazor.Docs/Pages/Components/BreakpointProvider/Examples/BreakpointProviderPageHiddenExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/BreakpointProvider/Examples/BreakpointProviderPageHiddenExample.razor
@@ -67,5 +67,4 @@
@code {
private int _amountOfRows = 2;
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselBindingExample.razor b/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselBindingExample.razor
index 5456eabeef23..a074c4d29939 100644
--- a/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselBindingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselBindingExample.razor
@@ -50,7 +50,5 @@
await Task.Delay(1);
_carousel.MoveTo(System.Math.Max(System.Math.Min(index, _source.Count - 1), 0));
}
-
}
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselTemplatesExample.razor b/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselTemplatesExample.razor
index a2df1691160c..3f7f0209ff5f 100644
--- a/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselTemplatesExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Carousel/Examples/CarouselTemplatesExample.razor
@@ -39,6 +39,4 @@
-
-
-@code { }
+
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/DonutExample1.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/DonutExample1.razor
index ffd0a698c6c8..d54c4c947107 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/DonutExample1.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/DonutExample1.razor
@@ -37,6 +37,7 @@
RandomizeData();
}
}
+
void RemoveDataSize()
{
if (dataSize > 0)
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExample1.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExample1.razor
index 8c86f3b6cf5d..ed73832d7e72 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExample1.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExample1.razor
@@ -21,5 +21,4 @@
new ChartSeries() { Name = "Renewable", Data = new double[] { 10, 41, 35, 51, 49, 62, 69, 91, 148 } },
};
public string[] XAxisLabels = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep" };
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExampleInterpolation.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExampleInterpolation.razor
index a61c6b72211d..0231de2dda74 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExampleInterpolation.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/LineExampleInterpolation.razor
@@ -48,6 +48,4 @@
options.InterpolationOption = interpolationOption;
StateHasChanged();
}
-
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/PieExample1.razor b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/PieExample1.razor
index f869a5b61edc..08cca2c9e25f 100644
--- a/src/MudBlazor.Docs/Pages/Components/Charts/Examples/PieExample1.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Charts/Examples/PieExample1.razor
@@ -37,6 +37,7 @@
RandomizeData();
}
}
+
void RemoveDataSize()
{
if (dataSize > 0)
diff --git a/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatFullExample.razor b/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatFullExample.razor
index cfca5b35c718..80ccdb130425 100644
--- a/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatFullExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatFullExample.razor
@@ -59,4 +59,4 @@
private Variant _variant = Variant.Text;
private Color _selectedColor = Color.Default;
private ChatArrowPosition _selectedArrowPosition = ChatArrowPosition.Top;
- }
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatHoverExample.razor b/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatHoverExample.razor
index 95a24ef4eaf6..683e790ed187 100644
--- a/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatHoverExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/ChatBubble/Examples/ChatHoverExample.razor
@@ -77,26 +77,26 @@
@@ -236,5 +236,4 @@
public int Cries { get; set; } = Cries;
public int Angers { get; set; } = Angers;
}
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Checkbox/Examples/CheckboxConversionExample.razor b/src/MudBlazor.Docs/Pages/Components/Checkbox/Examples/CheckboxConversionExample.razor
index 78236389e948..22f0c1a9f8b9 100644
--- a/src/MudBlazor.Docs/Pages/Components/Checkbox/Examples/CheckboxConversionExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Checkbox/Examples/CheckboxConversionExample.razor
@@ -79,4 +79,5 @@
return null;
}
}
- } }
\ No newline at end of file
+ }
+}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetAddRemoveExample.razor b/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetAddRemoveExample.razor
index 1bdb400ca061..e8269619c448 100644
--- a/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetAddRemoveExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetAddRemoveExample.razor
@@ -7,7 +7,7 @@
- Add chip
+ Add chip
diff --git a/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetChipBindingExample.razor b/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetChipBindingExample.razor
index 9fd0ccd8207e..67c6c7e58dc8 100644
--- a/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetChipBindingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/ChipSet/Examples/ChipSetChipBindingExample.razor
@@ -31,6 +31,5 @@
private string[] _ingredients = ["Vodka", "Tomato Juice", "Olive", "Peppermint", "Vermouth", "Coconut Milk", "Port Wine"];
private bool[] _included = new bool[7];
private IReadOnlyCollection _selected;
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridColumReorderingExample.razor b/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridColumReorderingExample.razor
index 9fb41b6eb9ed..21d69343bf97 100644
--- a/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridColumReorderingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridColumReorderingExample.razor
@@ -36,5 +36,4 @@
{
_elements = await httpClient.GetFromJsonAsync>("webapi/periodictable");
}
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridSortingExample.razor b/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridSortingExample.razor
index 23c1492747a3..c1d3b2448ee2 100644
--- a/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridSortingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/DataGrid/Examples/DataGridSortingExample.razor
@@ -11,11 +11,11 @@
-
-
- @context.Item.Sign - @context.Item.Name
-
-
+
+
+ @context.Item.Sign - @context.Item.Name
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorExample.razor b/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorExample.razor
index 4d7b955186b8..46b88d7cc1fe 100644
--- a/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorExample.razor
@@ -3,15 +3,15 @@
@for (int i = 1; i < 4; i++)
- {
- var dropzone = i.ToString();
-
+ {
+ var dropzone = i.ToString();
+
- Drop Zone @dropzone
-
-
-
- }
+ Drop Zone @dropzone
+
+
+
+ }
diff --git a/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorReorderingExample.razor b/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorReorderingExample.razor
index 16a0fde290d9..9213d9ff8f18 100644
--- a/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorReorderingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/DropZone/Examples/DropZoneItemSelectorReorderingExample.razor
@@ -3,15 +3,15 @@
@for (int i = 1; i < 4; i++)
- {
- var dropzone = i.ToString();
-
+ {
+ var dropzone = i.ToString();
+
- Drop Zone @dropzone
-
-
-
- }
+ Drop Zone @dropzone
+
+
+
+ }
diff --git a/src/MudBlazor.Docs/Pages/Components/Element/Examples/MudElementChangingExample.razor b/src/MudBlazor.Docs/Pages/Components/Element/Examples/MudElementChangingExample.razor
index f25aa143cf8c..342927930bf4 100644
--- a/src/MudBlazor.Docs/Pages/Components/Element/Examples/MudElementChangingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Element/Examples/MudElementChangingExample.razor
@@ -19,11 +19,10 @@
index = (index + 1) % tags.Length;
htmlTag = tags[index];
}
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/FileUpload/Examples/FileUploadDragAndDropWithFormValidationExample.razor b/src/MudBlazor.Docs/Pages/Components/FileUpload/Examples/FileUploadDragAndDropWithFormValidationExample.razor
index 435fa39a7f99..a07bef172c01 100644
--- a/src/MudBlazor.Docs/Pages/Components/FileUpload/Examples/FileUploadDragAndDropWithFormValidationExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/FileUpload/Examples/FileUploadDragAndDropWithFormValidationExample.razor
@@ -1,6 +1,6 @@
-@using FluentValidation
+@namespace MudBlazor.Docs.Examples
-@namespace MudBlazor.Docs.Examples
+@using FluentValidation
@inject ISnackbar Snackbar
diff --git a/src/MudBlazor.Docs/Pages/Components/Form/Examples/EditFormExample.razor b/src/MudBlazor.Docs/Pages/Components/Form/Examples/EditFormExample.razor
index 6ab9ad5fa38c..f462cf1eb948 100644
--- a/src/MudBlazor.Docs/Pages/Components/Form/Examples/EditFormExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Form/Examples/EditFormExample.razor
@@ -74,5 +74,4 @@
success = true;
StateHasChanged();
}
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Form/Examples/MudFormExample.razor b/src/MudBlazor.Docs/Pages/Components/Form/Examples/MudFormExample.razor
index 773befb1ba06..deb5f54fd30e 100644
--- a/src/MudBlazor.Docs/Pages/Components/Form/Examples/MudFormExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Form/Examples/MudFormExample.razor
@@ -75,5 +75,4 @@
return "Passwords don't match";
return null;
}
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Form/Examples/ValidateIfDirtyExample.razor b/src/MudBlazor.Docs/Pages/Components/Form/Examples/ValidateIfDirtyExample.razor
index 1b3c3cf44d51..d709ddd53188 100644
--- a/src/MudBlazor.Docs/Pages/Components/Form/Examples/ValidateIfDirtyExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Form/Examples/ValidateIfDirtyExample.razor
@@ -18,5 +18,4 @@
-
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Grid/Examples/GridBuilderExample.razor b/src/MudBlazor.Docs/Pages/Components/Grid/Examples/GridBuilderExample.razor
index bd57fabf70e6..ec9c7172a52c 100644
--- a/src/MudBlazor.Docs/Pages/Components/Grid/Examples/GridBuilderExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Grid/Examples/GridBuilderExample.razor
@@ -71,5 +71,4 @@
StateHasChanged();
}
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Highlighter/Examples/HighlighterWithTableExample.razor b/src/MudBlazor.Docs/Pages/Components/Highlighter/Examples/HighlighterWithTableExample.razor
index a888d51425b8..808c5fc5f25a 100644
--- a/src/MudBlazor.Docs/Pages/Components/Highlighter/Examples/HighlighterWithTableExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Highlighter/Examples/HighlighterWithTableExample.razor
@@ -19,7 +19,6 @@
-
@code {
diff --git a/src/MudBlazor.Docs/Pages/Components/Image/Examples/ImagePlaygroundExample.razor b/src/MudBlazor.Docs/Pages/Components/Image/Examples/ImagePlaygroundExample.razor
index 4da3b732c3d9..8b4327031c69 100644
--- a/src/MudBlazor.Docs/Pages/Components/Image/Examples/ImagePlaygroundExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Image/Examples/ImagePlaygroundExample.razor
@@ -46,5 +46,4 @@
public int ImageWidth { get; set; } = 300;
public ObjectFit ImageFit { get; set; } = ObjectFit.Cover;
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuAdvancedPopoverExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuAdvancedPopoverExample.razor
index 59ff113c6668..593cd341990c 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuAdvancedPopoverExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuAdvancedPopoverExample.razor
@@ -115,5 +115,4 @@
return $"absolute mud-height-full mud-width-full d-flex ma-n3 {align} {justify}";
}
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuContextMenuExample.razor b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuContextMenuExample.razor
index f84d20831321..20cab0c0edea 100644
--- a/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuContextMenuExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Menu/Examples/MenuContextMenuExample.razor
@@ -7,7 +7,7 @@
Peninsula in Europe
-
+
diff --git a/src/MudBlazor.Docs/Pages/Components/MessageBox/Examples/MessageBoxSimpleExample.razor b/src/MudBlazor.Docs/Pages/Components/MessageBox/Examples/MessageBoxSimpleExample.razor
index fab7cdf079b6..6aeeaeffb3bd 100644
--- a/src/MudBlazor.Docs/Pages/Components/MessageBox/Examples/MessageBoxSimpleExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/MessageBox/Examples/MessageBoxSimpleExample.razor
@@ -10,7 +10,6 @@
string state = "Message box hasn't been opened yet";
-
private async void OnButtonClicked()
{
bool? result = await DialogService.ShowMessageBox(
diff --git a/src/MudBlazor.Docs/Pages/Components/NumericField/NumericFieldPage.razor b/src/MudBlazor.Docs/Pages/Components/NumericField/NumericFieldPage.razor
index 399c96bc6c76..66ea7b184816 100644
--- a/src/MudBlazor.Docs/Pages/Components/NumericField/NumericFieldPage.razor
+++ b/src/MudBlazor.Docs/Pages/Components/NumericField/NumericFieldPage.razor
@@ -5,6 +5,15 @@
+
+ By default, the following rules are enforced:
+
+ Decimal Separator: Always uses a dot (.) as the decimal separator, regardless of the user's culture.
+ Thousands Separator: Does not support thousands separators (e.g., no commas or spaces for grouping digits).
+ Input Format: The expected format is [-]digits[.digits], which is language-neutral and not localized.
+
+ Define your preferred Culture or Format for alternative input options
+
Numeric fields are just like text fields but work well with numeric values of any type. The input is automatically restricted to numeric values and it works regardless of the browser locale settings for decimal types.
diff --git a/src/MudBlazor.Docs/Pages/Components/Stepper/Examples/StepperDynamicExample.razor b/src/MudBlazor.Docs/Pages/Components/Stepper/Examples/StepperDynamicExample.razor
index 307bd6050ec4..49f0f317ee42 100644
--- a/src/MudBlazor.Docs/Pages/Components/Stepper/Examples/StepperDynamicExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Stepper/Examples/StepperDynamicExample.razor
@@ -38,5 +38,4 @@
{
_steps.Remove(_steps[^1]);
}
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Switch/Examples/SwitchConversionExample.razor b/src/MudBlazor.Docs/Pages/Components/Switch/Examples/SwitchConversionExample.razor
index 71f3309650e3..1e16572c6c58 100644
--- a/src/MudBlazor.Docs/Pages/Components/Switch/Examples/SwitchConversionExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Switch/Examples/SwitchConversionExample.razor
@@ -108,4 +108,5 @@
}
}
- } }
\ No newline at end of file
+ }
+}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableBasicExample.razor b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableBasicExample.razor
index 87b999977f76..81975a5fae41 100644
--- a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableBasicExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableBasicExample.razor
@@ -32,5 +32,4 @@
{
Elements = await httpClient.GetFromJsonAsync>("webapi/periodictable");
}
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableMultiGroupingExample.razor b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableMultiGroupingExample.razor
index e9970505a917..858dc5688957 100644
--- a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableMultiGroupingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableMultiGroupingExample.razor
@@ -80,5 +80,4 @@
{
Elements = await httpClient.GetFromJsonAsync>("webapi/periodictable");
}
-
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableRelationalExample.razor b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableRelationalExample.razor
index a2aa06f6b4c3..531d1993049d 100644
--- a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableRelationalExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableRelationalExample.razor
@@ -1,129 +1,132 @@
@namespace MudBlazor.Docs.Examples
-
-
-
-
-
-
-
-
- Nr
- Name
- Age
-
-
- @((context.ShowDetails == true)? "Hide" : "Show") Address Details
- @context.Number
- @context.Name
- @context.Age
-
-
- @if (context.ShowDetails)
- {
-
-
-
-
-
- Address Details for @context.Name
-
-
-
-
-
-
-
-
-
-
- Address Line 1
- Address Line 2
- Postal Code
-
-
- @AddressContext.Address_Line_1
- @AddressContext.Address_Line_2
- @AddressContext.Postal_Code
-
-
-
-
-
-
- }
-
+
+
+
+
+
+
+
+
+ Nr
+ Name
+ Age
+
+
+ @((context.ShowDetails == true)? "Hide" : "Show") Address Details
+ @context.Number
+ @context.Name
+ @context.Age
+
+
+ @if (context.ShowDetails)
+ {
+
+
+
+
+
+ Address Details for @context.Name
+
+
+
+
+
+
+
+
+
+
+ Address Line 1
+ Address Line 2
+ Postal Code
+
+
+ @AddressContext.Address_Line_1
+ @AddressContext.Address_Line_2
+ @AddressContext.Postal_Code
+
+
+
+
+
+
+ }
+
@code
{
- protected override void OnInitialized()
- {
- FillPeople();
- }
+ protected override void OnInitialized()
+ {
+ FillPeople();
+ }
- public class Address
- {
- public string Address_Line_1 { get; set; }
- public string Address_Line_2 { get; set; }
- public int Postal_Code { get; set; }
- }
- public class Person
- {
- public bool ShowDetails { get; set; }
- public int Number { get; set; }
- public string Name { get; set; }
- public int Age { get; set; }
- public IList Addresses { get; set; }
- }
- private void FillPeople()
- {
- IList people = new List();
- IList addresses = new List();
- addresses.Add(new Address { Address_Line_1 = "4 Privet Drive", Address_Line_2 = "Little Whinging", Postal_Code = 111 });
- addresses.Add(new Address { Address_Line_1 = "12 Grimmauld Place", Address_Line_2 = "The Burrow", Postal_Code = 333 });
- people.Add(new Person
- {
- ShowDetails = false,
- Number = 1,
- Name = "Harry Potter",
- Age = 11,
- Addresses = addresses
- });
+ public class Address
+ {
+ public string Address_Line_1 { get; set; }
+ public string Address_Line_2 { get; set; }
+ public int Postal_Code { get; set; }
+ }
- addresses = new List();
- addresses.Add(new Address { Address_Line_1 = "123 Pikachu Lane", Address_Line_2 = "Pallet Town", Postal_Code = 777 });
- addresses.Add(new Address { Address_Line_1 = "456 Mew Street", Address_Line_2 = "Pallet Town", Postal_Code = 999 });
- people.Add(new Person
- {
- ShowDetails = false,
- Number = 2,
- Name = "Ash Ketchum",
- Age = 18,
- Addresses = addresses
- });
- People = people;
+ public class Person
+ {
+ public bool ShowDetails { get; set; }
+ public int Number { get; set; }
+ public string Name { get; set; }
+ public int Age { get; set; }
+ public IList Addresses { get; set; }
+ }
- addresses = new List();
- addresses.Add(new Address { Address_Line_1 = "123 Shire Lane", Address_Line_2 = "Bag End", Postal_Code = 223 });
- addresses.Add(new Address { Address_Line_1 = "456 Shire Street", Address_Line_2 = "Bag End", Postal_Code = 445 });
- addresses.Add(new Address { Address_Line_1 = "789 Shire Avenue", Address_Line_2 = "Bag End", Postal_Code = 667 });
- people.Add(new Person
- {
- ShowDetails = true,
- Number = 3,
- Name = "Frodo Baggins",
- Age = 24,
- Addresses = addresses
- });
- People = people;
- }
- private static IEnumerable People { get; set; }
+ private void FillPeople()
+ {
+ IList people = new List();
+ IList addresses = new List();
+ addresses.Add(new Address { Address_Line_1 = "4 Privet Drive", Address_Line_2 = "Little Whinging", Postal_Code = 111 });
+ addresses.Add(new Address { Address_Line_1 = "12 Grimmauld Place", Address_Line_2 = "The Burrow", Postal_Code = 333 });
+ people.Add(new Person
+ {
+ ShowDetails = false,
+ Number = 1,
+ Name = "Harry Potter",
+ Age = 11,
+ Addresses = addresses
+ });
- private void ShowBtnPress(int nr)
- {
- Person tmpPerson = People.First(f => f.Number == nr);
- tmpPerson.ShowDetails = !tmpPerson.ShowDetails;
- }
+ addresses = new List();
+ addresses.Add(new Address { Address_Line_1 = "123 Pikachu Lane", Address_Line_2 = "Pallet Town", Postal_Code = 777 });
+ addresses.Add(new Address { Address_Line_1 = "456 Mew Street", Address_Line_2 = "Pallet Town", Postal_Code = 999 });
+ people.Add(new Person
+ {
+ ShowDetails = false,
+ Number = 2,
+ Name = "Ash Ketchum",
+ Age = 18,
+ Addresses = addresses
+ });
+ People = people;
+
+ addresses = new List();
+ addresses.Add(new Address { Address_Line_1 = "123 Shire Lane", Address_Line_2 = "Bag End", Postal_Code = 223 });
+ addresses.Add(new Address { Address_Line_1 = "456 Shire Street", Address_Line_2 = "Bag End", Postal_Code = 445 });
+ addresses.Add(new Address { Address_Line_1 = "789 Shire Avenue", Address_Line_2 = "Bag End", Postal_Code = 667 });
+ people.Add(new Person
+ {
+ ShowDetails = true,
+ Number = 3,
+ Name = "Frodo Baggins",
+ Age = 24,
+ Addresses = addresses
+ });
+ People = people;
+ }
+
+ private static IEnumerable People { get; set; }
+
+ private void ShowBtnPress(int nr)
+ {
+ Person tmpPerson = People.First(f => f.Number == nr);
+ tmpPerson.ShowDetails = !tmpPerson.ShowDetails;
+ }
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableVirtualizationExample.razor b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableVirtualizationExample.razor
index 0a22294a740a..80b54c63e049 100644
--- a/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableVirtualizationExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Table/Examples/TableVirtualizationExample.razor
@@ -27,7 +27,6 @@
public string Column5 { get; set; }
}
-
private List _items;
protected override void OnInitialized()
diff --git a/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsBindingExample.razor b/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsBindingExample.razor
index cbe06334b863..cae679d27575 100644
--- a/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsBindingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsBindingExample.razor
@@ -9,6 +9,6 @@
@($"Active Index: {activeIndex}")
@code
- {
+{
int activeIndex = 2;
}
diff --git a/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsWithBagdesExample.razor b/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsWithBagdesExample.razor
index f9794cd859ec..b862d509e1ea 100644
--- a/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsWithBagdesExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Tabs/Examples/TabsWithBagdesExample.razor
@@ -6,18 +6,21 @@
+
-
+
+
-
+
+
diff --git a/src/MudBlazor.Docs/Pages/Components/TextField/Examples/TextFieldBindingExample.razor b/src/MudBlazor.Docs/Pages/Components/TextField/Examples/TextFieldBindingExample.razor
index ab2742f694ca..37740191d081 100644
--- a/src/MudBlazor.Docs/Pages/Components/TextField/Examples/TextFieldBindingExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/TextField/Examples/TextFieldBindingExample.razor
@@ -32,5 +32,4 @@
element = new Atom { Name = "Hydrogen", Mass = 1.00794, Electrons = 1, Changed = DateTime.Today };
StateHasChanged();
}
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/TimePicker/Examples/TimePickerReadOnlyExample.razor b/src/MudBlazor.Docs/Pages/Components/TimePicker/Examples/TimePickerReadOnlyExample.razor
index a2ebf3c2a5fa..5cad5aa6f0f0 100644
--- a/src/MudBlazor.Docs/Pages/Components/TimePicker/Examples/TimePickerReadOnlyExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/TimePicker/Examples/TimePickerReadOnlyExample.razor
@@ -6,5 +6,4 @@
@code{
private TimeSpan? _time = new TimeSpan(00, 45, 00);
private bool _readOnly;
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/Timeline/Examples/TimelineAlignExample.razor b/src/MudBlazor.Docs/Pages/Components/Timeline/Examples/TimelineAlignExample.razor
index e4659a45b7bc..76f1e9a065ab 100644
--- a/src/MudBlazor.Docs/Pages/Components/Timeline/Examples/TimelineAlignExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/Timeline/Examples/TimelineAlignExample.razor
@@ -46,5 +46,4 @@
@code{
private TimelineAlign _timelineAlign { get; set; } = TimelineAlign.Start;
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleCustomContentExample.razor b/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleCustomContentExample.razor
index ed3deea7ae9f..02e729db3092 100644
--- a/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleCustomContentExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/ToggleGroup/Examples/ToggleCustomContentExample.razor
@@ -34,6 +34,6 @@
.ellipsis {
overflow: hidden;
white-space: nowrap;
- text-overflow: ellipsis
+ text-overflow: ellipsis;
}
diff --git a/src/MudBlazor.Docs/Pages/Components/TreeView/Examples/TreeViewServerExample.razor b/src/MudBlazor.Docs/Pages/Components/TreeView/Examples/TreeViewServerExample.razor
index 687898481daf..8226ce899bf8 100644
--- a/src/MudBlazor.Docs/Pages/Components/TreeView/Examples/TreeViewServerExample.razor
+++ b/src/MudBlazor.Docs/Pages/Components/TreeView/Examples/TreeViewServerExample.razor
@@ -58,5 +58,4 @@
// if you don't do this you loose already loaded children on next render update
treeItemData.Children = children?.ToList();
}
-
}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj b/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj
index 6286cc361569..252a9f5ccdc7 100644
--- a/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj
+++ b/src/MudBlazor.UnitTests.Docs/MudBlazor.UnitTests.Docs.csproj
@@ -60,7 +60,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
+
diff --git a/src/MudBlazor.UnitTests.Shared/MudBlazor.UnitTests.Shared.csproj b/src/MudBlazor.UnitTests.Shared/MudBlazor.UnitTests.Shared.csproj
index 38640a0ce53a..afd50e5dae58 100644
--- a/src/MudBlazor.UnitTests.Shared/MudBlazor.UnitTests.Shared.csproj
+++ b/src/MudBlazor.UnitTests.Shared/MudBlazor.UnitTests.Shared.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Autocomplete/AutocompleteRetainFocusTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Autocomplete/AutocompleteRetainFocusTest.razor
new file mode 100644
index 000000000000..71b1655397f0
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Autocomplete/AutocompleteRetainFocusTest.razor
@@ -0,0 +1,142 @@
+@using MudBlazor
+@using System.Threading
+
+
+
+ This is only here to push the autocompletes lower on the page to demonstrate the behaviour where
+ they draw over a message box.
+
+
+
+
+@($"Text: {autocomp1?.Text} Value: {autocomp1?.Value} Local Value: {_messageBoxValue}")
+
+
+ @foreach (string s in _states)
+ {
+
+ }
+
+@($"Text: {select1?.Text} Value: {select1?.Value} Local Value: {_dialogValue}")
+
+@($"Text: {_workaroundAutocomplete?.Text} Value: {_workaroundAutocomplete?.Value} Local Value: {_workaroundValue}")
+
+
+ This is a message box
+
+
+
+ Close
+
+
+
+
+
+
+
+ Edit rating
+
+
+
+ How awesome are inline dialogs?
+
+
+
+ Close
+
+
+
+@code {
+ public static string __description__ = " Test Autocomplete retaining focus and not closing properly. ";
+ private string _messageBoxValue = string.Empty;
+ private string _dialogValue = string.Empty;
+ private string _workaroundValue = string.Empty;
+
+ private MudAutocomplete autocomp1 = default!;
+ private MudSelect select1 = default!;
+ private MudMessageBox _msgBox = default!;
+ private MudAutocomplete _workaroundAutocomplete = new();
+
+ private bool _dialogVisible;
+ private int _rating;
+ private readonly DialogOptions _dialogOptions = new() { FullWidth = true };
+ private void OpenDialog() => _dialogVisible = true;
+ private void Submit() => _dialogVisible = false;
+
+ 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"
+ };
+
+ private async Task> Search(string value, CancellationToken token)
+ {
+ // In real life use an asynchronous function for fetching data from an api.
+ await Task.Delay(5, token);
+
+ // if text is null or empty, show complete list
+ if (string.IsNullOrEmpty(value))
+ return _states;
+
+ return _states.Where(x => x.Contains(value, StringComparison.InvariantCultureIgnoreCase));
+ }
+
+ private async Task OpenMessageBox(string value)
+ {
+ _messageBoxValue = value;
+ if (!string.IsNullOrEmpty(value))
+ {
+ await _msgBox.ShowAsync();
+ }
+ }
+
+ private async Task OpenDialog(string value)
+ {
+ _dialogValue = value;
+ if (!string.IsNullOrEmpty(value))
+ {
+ _dialogVisible = true;
+ await Task.CompletedTask;
+ }
+ }
+
+ private async Task OpenMessageBoxWorkaround(string value)
+ {
+ _workaroundValue = value;
+ if (!string.IsNullOrEmpty(value))
+ {
+ await _workaroundAutocomplete.CloseMenuAsync();
+ await _msgBox.ShowAsync();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridInDialogFilterTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridInDialogFilterTest.razor
new file mode 100644
index 000000000000..39b4f56793a5
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/DataGrid/DataGridInDialogFilterTest.razor
@@ -0,0 +1,40 @@
+
+
+ Show
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+#nullable enable
+ public static string __description__ = " Datagrid inside a Dialog making sure Filter popover shows and goes away properly. ";
+
+ private readonly List _items = new List();
+ private bool _visible;
+ private readonly DialogOptions _dialogOptions = new() { FullWidth = true };
+
+ private void OpenDialog() => _visible = true;
+
+ private void Submit() => _visible = false;
+
+ protected override void OnInitialized()
+ {
+ for (var i = 0; i < 200; i++)
+ _items.Add(new Model($"Value_{i}", $"Value_{i}", $"Value_{i}", $"Value_{i}", $"Value_{i}"));
+ }
+
+ public record Model(string Column1, string Column2, string Column3, string Column4, string Column5);
+}
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/DatePicker/DateRangePickerPresetWithoutTimestampTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/DatePicker/DateRangePickerPresetWithoutTimestampTest.razor
index 7cadef5b91cf..f252210fe82d 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/DatePicker/DateRangePickerPresetWithoutTimestampTest.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/DatePicker/DateRangePickerPresetWithoutTimestampTest.razor
@@ -4,7 +4,7 @@
public static string __description__ = "DateTime range without a timestamp";
[Parameter]
- public DateRange? DateRange { get; set; } = new DateRange(DateTime.Now.Subtract(TimeSpan.FromDays(35)).Date, DateTime.Now.AddDays(5).Date);
+ public DateRange? DateRange { get; set; } = new DateRange(DateTime.Now.AddMonths(-1).Date, DateTime.Now.Date);
public MudDateRangePicker? PickerReference;
}
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Drawer/DrawerDialogSelectTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Drawer/DrawerDialogSelectTest.razor
new file mode 100644
index 000000000000..ea9d59a6d4e0
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Drawer/DrawerDialogSelectTest.razor
@@ -0,0 +1,36 @@
+ dialog_open = !dialog_open)" Variant="Variant.Filled" Color="Color.Primary">
+ Open Simple Dialog
+
+
+
+
+ Open Drawer
+
+
+ My App
+
+
+ 1
+ 2
+ 3
+ 4
+ 5
+
+
+
+
+
+@code {
+ #nullable enable
+ public static string __description__ = " Drawer inside a Dialog with a Select inside the Drawer make sure z-index is not overridden by css. ";
+ private bool dialog_open;
+ private bool _open;
+ private Anchor _anchor;
+ private bool _overlayAutoClose = true;
+
+ private void OpenDrawer(Anchor anchor)
+ {
+ _open = true;
+ _anchor = anchor;
+ }
+}
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/NumericField/NumericFieldRenderTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/NumericField/NumericFieldRenderTest.razor
index 8da3230ec774..5a27cb004f16 100644
--- a/src/MudBlazor.UnitTests.Viewer/TestComponents/NumericField/NumericFieldRenderTest.razor
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/NumericField/NumericFieldRenderTest.razor
@@ -1,5 +1,9 @@
- NumericField { get; set; } = null!;
}
diff --git a/src/MudBlazor.UnitTests.Viewer/TestComponents/Tooltip/TooltipFlexScenariosTest.razor b/src/MudBlazor.UnitTests.Viewer/TestComponents/Tooltip/TooltipFlexScenariosTest.razor
new file mode 100644
index 000000000000..4b90bab9ddf3
--- /dev/null
+++ b/src/MudBlazor.UnitTests.Viewer/TestComponents/Tooltip/TooltipFlexScenariosTest.razor
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Issue #1167
+
+
+
+
+
+
+ @context.Item.Item1
+
+
+
+
+
+
+
+
+ @context.Item.Item1
+
+
+
+
+
+
+ MudChip inside DataGrid workaround
+
+
+
+
+
+
+
+
+
+
+
+ Text
+
+
+
+
+
+ Text
+
+
+
+
+
+
+
+
+ Issue
+ Data
+ Comment
+
+
+ Discord Help
+
+
+ @context
+
+
+ User was wrapping outside 'MudTd', wrap inside instead
+
+
+
+
\ No newline at end of file
diff --git a/src/MudBlazor.UnitTests/Components/AutocompleteTests.cs b/src/MudBlazor.UnitTests/Components/AutocompleteTests.cs
index c107679878b3..f55ad21931b6 100644
--- a/src/MudBlazor.UnitTests/Components/AutocompleteTests.cs
+++ b/src/MudBlazor.UnitTests/Components/AutocompleteTests.cs
@@ -532,7 +532,7 @@ public void Autocomplete_Should_TolerateNullFromSearchFunc()
public void Autocomplete_ReadOnly_Should_Not_Open()
{
var comp = Context.RenderComponent();
- comp.FindAll(".mud-input-control")[0].Click();
+ comp.FindAll(".mud-input-control")[0].MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-popover-open").Count.Should().Be(0));
}
@@ -1722,7 +1722,7 @@ public void Autocomplete_Should_OpenMenuOnFocus_AlwaysOnClick()
comp.Find("div.mud-input-control").Focus(); // Browser would focus first.
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
- comp.Find("input.mud-input-root").Click();
+ comp.Find("input.mud-input-root").MouseDown();
// OpenOnFocus=false isn't respected by clicks. It added after the fact to allow opting in to v6 behavior.
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
diff --git a/src/MudBlazor.UnitTests/Components/DataGridTests.cs b/src/MudBlazor.UnitTests/Components/DataGridTests.cs
index e7aa8b591b48..ce21b3aa6a39 100644
--- a/src/MudBlazor.UnitTests/Components/DataGridTests.cs
+++ b/src/MudBlazor.UnitTests/Components/DataGridTests.cs
@@ -2509,7 +2509,7 @@ public async Task DataGridCloseFiltersTest()
// check the number of filters displayed in the filters panel is 1
comp.FindAll(".filters-panel .mud-grid-item.d-flex").Count.Should().Be(1);
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
//set operator to CONTAINS
comp.FindAll(".mud-list .mud-list-item")[0].Click();
@@ -2522,7 +2522,7 @@ public async Task DataGridCloseFiltersTest()
//set operator to NOT CONTAINS
FilterButton().Click();
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
comp.FindAll(".mud-list .mud-list-item")[1].Click();
comp.Find(".mud-overlay").Click();
@@ -2534,7 +2534,7 @@ public async Task DataGridCloseFiltersTest()
//set operator to EQUALS
FilterButton().Click();
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
comp.FindAll(".mud-list .mud-list-item")[2].Click();
comp.Find(".mud-overlay").Click();
@@ -2546,7 +2546,7 @@ public async Task DataGridCloseFiltersTest()
//set operator to NOT EQUALS
FilterButton().Click();
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
comp.FindAll(".mud-list .mud-list-item")[3].Click();
comp.Find(".mud-overlay").Click();
@@ -2558,7 +2558,7 @@ public async Task DataGridCloseFiltersTest()
//set operator to STARTS WITH
FilterButton().Click();
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
comp.FindAll(".mud-list .mud-list-item")[4].Click();
comp.Find(".mud-overlay").Click();
@@ -2570,7 +2570,7 @@ public async Task DataGridCloseFiltersTest()
//set operator to ENDS WITH
FilterButton().Click();
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
comp.FindAll(".mud-list .mud-list-item")[5].Click();
comp.Find(".mud-overlay").Click();
@@ -2582,7 +2582,7 @@ public async Task DataGridCloseFiltersTest()
//set operator to IS EMPTY
FilterButton().Click();
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
comp.FindAll(".mud-list .mud-list-item")[6].Click();
comp.Find(".mud-overlay").Click();
@@ -2594,7 +2594,7 @@ public async Task DataGridCloseFiltersTest()
//set operator to IS NOT EMPTY
FilterButton().Click();
- await comp.Find(".filter-operator").ClickAsync(new MouseEventArgs());
+ await comp.Find(".filter-operator").MouseDownAsync(new MouseEventArgs());
comp.FindAll(".mud-list .mud-list-item")[7].Click();
comp.Find(".mud-overlay").Click();
@@ -2746,7 +2746,7 @@ public void DataGridFilterPerColumnTest()
selects.Count.Should().Be(2);
// open operator menu
- selects[1].Click();
+ selects[1].MouseDown();
//check available operators
var items = comp.FindAll("div.mud-list-item");
@@ -3394,7 +3394,7 @@ public void DataGridFilterableFalseTest()
comp.Find(".filter-button").Click();
comp.FindAll(".filters-panel").Count.Should().Be(1);
- comp.FindAll("div.mud-input-control")[0].Click();
+ comp.FindAll("div.mud-input-control")[0].MouseDown();
comp.FindAll("div.mud-list-item").Count.Should().Be(3);
}
@@ -4944,7 +4944,7 @@ public void DataGridEnumLocalization()
FilterButton().Click();
IElement SelectElement() => comp.Find("div.mud-select.filter-input");
- SelectElement().Click();
+ SelectElement().MouseDown();
var items = comp.FindAll("div.mud-list-item").ToArray();
@@ -5004,5 +5004,19 @@ public async Task TestCurrentPageParameterTwoWayBinding()
comp.WaitForAssertion(() => dataGrid.CurrentPage.Should().Be(2));
comp.WaitForAssertion(() => comp.Find(".mud-table-body .mud-table-row .mud-table-cell").TextContent.Should().Be("3"));
}
+
+ [Test]
+ [TestCase(true, true)]
+ [TestCase(true, false)]
+ [TestCase(false, true)]
+ [TestCase(false, false)]
+ public void TestRtlGroupIconMethod(bool isRightToLeft, bool isExpanded)
+ {
+ var test = new MudDataGrid();
+ if (isExpanded)
+ test.GetGroupIcon(isExpanded, isRightToLeft).Should().Be(Icons.Material.Filled.ExpandMore);
+ else
+ test.GetGroupIcon(isExpanded, isRightToLeft).Should().Be(isRightToLeft ? Icons.Material.Filled.ChevronLeft : Icons.Material.Filled.ChevronRight);
+ }
}
}
diff --git a/src/MudBlazor.UnitTests/Components/DatePickerTests.cs b/src/MudBlazor.UnitTests/Components/DatePickerTests.cs
index 543113fce6df..e5dde9046f36 100644
--- a/src/MudBlazor.UnitTests/Components/DatePickerTests.cs
+++ b/src/MudBlazor.UnitTests/Components/DatePickerTests.cs
@@ -706,6 +706,10 @@ public void IsDateDisabledFunc_DisablesCalendarMonthButtons()
[Test]
public void DisableCalendarMonthButtonsWhenFixDayOutOfRange()
{
+ var timeProvider = new FakeTimeProvider();
+ Context.Services.AddSingleton(timeProvider);
+ timeProvider.SetUtcNow(new DateTime(2024, 2, 1, 0, 0, 0, DateTimeKind.Utc));
+
var comp = OpenPicker(new[]
{
Parameter(nameof(MudDatePicker.OpenTo), OpenTo.Month),
diff --git a/src/MudBlazor.UnitTests/Components/DateRangePickerTests.cs b/src/MudBlazor.UnitTests/Components/DateRangePickerTests.cs
index 75c1211f6d34..092c18b13c96 100644
--- a/src/MudBlazor.UnitTests/Components/DateRangePickerTests.cs
+++ b/src/MudBlazor.UnitTests/Components/DateRangePickerTests.cs
@@ -712,6 +712,31 @@ public void CurrentDate_ShouldBeMarked()
comp.Instance.DateRange.Should().Be(new DateRange(currentDate, currentDate));
}
+ [Test]
+ public async Task SingleDayRange_Should_Render_Selected()
+ {
+ var today = DateTime.Today;
+ var initialRange = new DateRange(new DateTime(today.Year, today.Month, 01), new DateTime(today.Year, today.Month, 05));
+
+ var comp = Context.RenderComponent(Parameter(nameof(AutoCloseDateRangePickerTest.DateRange), initialRange));
+
+ comp.Find("input").Click();
+
+ //Select same date as start and end
+ await comp.FindAll("button.mud-picker-calendar-day").Where(x => x.TrimmedText().Equals("10")).First().ClickAsync(new MouseEventArgs());
+ await comp.FindAll("button.mud-picker-calendar-day").Where(x => x.TrimmedText().Equals("10")).First().ClickAsync(new MouseEventArgs());
+
+ // Check that the date range should remain the same because autoclose is false
+ comp.Instance.DateRange.Should().Be(initialRange);
+ comp.WaitForAssertion(() => comp.FindAll("div.mud-popover").Count.Should().Be(1));
+
+ //mud-selected should be applied instead of mud-range-start-selected and mud-range-end-selected
+ comp.FindAll("button.mud-picker-calendar-day").Where(x => x.TrimmedText().Equals("10")).First()
+ .ToMarkup().Should().Contain("mud-selected")
+ .And.NotContain("mud-range-start-selected")
+ .And.NotContain("mud-range-end-selected");
+ }
+
[Test]
public void DateRangePicker_Should_Clear()
{
diff --git a/src/MudBlazor.UnitTests/Components/NumericFieldTests.cs b/src/MudBlazor.UnitTests/Components/NumericFieldTests.cs
index 172346a42886..d5f00c6066ad 100644
--- a/src/MudBlazor.UnitTests/Components/NumericFieldTests.cs
+++ b/src/MudBlazor.UnitTests/Components/NumericFieldTests.cs
@@ -1005,6 +1005,44 @@ public void Should_render_appropriate_type()
field.GetAttribute("type").Should().Be("text");
}
+ [Test]
+ [SetUICulture("ru-RU")]
+ public void Should_ignore_default_culture()
+ {
+ var comp = Context.RenderComponent();
+
+ comp.Find("input").Change("123.45");
+ comp.Find("input").Blur();
+
+ comp.WaitForAssertion(() => comp.Instance.Value.Should().Be(123.45M));
+ comp.Instance.NumericField.Text.Should().Be("123.45");
+ comp.Instance.NumericField.Culture.Name.Should().Be("");
+ }
+
+ [Test]
+ [SetUICulture("ru-RU")]
+ public void Should_apply_defined_culture()
+ {
+ var comp = Context.RenderComponent();
+ var inputs = comp.FindAll("input");
+ var immediate = inputs.First();
+ var notImmediate = inputs.Last();
+
+ //german
+ notImmediate.Change("1.234,56");
+ notImmediate.Blur();
+ comp.WaitForAssertion(() => comp.Instance.FieldNotImmediate.Text.Should().Be("1.234,56"));
+ comp.WaitForAssertion(() => comp.Instance.FieldNotImmediate.Value.Should().Be(1234.56));
+ comp.Instance.FieldNotImmediate.Culture.Name.Should().Be("de-DE");
+
+ // English
+ immediate.Input("1234.56");
+ immediate.Blur();
+ comp.WaitForAssertion(() => comp.Instance.FieldImmediate.Text.Should().Be("1,234.56"));
+ comp.WaitForAssertion(() => comp.Instance.FieldImmediate.Value.Should().Be(1234.56));
+ comp.Instance.FieldImmediate.Culture.Name.Should().Be("en-US");
+ }
+
[Test]
public void Should_render_conversion_error_message()
{
diff --git a/src/MudBlazor.UnitTests/Components/SelectTests.cs b/src/MudBlazor.UnitTests/Components/SelectTests.cs
index 1f163eb531f2..2d9be0738156 100644
--- a/src/MudBlazor.UnitTests/Components/SelectTests.cs
+++ b/src/MudBlazor.UnitTests/Components/SelectTests.cs
@@ -62,7 +62,7 @@ public async Task SelectTest1()
select.Instance.Value.Should().BeNullOrEmpty();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
// click and check if it has toggled the menu
- input.Click();
+ input.MouseDown();
menu.ClassList.Should().Contain("mud-popover-open");
// now click an item and see the value change
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
@@ -73,7 +73,7 @@ public async Task SelectTest1()
select.Instance.Value.Should().Be("2");
// now we cheat and click the list without opening the menu ;)
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
items = comp.FindAll("div.mud-list-item").ToArray();
@@ -147,7 +147,7 @@ await ImproveChanceOfSuccess(async () =>
comp.WaitForAssertion(() =>
comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
// click and check if it has toggled the menu
- input.Click();
+ input.MouseDown();
menu.ClassList.Should().Contain("mud-popover-open");
// now click an item and see the value change
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
@@ -226,7 +226,7 @@ public void SelectWithEnumTest()
comp.Find("input").Attributes["value"]?.Value.Should().Be("First");
comp.RenderCount.Should().Be(1);
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
var items = comp.FindAll("div.mud-list-item").ToArray();
items[1].Click();
@@ -246,7 +246,7 @@ public void SelectUnrepresentableValueTest()
select.Instance.Value.Should().Be(17);
select.Instance.Text.Should().Be("17");
comp.Find("input").Attributes["value"]?.Value.Should().Be("17");
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
var items = comp.FindAll("div.mud-list-item").ToArray();
items[1].Click();
@@ -272,7 +272,7 @@ public async Task SelectUnrepresentableValueTest2()
// BUT: we have a select with Strict="true" so the Text will not be shown because it is not in the list of selectable values
comp.FindComponent>().Instance.Value.Should().Be(null);
comp.FindComponent>().Instance.InputType.Should().Be(InputType.Hidden);
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
var items = comp.FindAll("div.mud-list-item").ToArray();
items[1].Click();
@@ -298,7 +298,7 @@ public void SelectWithoutItemPresentersTest()
comp.Find("div.mud-input-slot").Attributes["style"].Value.Should().Contain("display:none");
comp.RenderCount.Should().Be(1);
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
var items = comp.FindAll("div.mud-list-item").ToArray();
items[1].Click();
@@ -321,7 +321,7 @@ public void Select_Should_FireTextChangedWithNewValue()
select.Instance.Value.Should().BeNullOrEmpty();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
// click and check if it has toggled the menu
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
menu.ClassList.Should().Contain("mud-popover-open");
// now click an item and see the value change
@@ -334,7 +334,7 @@ public void Select_Should_FireTextChangedWithNewValue()
text.Should().Be("2");
//open the menu again
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
items = comp.FindAll("div.mud-list-item").ToArray();
@@ -375,7 +375,7 @@ public void SingleSelect_Should_FireTextChangedBeforeSelectedValuesChanged()
select.Instance.Value.Should().BeNullOrEmpty();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
// click and check if it has toggled the menu
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
menu.ClassList.Should().Contain("mud-popover-open");
// now click an item and see the value change
@@ -391,7 +391,7 @@ public void SingleSelect_Should_FireTextChangedBeforeSelectedValuesChanged()
textChangedCount.Should().Be(0);
string.Join(",", selectedValues).Should().Be("2");
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
items = comp.FindAll("div.mud-list-item").ToArray();
@@ -432,7 +432,7 @@ public void MulitSelect_Should_FireTextChangedBeforeSelectedValuesChanged()
});
var selectElement = comp.Find("div.mud-input-control");
- selectElement.Click();
+ selectElement.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
var items = comp.FindAll("div.mud-list-item").ToArray();
// click list item
@@ -477,7 +477,7 @@ public void Disabled_SelectItem_Should_Be_Respected()
var select = comp.FindComponent>();
var selectElement = comp.Find("div.mud-input-control");
- selectElement.Click();
+ selectElement.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item-disabled").Count.Should().Be(1));
comp.FindAll("div.mud-list-item-disabled")[0].Click();
@@ -506,7 +506,7 @@ public void MultiSelect_ShouldCallValidationFunc()
comp.WaitForAssertion(() =>
comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
// click and check if it has toggled the menu
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
comp.WaitForAssertion(() => menu.ClassList.Should().Contain("mud-popover-open"));
// now click an item and see the value change
@@ -543,7 +543,7 @@ public void MultiSelect_SelectAll()
var menu = comp.Find("div.mud-popover");
var input = comp.Find("div.mud-input-control");
// Open the menu
- input.Click();
+ input.MouseDown();
menu.ClassList.Should().Contain("mud-popover-open");
// now click the first checkbox
comp.FindAll("div.mud-list-item")[0].Click();
@@ -561,7 +561,7 @@ public void MultiSelect_SelectAll2()
var menu = comp.Find("div.mud-popover");
var input = comp.Find("div.mud-input-control");
// Open the menu
- input.Click();
+ input.MouseDown();
menu.ClassList.Should().Contain("mud-popover-open");
// get the first (select all item) and check if it is selected
@@ -596,7 +596,7 @@ public void MultiSelect_SelectAll3()
var menu = comp.Find("div.mud-popover");
var input = comp.Find("div.mud-input-control");
// Open the menu
- input.Click();
+ input.MouseDown();
menu.ClassList.Should().Contain("mud-popover-open");
// Check that the icon corresponds to an unchecked checkbox
var mudListItem = comp.FindComponent>();
@@ -611,7 +611,7 @@ public void MultiSelect_SelectAll4()
var menu = comp.Find("div.mud-popover");
var input = comp.Find("div.mud-input-control");
// Open the menu
- input.Click();
+ input.MouseDown();
menu.ClassList.Should().Contain("mud-popover-open");
// now click the first checkbox to select all
var items = comp.FindAll("div.mud-list-item").ToArray();
@@ -645,7 +645,7 @@ public void SingleSelect_Should_CallValidationFunc()
select.Instance.Value.Should().BeNullOrEmpty();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
// click and check if it has toggled the menu
- input.Click();
+ input.MouseDown();
menu.ClassList.Should().Contain("mud-popover-open");
// now click an item and see the value change
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
@@ -657,7 +657,7 @@ public void SingleSelect_Should_CallValidationFunc()
select.Instance.Text.Should().Be("2");
validatedValue.Should().Be("2");
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
comp.FindAll("div.mud-list-item")[0].Click();
@@ -712,7 +712,7 @@ public void SelectClearableTest()
// No button when initialized
comp.FindAll(".mud-input-clear-button").Should().BeEmpty();
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
// Button shows after selecting item
var items = comp.FindAll("div.mud-list-item").ToArray();
@@ -741,7 +741,7 @@ public void SelectReselectTest()
var menu = comp.Find("div.mud-popover");
var input = comp.Find("div.mud-input-control");
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
select.Instance.Value.Should().Be("Apple");
@@ -755,7 +755,7 @@ public void SelectReselectTest()
comp.Instance.ChangeCount.Should().Be(1);
// now click an item and see the value change
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
items = comp.FindAll("div.mud-list-item").ToArray();
items[1].Click();
@@ -829,7 +829,7 @@ public async Task Select_Should_HilightSelectedValue()
select.Instance.Value.Should().BeNullOrEmpty();
comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open");
// open the select
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
// no option should be hilited
comp.WaitForAssertion(() => comp.FindAll("div.mud-selected-item").Count.Should().Be(0));
@@ -838,7 +838,7 @@ public async Task Select_Should_HilightSelectedValue()
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
comp.WaitForAssertion(() => select.Instance.Value.Should().Be("2"));
// open again and check hilited option
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
// Nr 2 should be hilited
comp.WaitForAssertion(() => comp.FindAll("div.mud-selected-item").Count.Should().Be(1));
@@ -863,7 +863,7 @@ public void Select_Should_HilightInitiallySelectedValue()
select.Instance.Value.Should().Be("2");
comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open");
// open the select
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
// Nr 2 should be hilited
comp.WaitForAssertion(() => comp.FindAll("div.mud-selected-item").Count.Should().Be(1));
@@ -873,12 +873,12 @@ public void Select_Should_HilightInitiallySelectedValue()
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
comp.WaitForAssertion(() => select.Instance.Value.Should().Be("1"));
// open again and check hilited option
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
// Nr 1 should be hilited
comp.WaitForAssertion(() => comp.FindAll("div.mud-selected-item").Count.Should().Be(1));
comp.FindAll("div.mud-list-item")[0].ToMarkup().Should().Contain("mud-selected-item");
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
}
@@ -888,17 +888,17 @@ public void Select_Should_AllowReloadingItems()
var comp = Context.RenderComponent();
var select = comp.FindComponent>();
// normal, without reloading
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
comp.FindAll("div.mud-list-item")[0].Click();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
comp.WaitForAssertion(() => select.Instance.Value.Should().Be("American Samoa"));
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
comp.FindAll("div.mud-list-item")[1].Click();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Arizona"));
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
comp.FindAll("div.mud-list-item")[2].Click();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
@@ -906,17 +906,17 @@ public void Select_Should_AllowReloadingItems()
// reloading!
comp.Find(".reload").Click();
// check again, different values expected now
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
comp.FindAll("div.mud-list-item")[0].Click();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Alabama"));
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
comp.FindAll("div.mud-list-item")[1].Click();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
comp.WaitForAssertion(() => select.Instance.Value.Should().Be("Alaska"));
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().Contain("mud-popover-open"));
comp.FindAll("div.mud-list-item")[2].Click();
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
@@ -1089,7 +1089,7 @@ public void SelectTest_KeyboardNavigation_MultiSelect_Focus()
var comp = Context.RenderComponent();
var select = comp.FindComponent>();
var mudSelectElement = comp.Find(".mud-select");
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
select.Instance._open.Should().BeTrue();
var items = comp.FindAll("div.mud-list-item").ToArray();
items[0].Click();
@@ -1127,7 +1127,7 @@ public void MultiSelectWithCustomComparerTest()
// Check input text
comp.Find("input").GetAttribute("value").Should().Be("Selected Cafe Latte, Selected Espresso");
// Click to render the menu
- comp.Find("div.mud-input-control").Click();
+ comp.Find("div.mud-input-control").MouseDown();
// Check check marks
const string @unchecked =
"M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z";
@@ -1147,7 +1147,7 @@ public void Select_Item_Collection_Should_Match_Number_Of_Select_Options()
var sut = comp.FindComponent>();
var input = comp.Find("div.mud-input-control");
- input.Click();
+ input.MouseDown();
comp.WaitForAssertion(() => comp.FindAll("div.mud-list-item").Count.Should().BeGreaterThan(0));
sut.Instance.Items.Should().HaveCountGreaterOrEqualTo(4);
@@ -1201,14 +1201,14 @@ public async Task MultiSelectWithRequiredValue()
//2a. Now check when SelectedItems is greater than one - Validation Should Pass
var inputs = comp.FindAll("div.mud-input-control");
- inputs[0].Click();//The 2nd one is the
+ inputs[0].MouseDown();//The 2nd one is the
var items = comp.FindAll("div.mud-list-item").ToArray();
items[1].Click();
await comp.InvokeAsync(() => select.Validate());
select.ValidationErrors.Count.Should().Be(0);
//2b.
- inputs[1].Click();//selectWithT
+ inputs[1].MouseDown();//selectWithT
//wait for render and it will find 5 items from the component
comp.WaitForState(() => comp.FindAll("div.mud-list-item").Count == 5);
items = comp.FindAll("div.mud-list-item").ToArray();
@@ -1445,18 +1445,18 @@ public async Task SelectFullWidthTest()
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
//Open restricted popover
- await comp.Find("#restricted-select").ClickAsync(new PointerEventArgs());
+ await comp.Find("#restricted-select").MouseDownAsync(new PointerEventArgs());
//confirm relative width class
comp.Find(".restricted").ClassList.Should().Contain("mud-popover-open").And.Contain("mud-popover-relative-width");
//close popover
- await comp.Find("#restricted-select").ClickAsync(new PointerEventArgs());
+ await comp.Find("#restricted-select").MouseDownAsync(new PointerEventArgs());
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("mud-popover-open"));
//Open expanded popover
- await comp.Find("#expanded-select").ClickAsync(new PointerEventArgs());
+ await comp.Find("#expanded-select").MouseDownAsync(new PointerEventArgs());
//confirm relative width class not applied
comp.Find(".expanded").ClassList.Should().Contain("mud-popover-open").And.NotContain("mud-popover-relative-width");
diff --git a/src/MudBlazor.UnitTests/Components/TableTests.cs b/src/MudBlazor.UnitTests/Components/TableTests.cs
index 0ca458d5e5aa..853a4c4aae2e 100644
--- a/src/MudBlazor.UnitTests/Components/TableTests.cs
+++ b/src/MudBlazor.UnitTests/Components/TableTests.cs
@@ -1213,7 +1213,7 @@ public void TableServerSideDataTest4()
comp.WaitForAssertion(() => comp.FindAll("td")[0].TextContent.Trim().Should().Be("1"));
comp.WaitForAssertion(() => comp.FindAll("td")[2].TextContent.Trim().Should().Be("2"));
comp.WaitForAssertion(() => comp.FindAll("td")[4].TextContent.Trim().Should().Be("3"));
- comp.FindAll("div.mud-select-input")[0].Click(); // mobile sort drop down
+ comp.FindAll("div.mud-select-input")[0].MouseDown(); // mobile sort drop down
comp.FindAll("div.mud-list-item-clickable")[1].Click(); // sort b column
comp.WaitForAssertion(() => comp.FindAll("td")[0].TextContent.Trim().Should().Be("3"));
comp.WaitForAssertion(() => comp.FindAll("td")[2].TextContent.Trim().Should().Be("2"));
@@ -1232,7 +1232,7 @@ public void TableServerSideDataTest4b()
comp.FindAll("td")[0].TextContent.Trim().Should().Be("1");
comp.FindAll("td")[2].TextContent.Trim().Should().Be("2");
comp.FindAll("td")[4].TextContent.Trim().Should().Be("3");
- comp.FindAll("div.mud-select-input")[0].Click(); // mobile sort drop down
+ comp.FindAll("div.mud-select-input")[0].MouseDown(); // mobile sort drop down
comp.FindAll("div.mud-list-item-clickable")[1].Click(); // sort b column
comp.WaitForAssertion(() => comp.FindAll("td")[0].TextContent.Trim().Should().Be("3"));
comp.WaitForAssertion(() => comp.FindAll("td")[2].TextContent.Trim().Should().Be("2"));
@@ -2282,7 +2282,7 @@ public void RowsPerPageParameterTwoWayBinding()
int.Parse(t).Should().Be(rowsPerPage, "The component rendered correctly");
//open the menu
var menuItem = comp.Find("div.mud-input-control");
- menuItem.Click();
+ menuItem.MouseDown();
//Now select the 25 and check it
var items = comp.FindAll("div.mud-list-item").ToArray();
diff --git a/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj b/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj
index da248e5d82f1..f94a110284db 100644
--- a/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj
+++ b/src/MudBlazor.UnitTests/MudBlazor.UnitTests.csproj
@@ -20,7 +20,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
+
diff --git a/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor b/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor
index a47e326884fe..ab8509fbd9e4 100644
--- a/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor
+++ b/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor
@@ -18,7 +18,7 @@
ErrorId="@ErrorId"
Disabled="@GetDisabledState()"
Required="@Required"
- @onclick="@OnInputClickedAsync"
+ @onmousedown="@OnInputClickedAsync"
@onfocus="@OnInputFocusedAsync"
ForId="@InputElementId">
@@ -39,14 +39,14 @@
OnAdornmentClick="@AdornmentClickHandlerAsync"
AdornmentAriaLabel="@AdornmentAriaLabel"
Clearable="@(Clearable && !GetReadOnlyState())"
- OnClearButtonClick="@OnClearButtonClick"
+ OnClearButtonClick="@HandleClearButtonAsync"
ClearIcon="@ClearIcon"
MaxLength="@MaxLength"
autocomplete="@GetAutocomplete()"
@attributes="UserAttributes"
- TextChanged="OnTextChangedAsync"
- OnBlur="OnInputBlurredAsync"
+ TextChanged="OnTextChangedAsync"
@onfocus="@OnInputFocusedAsync"
+ OnBlur="OnInputBlurredAsync"
OnKeyDown="@OnInputKeyDownAsync"
OnKeyUp="@OnInputKeyUpAsync" KeyUpPreventDefault="KeyUpPreventDefault"
Placeholder="@Placeholder" Immediate="true"
@@ -69,12 +69,12 @@
}
}
-
@if (ProgressIndicatorInPopoverTemplate is not null && IsLoading)
@@ -99,22 +99,22 @@
bool showDisabledTemplate = ItemDisabledTemplate is not null && isDisabled;
var captureIndex = index;
- @if (showDisabledTemplate)
- {
- @ItemDisabledTemplate!(item)
- }
- else if (showSelectedTemplate)
- {
- @ItemSelectedTemplate!(item)
- }
- else if (ItemTemplate is not null)
- {
- @ItemTemplate(item)
- }
- else
- {
- @GetItemString(item)
- }
+ @if (showDisabledTemplate)
+ {
+ @ItemDisabledTemplate!(item)
+ }
+ else if (showSelectedTemplate)
+ {
+ @ItemSelectedTemplate!(item)
+ }
+ else if (ItemTemplate is not null)
+ {
+ @ItemTemplate(item)
+ }
+ else
+ {
+ @GetItemString(item)
+ }
}
@if (MoreItemsTemplate is not null && _returnedItemsCount > MaxItems)
diff --git a/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor.cs b/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor.cs
index 05297e01ecb6..20c4bbd00b53 100644
--- a/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor.cs
+++ b/src/MudBlazor/Components/Autocomplete/MudAutocomplete.razor.cs
@@ -525,8 +525,14 @@ public async Task SelectOptionAsync(T value)
_isProcessingValue = true;
try
{
+ // needs to close before SetValueAsync so that whatever the user puts in ValueChanged can run without the popover being in front of it
+ Open = false;
+
await SetValueAsync(value);
+ // needs to be open to run the rest of the code
+ Open = true;
+
if (_items != null)
_selectedListItemIndex = Array.IndexOf(_items, value);
@@ -545,10 +551,11 @@ public async Task SelectOptionAsync(T value)
}
await FocusAsync();
-
+ // We want focus with a closed popover
Open = false;
-
+ // And update
StateHasChanged();
+
}
finally
{
@@ -973,6 +980,20 @@ private async Task OnInputActivationAsync(bool openMenu)
}
}
+ internal async Task HandleClearButtonAsync(MouseEventArgs e)
+ {
+ // clear button clicked, let's make sure text is cleared and the menu has focus
+ Open = true;
+ _isFocused = true;
+ await SetValueAsync(default, false);
+ await SetTextAsync(default, false);
+ _selectedListItemIndex = default;
+ await CloseMenuAsync();
+ StateHasChanged();
+ await OnClearButtonClick.InvokeAsync(e);
+ await BeginValidateAsync();
+ }
+
internal async Task AdornmentClickHandlerAsync()
{
if (OnAdornmentClick.HasDelegate)
diff --git a/src/MudBlazor/Components/DataGrid/MudDataGrid.razor b/src/MudBlazor/Components/DataGrid/MudDataGrid.razor
index 4ff7d148922c..e39aee5d5a88 100644
--- a/src/MudBlazor/Components/DataGrid/MudDataGrid.razor
+++ b/src/MudBlazor/Components/DataGrid/MudDataGrid.razor
@@ -60,7 +60,7 @@
@if (_filtersMenuVisible && FilterMode == DataGridFilterMode.Simple)
{
-
+
+
-
+
@if (GroupedColumn.GroupTemplate == null)
{
diff --git a/src/MudBlazor/Components/DataGrid/MudDataGrid.razor.cs b/src/MudBlazor/Components/DataGrid/MudDataGrid.razor.cs
index 6b31e3f0a4f7..77624beb46e9 100644
--- a/src/MudBlazor/Components/DataGrid/MudDataGrid.razor.cs
+++ b/src/MudBlazor/Components/DataGrid/MudDataGrid.razor.cs
@@ -1207,6 +1207,15 @@ internal Column GroupedColumn
#region Computed Properties
+ internal string GetGroupIcon(bool isExpanded, bool rtl)
+ {
+ if (isExpanded)
+ {
+ return Icons.Material.Filled.ExpandMore;
+ }
+ return rtl ? Icons.Material.Filled.ChevronLeft : Icons.Material.Filled.ChevronRight;
+ }
+
private bool HasFooter
{
get
diff --git a/src/MudBlazor/Components/DatePicker/MudBaseDatePicker.razor.cs b/src/MudBlazor/Components/DatePicker/MudBaseDatePicker.razor.cs
index ce7388c9edce..04f3118fcc23 100644
--- a/src/MudBlazor/Components/DatePicker/MudBaseDatePicker.razor.cs
+++ b/src/MudBlazor/Components/DatePicker/MudBaseDatePicker.razor.cs
@@ -697,7 +697,10 @@ protected override void OnInitialized()
var month = FixMonth ?? (year == today.Year ? today.Month : 1);
var day = FixDay ?? 1;
- HighlightedDate = new DateTime(year, month, day);
+ if (DateTime.TryParseExact($"{year}-{month}-{day}", "yyyy-M-d", Culture, DateTimeStyles.None, out var date))
+ {
+ HighlightedDate = date;
+ }
}
protected override async Task OnAfterRenderAsync(bool firstRender)
diff --git a/src/MudBlazor/Components/DatePicker/MudDateRangePicker.razor.cs b/src/MudBlazor/Components/DatePicker/MudDateRangePicker.razor.cs
index 6696a11d5025..3883a642785d 100644
--- a/src/MudBlazor/Components/DatePicker/MudDateRangePicker.razor.cs
+++ b/src/MudBlazor/Components/DatePicker/MudDateRangePicker.razor.cs
@@ -253,6 +253,13 @@ protected override string GetDayClasses(int month, DateTime day)
.Build();
}
+ if (_firstDate?.Date == day && _secondDate?.Date == day)
+ {
+ return b.AddClass("mud-selected")
+ .AddClass($"mud-theme-{Color.ToDescriptionString()}")
+ .Build();
+ }
+
if (_firstDate?.Date == day || CheckDateRange(day, compareStart: isEqualTo, compareEnd: isNotEqualTo))
{
return b.AddClass("mud-selected")
diff --git a/src/MudBlazor/Components/Input/MudInput.razor b/src/MudBlazor/Components/Input/MudInput.razor
index 65a79df1fde1..42f32d3cb665 100644
--- a/src/MudBlazor/Components/Input/MudInput.razor
+++ b/src/MudBlazor/Components/Input/MudInput.razor
@@ -106,7 +106,8 @@
Size="@Size.Small"
OnClick="@HandleClearButtonAsync"
aria-label="@Localizer[LanguageResource.MudInput_Clear]"
- tabindex="-1" />
+ tabindex="-1"
+ @onmousedown:stopPropagation />
}
@if (Adornment == Adornment.End)
diff --git a/src/MudBlazor/Components/Input/MudInputAdornment.razor b/src/MudBlazor/Components/Input/MudInputAdornment.razor
index 7a51adfc14ad..3eedade1fdb3 100644
--- a/src/MudBlazor/Components/Input/MudInputAdornment.razor
+++ b/src/MudBlazor/Components/Input/MudInputAdornment.razor
@@ -21,7 +21,8 @@
Size="@Size"
Color="@Color"
aria-label="@AriaLabel"
- tabindex="-1" />
+ tabindex="-1"
+ @onmousedown:stopPropagation />
}
else
{
diff --git a/src/MudBlazor/Components/Mask/MudMask.razor b/src/MudBlazor/Components/Mask/MudMask.razor
index 218940deeaa4..2e45665d0c16 100644
--- a/src/MudBlazor/Components/Mask/MudMask.razor
+++ b/src/MudBlazor/Components/Mask/MudMask.razor
@@ -93,7 +93,8 @@
Size="@Size.Small"
OnClick="@HandleClearButtonAsync"
aria-label="@Localizer[LanguageResource.MudInput_Clear]"
- tabindex="-1" />
+ tabindex="-1"
+ @onmousedown:stopPropagation />
}
@if (Adornment == Adornment.End)
diff --git a/src/MudBlazor/Components/Menu/MudMenu.razor b/src/MudBlazor/Components/Menu/MudMenu.razor
index 0e6a6e096cc4..393669835c8b 100644
--- a/src/MudBlazor/Components/Menu/MudMenu.razor
+++ b/src/MudBlazor/Components/Menu/MudMenu.razor
@@ -8,7 +8,8 @@
@onpointerenter="@PointerEnterAsync"
@onpointerleave="@PointerLeaveAsync"
@oncontextmenu="@((ActivationEvent == MouseEvent.RightClick ? ToggleMenuAsync : null)!)"
- @oncontextmenu:preventDefault="@(ActivationEvent == MouseEvent.RightClick)">
+ @oncontextmenu:preventDefault="@(ActivationEvent == MouseEvent.RightClick)"
+ @oncontextmenu:stopPropagation="@(ActivationEvent == MouseEvent.RightClick)">
@if (GetActivatorHidden())
{
@* No content was set so no need to render anything *@
diff --git a/src/MudBlazor/Components/NumericField/MudNumericField.razor.cs b/src/MudBlazor/Components/NumericField/MudNumericField.razor.cs
index efd14839143b..d314d36bbd29 100644
--- a/src/MudBlazor/Components/NumericField/MudNumericField.razor.cs
+++ b/src/MudBlazor/Components/NumericField/MudNumericField.razor.cs
@@ -46,6 +46,14 @@ public MudNumericField()
.WithParameter(() => Culture)
.WithChangeHandler((x) => _cultureHasValue = x.Value is not null);
+ // Overrides the browser's culture since does not consider culture.
+ // If a specific Culture, Pattern, or Format is defined, will be used
+ // with the corresponding attributes applied.
+ if (!_cultureHasValue)
+ {
+ SetCulture(CultureInfo.InvariantCulture);
+ }
+
Validation = new Func>(ValidateInput);
#region parameters default depending on T
diff --git a/src/MudBlazor/Components/Select/MudSelect.razor b/src/MudBlazor/Components/Select/MudSelect.razor
index dbcc58ef6fa2..b801781a23e7 100644
--- a/src/MudBlazor/Components/Select/MudSelect.razor
+++ b/src/MudBlazor/Components/Select/MudSelect.razor
@@ -19,8 +19,7 @@
Disabled="@GetDisabledState()"
Required="@Required"
ForId="@InputElementId"
- @onmousedown="@ToggleMenu"
- @onclick="@ToggleMenu">
+ @onmousedown="@ToggleMenu">
- /// Shows a dot instead of text for the badge.
+ /// Optional icon to be shown in the badge instead of text.
+ ///
+ [Parameter]
+ [Category(CategoryTypes.Tabs.Behavior)]
+ public string? BadgeIcon { get; set; }
+
+ ///
+ /// Shows a dot instead of text or icon for the badge.
///
///
/// Defaults to false . When true , a dot instead of is displayed.
diff --git a/src/MudBlazor/Components/Tabs/MudTabs.razor b/src/MudBlazor/Components/Tabs/MudTabs.razor
index 71f1d038e5f8..42b6cd25a2d0 100644
--- a/src/MudBlazor/Components/Tabs/MudTabs.razor
+++ b/src/MudBlazor/Components/Tabs/MudTabs.razor
@@ -97,9 +97,9 @@
@panel.Text
}
- @if (panel.BadgeData != null || panel.BadgeDot)
+ @if (panel.BadgeData != null || panel.BadgeIcon != null || panel.BadgeDot)
{
-
+
}
@if (TabPanelHeaderPosition == TabHeaderPosition.After && TabPanelHeader != null)
{
diff --git a/src/MudBlazor/Components/Tabs/MudTabs.razor.cs b/src/MudBlazor/Components/Tabs/MudTabs.razor.cs
index b8c942700884..b8cf22aaf4a2 100644
--- a/src/MudBlazor/Components/Tabs/MudTabs.razor.cs
+++ b/src/MudBlazor/Components/Tabs/MudTabs.razor.cs
@@ -821,7 +821,7 @@ private double GetLengthOfPanelItems(MudTabPanel panel, bool inclusive = false)
private void SetScrollButtonVisibility()
{
- _showScrollButtons = AlwaysShowScrollButtons || _allTabsSize > _tabBarContentSize || _scrollIndex != 0;
+ _showScrollButtons = AlwaysShowScrollButtons || (int)_allTabsSize > (int)_tabBarContentSize || _scrollIndex != 0;
}
private void ScrollPrev()
diff --git a/src/MudBlazor/MudBlazor.csproj b/src/MudBlazor/MudBlazor.csproj
index 80152f415018..7c56981abc95 100644
--- a/src/MudBlazor/MudBlazor.csproj
+++ b/src/MudBlazor/MudBlazor.csproj
@@ -86,14 +86,14 @@
-
+
all
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
all
diff --git a/src/MudBlazor/Styles/components/_dropzone.scss b/src/MudBlazor/Styles/components/_dropzone.scss
index 53d7311cb6dd..d23bfd1242ab 100644
--- a/src/MudBlazor/Styles/components/_dropzone.scss
+++ b/src/MudBlazor/Styles/components/_dropzone.scss
@@ -43,7 +43,3 @@
}
}
}
-
-.mud-drop-container {
- user-select: none;
-}
diff --git a/src/MudBlazor/Styles/components/_progresslinear.scss b/src/MudBlazor/Styles/components/_progresslinear.scss
index d3352fecc515..243ba261d740 100644
--- a/src/MudBlazor/Styles/components/_progresslinear.scss
+++ b/src/MudBlazor/Styles/components/_progresslinear.scss
@@ -1,4 +1,4 @@
-
+
.mud-progress-linear {
position: relative;
@@ -118,7 +118,7 @@
.mud-progress-linear-bar:first-child {
background-size: 10px 10px;
background-image: radial-gradient(var(--mud-palette-action-disabled) 0%, var(--mud-palette-action-disabled) 16%, transparent 42%);
- background-position: 0 -23px;
+ background-position: 0 50%;
}
.mud-progress-linear-bar:nth-child(2) {
@@ -161,7 +161,7 @@
.mud-progress-linear-bar:first-child {
background-size: 10px 10px;
background-image: radial-gradient(var(--mud-palette-#{$color}) 0%, var(--mud-palette-#{$color}) 16%, transparent 42%);
- background-position: 0 -23px;
+ background-position: 0 50%;
}
.mud-progress-linear-bar:nth-child(2) {
diff --git a/src/MudBlazor/Styles/components/_table.scss b/src/MudBlazor/Styles/components/_table.scss
index 44f0303903ed..c6bf64e3f9d0 100644
--- a/src/MudBlazor/Styles/components/_table.scss
+++ b/src/MudBlazor/Styles/components/_table.scss
@@ -516,7 +516,10 @@
}
.mud-table-row-expander {
- margin: -12px -2px -12px -12px;
+ margin-top: -12px;
+ margin-bottom: -12px;
+ margin-inline-start: -12px;
+ margin-inline-end: -2px;
}
@mixin table-display-smalldevices ($breakpoint) {
diff --git a/src/MudBlazor/Styles/components/_tooltip.scss b/src/MudBlazor/Styles/components/_tooltip.scss
index 893a571d2836..44eaa5277e74 100644
--- a/src/MudBlazor/Styles/components/_tooltip.scss
+++ b/src/MudBlazor/Styles/components/_tooltip.scss
@@ -1,7 +1,5 @@
-
-.mud-tooltip-root {
- width: fit-content;
+.mud-tooltip-root {
&.mud-tooltip-inline {
display: inline-block;
}
diff --git a/src/MudBlazor/Styles/core/_animations.scss b/src/MudBlazor/Styles/core/_animations.scss
index 5def72ce1389..8e99fd4b2907 100644
--- a/src/MudBlazor/Styles/core/_animations.scss
+++ b/src/MudBlazor/Styles/core/_animations.scss
@@ -1,4 +1,4 @@
-@keyframes mud-animation-fadein {
+@keyframes mud-animation-fadein {
0% {
opacity: 0;
}
@@ -164,17 +164,17 @@
@-webkit-keyframes mud-progress-linear-horizontal-keyframes-buffer {
0% {
opacity: 1;
- background-position: 0 -23px;
+ background-position: 0 50%;
}
50% {
opacity: 0;
- background-position: 0 -23px;
+ background-position: 0 50%;
}
100% {
opacity: 1;
- background-position: -200px -23px;
+ background-position: -200px 50%;
}
}
@@ -224,17 +224,17 @@
@-webkit-keyframes mud-progress-linear-vertical-keyframes-buffer {
0% {
opacity: 1;
- background-position: -23px 0;
+ background-position: 50% 0;
}
50% {
opacity: 0;
- background-position: -23px 0;
+ background-position: 50% 0;
}
100% {
opacity: 1;
- background-position: -23px -200px;
+ background-position: 50% -200px;
}
}
diff --git a/src/MudBlazor/TScripts/mudEventManager.js b/src/MudBlazor/TScripts/mudEventManager.js
index 5e3ebb820c00..68db01b894d8 100644
--- a/src/MudBlazor/TScripts/mudEventManager.js
+++ b/src/MudBlazor/TScripts/mudEventManager.js
@@ -96,7 +96,27 @@ class MudThrottledEventManager {
const eventEntry = {};
for (var i = 0; i < entry.properties.length; i++) {
- eventEntry[entry.properties[i]] = event[entry.properties[i]];
+ const propertyName = entry.properties[i];
+ const propertyValue = event[entry.properties[i]];
+
+ if (propertyValue == null) {
+ eventEntry[propertyName] = propertyValue;
+ }
+ else if (["touchstart", "touchmove", "touchend", "touchcancel"].includes(event.type) && ["touches", "changedTouches", "targetTouches"].includes(propertyName)) {
+ // Convert TouchList to a regular array for JSON serialization
+ eventEntry[propertyName] = Array.from(propertyValue, touchPoint =>({
+ identifier: touchPoint.identifier,
+ screenX: touchPoint.screenX,
+ screenY: touchPoint.screenY,
+ clientX: touchPoint.clientX,
+ clientY: touchPoint.clientY,
+ pageX: touchPoint.pageX,
+ pageY: touchPoint.pageY,
+ }));
+ }
+ else {
+ eventEntry[propertyName] = propertyValue;
+ }
}
if (entry.projection) {
diff --git a/src/MudBlazor/TScripts/mudPopover.js b/src/MudBlazor/TScripts/mudPopover.js
index 500dfaf8dd43..0936fa6947f6 100644
--- a/src/MudBlazor/TScripts/mudPopover.js
+++ b/src/MudBlazor/TScripts/mudPopover.js
@@ -351,7 +351,7 @@ window.mudpopoverHelper = {
this.updatePopoverZIndex(popoverContentNode, popoverNode.parentNode);
if (window.getComputedStyle(popoverNode).getPropertyValue('z-index') != 'auto') {
- popoverContentNode.style['z-index'] = window.getComputedStyle(popoverNode).getPropertyValue('z-index');
+ popoverContentNode.style['z-index'] = Math.max(window.getComputedStyle(popoverNode).getPropertyValue('z-index'), popoverContentNode.style['z-index']);
popoverContentNode.skipZIndex = true;
}
this.updatePopoverOverlay(popoverContentNode);
@@ -498,7 +498,7 @@ class MudPopover {
}
else if (mutation.attributeName == 'data-ticks') {
// data-ticks are important for Direction and Location, it doesn't reposition
- // if they aren't there
+ // if they aren't there
const tickAttribute = target.getAttribute('data-ticks');
const tickValues = [];
@@ -523,6 +523,19 @@ class MudPopover {
}
}
+ // Iterate over the items in this.map to reset any open overlays
+ for (const mapItem of Object.entries(this.map)) {
+ const item = mapItem.length > 1 ? mapItem[1] : mapItem;
+ const popoverContentNode = item.popoverContentNode; // Access the popover content node (in mud-popover-provider)
+ if (popoverContentNode) {
+ const tickValue = parseInt(popoverContentNode.getAttribute('data-ticks')); // get data-ticks property
+ if (tickValue == 0) {
+ continue;
+ }
+ window.mudpopoverHelper.updatePopoverOverlay(popoverContentNode); // Update the popover overlay for an active popover
+ }
+ }
+
if (tickValues.length == 0) {
continue;
}
@@ -618,6 +631,7 @@ class MudPopover {
contentNodeObserver.observe(popoverContentNode);
this.map[id] = {
+ popoverContentNode: popoverContentNode,
mutationObserver: observer,
resizeObserver: resizeObserver,
contentNodeObserver: contentNodeObserver
diff --git a/tools/CheckPackageContainsStaticAssets.ps1 b/tools/CheckPackageContainsStaticAssets.ps1
new file mode 100644
index 000000000000..f9e38041eea1
--- /dev/null
+++ b/tools/CheckPackageContainsStaticAssets.ps1
@@ -0,0 +1,14 @@
+$nupkgDirectory=$args[0]
+$assetName=$args[1]
+Add-Type -assembly "system.io.compression.filesystem"
+$nupkgFilePath = Get-ChildItem -Path $nupkgDirectory -Filter *.nupkg | Select-Object -First 1
+$fileNames = [io.compression.zipfile]::OpenRead($nupkgFilePath).Entries.Name
+if($fileNames.Contains($assetName))
+{
+ Write-Host -Message "Static asset check - $nupkgFilePath contains $assetName"
+}
+else
+{
+ Write-Error -Message "Static asset check - $nupkgFilePath does not contain $assetNamh"
+ exit 1
+}