From 13e280c03e4ae24dd83394a6830f0555cfc023fc Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 10 May 2020 16:36:54 -0700 Subject: [PATCH 1/5] #496 Target for MatButton / MatIconButton --- src/MatBlazor.Demo/Demo/DemoMatButton.razor | 20 +++++++++++++ .../Demo/DemoMatIconButton.razor | 10 +++++++ src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor | 3 +- .../Components/MatButton/BaseMatButton.cs | 28 +++++++++++++++---- .../MatIconButton/BaseMatIconButton.cs | 19 ++++++++++--- .../Components/MatNavMenu/BaseMatNavItem.cs | 19 ++++++++++++- 6 files changed, 87 insertions(+), 12 deletions(-) diff --git a/src/MatBlazor.Demo/Demo/DemoMatButton.razor b/src/MatBlazor.Demo/Demo/DemoMatButton.razor index fe42e508..a5cf6103 100644 --- a/src/MatBlazor.Demo/Demo/DemoMatButton.razor +++ b/src/MatBlazor.Demo/Demo/DemoMatButton.razor @@ -16,6 +16,16 @@   Github +
With Font-Awsome Icons and Link in a new Window - Target Defined
+ +   Github + + +
Internal Link in a new Window - Target Defined
+ +   TextField + + @code { @@ -39,6 +49,16 @@   Github +
With Font-Awsome Icons and Link in a new Window - Target Defined
+ +   Github + + +
Internal Link in a new Window - Target Defined
+ +   TextField + + @code { diff --git a/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor b/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor index 298d45f7..52c574e5 100644 --- a/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor +++ b/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor @@ -21,6 +21,16 @@ @MatIconNames.Touch_app +
With Font-Awsome Icons and Link in a new Window - Target Defined
+ + @MatIconNames.Touch_app + + +
Internal Link in a new Window - Target Defined
+ + @MatIconNames.Touch_app + + @code { diff --git a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor index a484615b..a1b08f56 100644 --- a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor +++ b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor @@ -29,9 +29,10 @@ Item 6.A Item 6.B Item 6.C + - Blazor Boilerplate - Href + Blazor Boilerplate - Href - Target = _blank MatBlazor - Href diff --git a/src/MatBlazor/Components/MatButton/BaseMatButton.cs b/src/MatBlazor/Components/MatButton/BaseMatButton.cs index df45f3a2..00d988a4 100644 --- a/src/MatBlazor/Components/MatButton/BaseMatButton.cs +++ b/src/MatBlazor/Components/MatButton/BaseMatButton.cs @@ -2,6 +2,7 @@ using System.Windows.Input; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; +using Microsoft.JSInterop; namespace MatBlazor { @@ -14,6 +15,8 @@ public class BaseMatButton : BaseMatDomComponent [Inject] public Microsoft.AspNetCore.Components.NavigationManager UriHelper { get; set; } + [Inject] + public IJSRuntime JSRuntime { get; set; } protected async override Task OnFirstAfterRenderAsync() { @@ -72,6 +75,12 @@ public BaseMatButton() [Parameter] public string Link { get; set; } + /// + /// Target of Link when clicked. + /// + [Parameter] + public string Target { get; set; } = null; + /// /// Button has raised style. /// @@ -82,7 +91,7 @@ public bool Raised set { _raised = value; - + } } @@ -96,7 +105,7 @@ public bool Unelevated set { _unelevated = value; - + } } @@ -150,7 +159,7 @@ public string Icon set { _icon = value; - + } } @@ -170,7 +179,7 @@ public string Label set { _label = value; - + } } @@ -185,7 +194,14 @@ protected void OnClickHandler(MouseEventArgs ev) { if (Link != null) { - UriHelper.NavigateTo(Link); + if (!string.IsNullOrEmpty(Target)) + { + JSRuntime.InvokeAsync("open", Link, Target); + } + else + { + UriHelper.NavigateTo(Link); + } } else { @@ -213,4 +229,4 @@ protected void OnClickHandler(MouseEventArgs ev) // Unelevated = 2, // Outlined = 3 // } -} \ No newline at end of file +} diff --git a/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs b/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs index 54b4a4ff..1fd1e65b 100644 --- a/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs +++ b/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs @@ -2,6 +2,7 @@ using System.Windows.Input; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; +using Microsoft.JSInterop; namespace MatBlazor { @@ -13,6 +14,9 @@ public class BaseMatIconButton : BaseMatDomComponent [Inject] public Microsoft.AspNetCore.Components.NavigationManager UriHelper { get; set; } + [Inject] + public IJSRuntime JSRuntime { get; set; } + private bool _disabled; private bool _toggled = false; @@ -26,10 +30,10 @@ public class BaseMatIconButton : BaseMatDomComponent public string Icon { get; set; } /// - /// *Not available yet + /// Target of Link when clicked. /// [Parameter] - public string Target { get; set; } + public string Target { get; set; } = null; /// /// Icon to use when Button is clicked @@ -111,7 +115,14 @@ protected async Task OnClickHandler(MouseEventArgs ev) if (Link != null) { - UriHelper.NavigateTo(Link); + if (!string.IsNullOrEmpty(Target)) + { + JSRuntime.InvokeAsync("open", Link, Target); + } + else + { + UriHelper.NavigateTo(Link); + } } else { @@ -123,4 +134,4 @@ protected async Task OnClickHandler(MouseEventArgs ev) } } } -} \ No newline at end of file +} diff --git a/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs b/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs index 6d72f7c3..bdda5ca6 100644 --- a/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs +++ b/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Components.Web; +using Microsoft.JSInterop; using System.Threading.Tasks; using System.Windows.Input; @@ -14,6 +15,9 @@ public class BaseMatNavItem : BaseMatListItem [Inject] public NavigationManager UriHelper { get; set; } + [Inject] + public IJSRuntime JSRuntime { get; set; } + [CascadingParameter] public BaseMatNavMenu MatNavMenu { get; set; } @@ -35,6 +39,12 @@ public class BaseMatNavItem : BaseMatListItem [Parameter] public bool Selected { get; set; } + /// + /// *Not yet functional - Target of Href when clicked. + /// + [Parameter] + public string Target { get; set; } = null; + /// /// NavLinkMatch parameter used to determine the active state of the Nav Item. /// @@ -85,7 +95,14 @@ protected async void OnClickHandler(MouseEventArgs e) if (Href != null) { - UriHelper.NavigateTo(Href); + //if (!string.IsNullOrEmpty(Target)) + //{ + // await JSRuntime.InvokeAsync("open", Href, Target); + //} + //else + //{ + UriHelper.NavigateTo(Href); + //} } else { From 4febbab764d7f5a96c31338d8008aed03617116e Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 10 May 2020 16:43:36 -0700 Subject: [PATCH 2/5] #496 Target for MatButton / MatIconButton - Demo fixes --- src/MatBlazor.Demo/Demo/DemoMatIconButton.razor | 10 ++++++++++ src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor b/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor index 52c574e5..2f41335a 100644 --- a/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor +++ b/src/MatBlazor.Demo/Demo/DemoMatIconButton.razor @@ -60,6 +60,16 @@ @MatIconNames.Touch_app +
With Font-Awsome Icons and Link in a new Window - Target Defined
+ + @MatIconNames.Touch_app + + +
Internal Link in a new Window - Target Defined
+ + @MatIconNames.Touch_app + + @code { diff --git a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor index a1b08f56..d736431b 100644 --- a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor +++ b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor @@ -32,7 +32,7 @@ - Blazor Boilerplate - Href - Target = _blank + Blazor Boilerplate - Href MatBlazor - Href From 9ca9c74ae7067f63b1ca398e3597dea099f930f2 Mon Sep 17 00:00:00 2001 From: Keith Date: Sun, 10 May 2020 17:35:02 -0700 Subject: [PATCH 3/5] Clean Up JSInvoke --- src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor | 6 +++--- .../Components/MatButton/BaseMatButton.cs | 10 +++------- .../MatIconButton/BaseMatIconButton.cs | 8 ++------ .../Components/MatNavMenu/BaseMatNavItem.cs | 18 +++++++----------- 4 files changed, 15 insertions(+), 27 deletions(-) diff --git a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor index d736431b..876c02dc 100644 --- a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor +++ b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor @@ -29,10 +29,10 @@ Item 6.A Item 6.B Item 6.C - + - Blazor Boilerplate - Href + Blazor Boilerplate - Href MatBlazor - Href @@ -312,4 +312,4 @@ } ")> - \ No newline at end of file + diff --git a/src/MatBlazor/Components/MatButton/BaseMatButton.cs b/src/MatBlazor/Components/MatButton/BaseMatButton.cs index 00d988a4..5474c53c 100644 --- a/src/MatBlazor/Components/MatButton/BaseMatButton.cs +++ b/src/MatBlazor/Components/MatButton/BaseMatButton.cs @@ -2,7 +2,6 @@ using System.Windows.Input; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; -using Microsoft.JSInterop; namespace MatBlazor { @@ -15,9 +14,6 @@ public class BaseMatButton : BaseMatDomComponent [Inject] public Microsoft.AspNetCore.Components.NavigationManager UriHelper { get; set; } - [Inject] - public IJSRuntime JSRuntime { get; set; } - protected async override Task OnFirstAfterRenderAsync() { await base.OnFirstAfterRenderAsync(); @@ -190,13 +186,13 @@ public string Label [Parameter] public RenderFragment ChildContent { get; set; } - protected void OnClickHandler(MouseEventArgs ev) + protected async void OnClickHandler(MouseEventArgs ev) { if (Link != null) { if (!string.IsNullOrEmpty(Target)) { - JSRuntime.InvokeAsync("open", Link, Target); + await JsInvokeAsync("open", Link, Target); } else { @@ -205,7 +201,7 @@ protected void OnClickHandler(MouseEventArgs ev) } else { - OnClick.InvokeAsync(ev); + await OnClick.InvokeAsync(ev); if (Command?.CanExecute(CommandParameter) ?? false) { Command.Execute(CommandParameter); diff --git a/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs b/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs index 1fd1e65b..f4ff38f5 100644 --- a/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs +++ b/src/MatBlazor/Components/MatIconButton/BaseMatIconButton.cs @@ -2,7 +2,6 @@ using System.Windows.Input; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; -using Microsoft.JSInterop; namespace MatBlazor { @@ -14,9 +13,6 @@ public class BaseMatIconButton : BaseMatDomComponent [Inject] public Microsoft.AspNetCore.Components.NavigationManager UriHelper { get; set; } - [Inject] - public IJSRuntime JSRuntime { get; set; } - private bool _disabled; private bool _toggled = false; @@ -117,7 +113,7 @@ protected async Task OnClickHandler(MouseEventArgs ev) { if (!string.IsNullOrEmpty(Target)) { - JSRuntime.InvokeAsync("open", Link, Target); + await JsInvokeAsync("open", Link, Target); } else { @@ -126,7 +122,7 @@ protected async Task OnClickHandler(MouseEventArgs ev) } else { - OnClick.InvokeAsync(ev); + await OnClick.InvokeAsync(ev); if (Command?.CanExecute(CommandParameter) ?? false) { Command.Execute(CommandParameter); diff --git a/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs b/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs index bdda5ca6..ae945879 100644 --- a/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs +++ b/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs @@ -1,7 +1,6 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Components.Web; -using Microsoft.JSInterop; using System.Threading.Tasks; using System.Windows.Input; @@ -15,9 +14,6 @@ public class BaseMatNavItem : BaseMatListItem [Inject] public NavigationManager UriHelper { get; set; } - [Inject] - public IJSRuntime JSRuntime { get; set; } - [CascadingParameter] public BaseMatNavMenu MatNavMenu { get; set; } @@ -95,14 +91,14 @@ protected async void OnClickHandler(MouseEventArgs e) if (Href != null) { - //if (!string.IsNullOrEmpty(Target)) - //{ - // await JSRuntime.InvokeAsync("open", Href, Target); - //} - //else - //{ + if (!string.IsNullOrEmpty(Target)) + { + await JsInvokeAsync("open", Href, Target); + } + else + { UriHelper.NavigateTo(Href); - //} + } } else { From dbadbbf047317683f45878a7e52a3b259a6830e1 Mon Sep 17 00:00:00 2001 From: Keith Date: Wed, 13 May 2020 15:21:40 -0700 Subject: [PATCH 4/5] #218 - Breakpoints typo --- content/mat-hidden-breakpoints.png | Bin 26034 -> 5630 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/mat-hidden-breakpoints.png b/content/mat-hidden-breakpoints.png index 2b1ac98ad439f5d6688963286dde8af030a84e46..9a361c27f750dd056d43d597a81a11b17a9faf1b 100644 GIT binary patch literal 5630 zcmb7I2{@GP{?_(UVk(q9OAHAOVla|DOQTTZOO482m@r1K8e~Z&Wf?}vObBiEok5l~ zBl{ZD%p`***~Y&AM}1%CeCK@sbDeWt@AdrVdfxkapXdEuzx%#_@7y~LH{;tSx{Hg8 zi_iR|u?-j3Hh_z3iy_Z8&dkl-%x9b+f;O>7+oD|20hfJUxD1?8S6rmby)L`C*tlGF z27D+kFb?SGX)8OEty{O=xpU{;yLaj7>C4N@eSLkUrKL(rN^^5_0RaKV#>VdM?qg$P zLqkL7&Yj!X*r@AI@Z#bUayB?!I9lFP)n9Gp&%f<$#=yD#F)x$69$Iup_ z`rHY6R`J4apH%Mw%N#6k@Zy+Z+6vznQ1C$}h&>glPfmB4;s%O#uX9FY{&lHGiM0pU zr9i=pVX*VRZH}vhAhx^6=J*%%f)A5#fJe)}wEpler}~r{m8Y7)2BLd=5b(BntqMp@ zGv#@#Ur8c^mAWn7EO^BL1|63ZXIK*iec6TqriA^NPWe0OoK@$7rR7ySzp6eZd`F?> z&E~&H+jTAi5}qYW&fMJ7pHcdEE4zZ~rpKAeIopdJDr8VTYAMeW9`mm+Uq8R*kA6F~i4coSx z>%wUKYZJMktR7-B_QKA1H+b7zRz%;s`{-m!zAObo^9HbMdW!Wz3<$?SSXF0e64M@o3p>X-iv)TUT>eiNXClVM{8rOwScM8gAFtf z{lUc`cGJs4&uIvmnw0P+xAz|VMtA!~)!-JyUO&&9sdYRE2lc!9N)dJRXpGyW?H70T z_wS0;BcRy7-k!$fo6mc_bfS4l5I3X-_-`X(1oIE9sEH#@dsqG17Yl}-^s9Mx(~jYm1ktizVm<6 z=xoN6P>yaiSM<^eNi}09c9Y^e;ZK9F>TREeaH*QmpUrsOM6)qU-Gvi@v(1h-LrnmY zQ=X-!{yAdoi6habC0!BX%d)74Imj{j=x++o9&Ndy$ZqmeIge*xZUt8~uyijRge6?* zPbgCX1)K+iE2Sq}J5A}I+k)1+)!E)4Is3E;#b?30-@dl9Hy!edW(FEH5-`vPJs(TK z-qBY3mp>OEv0KgDn8hoX0)*Rdav>j(aN@-}wVo0AwqHFW&x)FR94k7Cm=n4BN|yaF z(VMB5UMZ^z)kllAmvWIrf%I~@_4H$Dk=%BZ>#ixN`Xu5BLLH0=^SGb-6CZss4(x!7 znz3|W*n;JK8x@NuK16>U`rRaTWnj?ci7&T*%0WMVv<{Tw9f8siLh_viX@E%y$6VfMRJ!~e@bYVd> z1*yxLeW&bwHTJp(Gvkwr3+7^MKpy&q*PRJ66&$4_ivqp97OPdU%7u>^&9KRJg!g<{ za++=-z5-3B%vd>zz$jmb2ZR7_%g7~Cu|C_CF)}0HB>+TnkpzKzCHaIKO&5x<+n5eE zA~Dbu-e`O;^CfHFNYmYXbvDM*i!W*~?P)o?2mp>h692F- z-Qq82KpxYK-Yqenci*(ztOa)z1ZgAso6x;qW>X*7n!PS`zIno$HPIwvuRm9$vY^5> z*&MVA&9(fq$p3JVyW&49oilFw%}>|)_abNi@}GZU$ltB2tf<+^v8EdJTYB`|y_>&K zr-QzQhjWZ;az(eQnLcI8KCQ1N9@;9%n&I39jm>P@*&`p$5&F#WW?llpiz`78B8P?8 z%rpPd^Zqx7{O{5KssQyI2may1$Dfe)TqNg)X$)1gcJ3UUZSUY$LWSpB25O0>QYVcy zskdvmEuFBwZ@T>S-&^<2D~o0-gikwJZ^0f2F)KXC7*%vqcRz2nq`;#paI2a~?x_2n z6@5mo+3A?PuFRynhX&ljqif4P8M7q0&c(cwLgJ+2dneiFU6zcSx{$?N?A@XcwhCr?^D5MKrotmETpF#&EKvZyI< z)+3UKZmPXGu4go;fi@nU93A!xB$9}h&% zeb^cZ+T`Ft7ScMjP^b}}3JyLT{k%x@eA4SrC!%a6VgriMveqIr37~cl$$MXT-*BP0K1u_EyACg>T^b(P z3z%8nB!Vlx�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 From 1914e79ba21cb0ae4e65cd1e61d71cea624cc0ce Mon Sep 17 00:00:00 2001 From: Keith Date: Thu, 14 May 2020 02:31:28 -0700 Subject: [PATCH 5/5] #492, #496 - MatNavItem Target Feature --- src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor | 2 +- src/MatBlazor.Demo/Demo/DemoTable.razor | 189 +++++++++++++++++- .../Components/Base/BaseMatComponent.cs | 2 +- .../Components/MatNavMenu/BaseMatNavItem.cs | 2 +- .../Components/MatNavMenu/MatNavItem.razor | 24 +-- .../Components/MatTable/MatTable.razor | 12 +- src/MatBlazor/MatBlazor.xml | 12 +- 7 files changed, 219 insertions(+), 24 deletions(-) diff --git a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor index 876c02dc..9c3641e4 100644 --- a/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor +++ b/src/MatBlazor.Demo/Demo/DemoMatNavMenu.razor @@ -32,7 +32,7 @@ - Blazor Boilerplate - Href + Blazor Boilerplate - Href - Target = _blank MatBlazor - Href diff --git a/src/MatBlazor.Demo/Demo/DemoTable.razor b/src/MatBlazor.Demo/Demo/DemoTable.razor index 83cc0a97..73218510 100644 --- a/src/MatBlazor.Demo/Demo/DemoTable.razor +++ b/src/MatBlazor.Demo/Demo/DemoTable.razor @@ -48,7 +48,7 @@ - Name @@ -133,7 +133,7 @@ - @@ -170,6 +170,184 @@ +
Example with sort header table
+ + + + + + Dessert (100g) + Calories + Fat (g) + Carbs (g) + Protein (g) + + + + @context.Name + @context.Calories + @context.Fat + @context.Carbs + @context.Protein + + + + @code + { + class Dessert + { + public int Calories { get; set; } + public int Carbs { get; set; } + public int Fat { get; set; } + public string Name { get; set; } + public int Protein { get; set; } + } + + Dessert[] desserts = new[] + { + new Dessert() {Name = "Frozen yogurt", Calories = 159, Fat = 6, Carbs = 24, Protein = 4}, + new Dessert() {Name = "Ice cream sandwich", Calories = 237, Fat = 9, Carbs = 37, Protein = 4}, + new Dessert() {Name = "Eclair", Calories = 262, Fat = 16, Carbs = 24, Protein = 6}, + new Dessert() {Name = "Cupcake", Calories = 305, Fat = 4, Carbs = 67, Protein = 4}, + new Dessert() {Name = "Gingerbread", Calories = 356, Fat = 16, Carbs = 49, Protein = 4}, + }; + + void SortData(MatSortChangedEvent sort) + { + sortedData = desserts.ToArray(); + if (!(sort == null || sort.Direction == MatSortDirection.None || string.IsNullOrEmpty(sort.SortId))) + { + Comparison comparison = null; + switch (sort.SortId) + { + case "name": + comparison = (s1, s2) => string.Compare(s1.Name, s2.Name, StringComparison.InvariantCultureIgnoreCase); + break; + case "calories": + comparison = (s1, s2) => s1.Calories.CompareTo(s2.Calories); + break; + case "fat": + comparison = (s1, s2) => s1.Fat.CompareTo(s2.Fat); + break; + case "carbs": + comparison = (s1, s2) => s1.Carbs.CompareTo(s2.Carbs); + break; + case "protein": + comparison = (s1, s2) => s1.Protein.CompareTo(s2.Protein); + break; + } + if (comparison != null) + { + if (sort.Direction == MatSortDirection.Desc) + { + Array.Sort(sortedData, (s1, s2) => -1 * comparison(s1, s2)); + } + else + { + Array.Sort(sortedData, comparison); + } + } + } + } + + Dessert[] sortedData = null; + + protected override void OnInitialized() + { + base.OnInitialized(); + SortData(null); + } + } + + + + + + + Dessert (100g) + Calories + Fat (g) + Carbs (g) + Protein (g) + + + + @context.Name + @context.Calories + @context.Fat + @context.Carbs + @context.Protein + + + @code + { + class Dessert + { + public int Calories { get; set; } + public int Carbs { get; set; } + public int Fat { get; set; } + public string Name { get; set; } + public int Protein { get; set; } + } + Dessert[] desserts = new[] + { + new Dessert() {Name = ""Frozen yogurt"", Calories = 159, Fat = 6, Carbs = 24, Protein = 4}, + new Dessert() {Name = ""Ice cream sandwich"", Calories = 237, Fat = 9, Carbs = 37, Protein = 4}, + new Dessert() {Name = ""Eclair"", Calories = 262, Fat = 16, Carbs = 24, Protein = 6}, + new Dessert() {Name = ""Cupcake"", Calories = 305, Fat = 4, Carbs = 67, Protein = 4}, + new Dessert() {Name = ""Gingerbread"", Calories = 356, Fat = 16, Carbs = 49, Protein = 4}, + }; + void SortData(MatSortChangedEvent sort) + { + sortedData = desserts.ToArray(); + if (!(sort == null || sort.Direction == MatSortDirection.None || string.IsNullOrEmpty(sort.SortId))) + { + Comparison comparison = null; + switch (sort.SortId) + { + case ""name"": + comparison = (s1, s2) => string.Compare(s1.Name, s2.Name, StringComparison.InvariantCultureIgnoreCase); + break; + case ""calories"": + comparison = (s1, s2) => s1.Calories.CompareTo(s2.Calories); + break; + case ""fat"": + comparison = (s1, s2) => s1.Fat.CompareTo(s2.Fat); + break; + case ""carbs"": + comparison = (s1, s2) => s1.Carbs.CompareTo(s2.Carbs); + break; + case ""protein"": + comparison = (s1, s2) => s1.Protein.CompareTo(s2.Protein); + break; + } + if (comparison != null) + { + if (sort.Direction == MatSortDirection.Desc) + { + Array.Sort(sortedData, (s1, s2) => -1 * comparison(s1, s2)); + } + else + { + Array.Sort(sortedData, comparison); + } + } + } + } + Dessert[] sortedData = null; + protected override void OnInitialized() + { + base.OnInitialized(); + SortData(null); + } + } + ")> + + + + +
Select row, with returning selected item example
@@ -202,9 +380,6 @@ Description = description; } } - protected override void OnInitialized() - { - } Task[] tasks = new[] { @@ -233,7 +408,7 @@ - Id @@ -294,4 +469,4 @@ ")> - \ No newline at end of file + diff --git a/src/MatBlazor/Components/Base/BaseMatComponent.cs b/src/MatBlazor/Components/Base/BaseMatComponent.cs index 16f77962..ab6e76d1 100644 --- a/src/MatBlazor/Components/Base/BaseMatComponent.cs +++ b/src/MatBlazor/Components/Base/BaseMatComponent.cs @@ -118,4 +118,4 @@ protected void DisposeDotNetObjectRef(DotNetObjectReference value) where T #endregion } -} \ No newline at end of file +} diff --git a/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs b/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs index ae945879..93f8b532 100644 --- a/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs +++ b/src/MatBlazor/Components/MatNavMenu/BaseMatNavItem.cs @@ -93,7 +93,7 @@ protected async void OnClickHandler(MouseEventArgs e) { if (!string.IsNullOrEmpty(Target)) { - await JsInvokeAsync("open", Href, Target); + // Do nothing here as it is a target for an anchor tag } else { diff --git a/src/MatBlazor/Components/MatNavMenu/MatNavItem.razor b/src/MatBlazor/Components/MatNavMenu/MatNavItem.razor index 5b65ea27..ae510cc7 100644 --- a/src/MatBlazor/Components/MatNavMenu/MatNavItem.razor +++ b/src/MatBlazor/Components/MatNavMenu/MatNavItem.razor @@ -2,21 +2,21 @@ @using Microsoft.AspNetCore.Components.Routing; @inherits BaseMatNavItem - + - @if (string.IsNullOrEmpty(Href) || Disabled) - { -
  • - @ChildContent -
  • - } - else - { + @if (string.IsNullOrEmpty(Href) || Disabled) + { +
  • + @ChildContent +
  • + } + else + {
  • - + @ChildContent
  • - } + } -
    +
    diff --git a/src/MatBlazor/Components/MatTable/MatTable.razor b/src/MatBlazor/Components/MatTable/MatTable.razor index cfa90b81..34022b4e 100644 --- a/src/MatBlazor/Components/MatTable/MatTable.razor +++ b/src/MatBlazor/Components/MatTable/MatTable.razor @@ -16,7 +16,14 @@ - @MatTableHeader + @if (UseSortHeaderRow) + { + @MatTableHeader + } + else + { + @MatTableHeader + } @if (ItemList != null) @@ -91,6 +98,9 @@ [Parameter] public RenderFragment MatTableHeader { get; set; } + [Parameter] + public bool UseSortHeaderRow { get; set; } = false; + [Parameter] public RenderFragment MatTableRow { get; set; } diff --git a/src/MatBlazor/MatBlazor.xml b/src/MatBlazor/MatBlazor.xml index 962abebe..df3cc190 100644 --- a/src/MatBlazor/MatBlazor.xml +++ b/src/MatBlazor/MatBlazor.xml @@ -236,6 +236,11 @@ Link to a url when clicked. + + + Target of Link when clicked. + + Button has raised style. @@ -355,7 +360,7 @@ - *Not available yet + Target of Link when clicked. @@ -450,6 +455,11 @@ Command parameter. + + + *Not yet functional - Target of Href when clicked. + + NavLinkMatch parameter used to determine the active state of the Nav Item.