From 4fb56c3b16170ba27f91da0f45b619a88d986460 Mon Sep 17 00:00:00 2001 From: Mikhail Shabanov Date: Tue, 18 May 2021 23:23:39 +0200 Subject: [PATCH] feat: Search player component implemented. Plus Winrate color schale implementation --- .../Helpers/DatesHelperTests.cs | 56 +++++++++++++++++- WotBlitzStatisticsPro.Blazor/Constants.cs | 22 +++++++ .../Helpers/DateDifferenceHelper.cs | 30 +++++++++- .../Helpers/ScaleHelper.cs | 21 +++++++ .../Pages/FindClanListItem.razor | 1 + .../Pages/FindPlayerListItem.razor | 22 ++++++- .../Resources/App.de.resx | 6 ++ .../Resources/App.ru.resx | 6 ++ .../icons/details.battles.scale-200.png | Bin 0 -> 2935 bytes .../wwwroot/icons/details.wins.scale-200.png | Bin 0 -> 2762 bytes 10 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 WotBlitzStatisticsPro.Blazor/Helpers/ScaleHelper.cs create mode 100644 WotBlitzStatisticsPro.Blazor/wwwroot/icons/details.battles.scale-200.png create mode 100644 WotBlitzStatisticsPro.Blazor/wwwroot/icons/details.wins.scale-200.png diff --git a/WotBlitzStatisticsPro.Blazor.Tests/Helpers/DatesHelperTests.cs b/WotBlitzStatisticsPro.Blazor.Tests/Helpers/DatesHelperTests.cs index 0e9d67f..afdc03e 100644 --- a/WotBlitzStatisticsPro.Blazor.Tests/Helpers/DatesHelperTests.cs +++ b/WotBlitzStatisticsPro.Blazor.Tests/Helpers/DatesHelperTests.cs @@ -27,6 +27,60 @@ namespace WotBlitzStatisticsPro.Blazor.Tests.Helpers } } - // ToDo: Write months, days, hours and minutes scenarios + [Test] + public void ShouldCalculateMonths() + { + var currentDate = new DateTime(2021, 5, 18); + + for (int i = 0; i < 5; i++) + { + var initialTime = currentDate.AddMonths(-(1 + i * 2)).AddDays(-i); + var result = DateDifferenceHelper.ParseTheDifference(currentDate - initialTime); + result.interval.Should().Be(TimeInterval.Month, $"iterator {i}"); + result.value.Should().Be(1 + i * 2); + } + } + + [Test] + public void ShouldCalculateDays() + { + var currentDate = new DateTime(2021, 5, 18); + + for (int i = 0; i < 5; i++) + { + var initialTime = currentDate.AddDays(-(1 + i * 2)).AddHours(-i); + var result = DateDifferenceHelper.ParseTheDifference(currentDate - initialTime); + result.interval.Should().Be(TimeInterval.Day, $"iterator {i}"); + result.value.Should().Be(1 + i * 2); + } + } + + [Test] + public void ShouldCalculateHours() + { + var currentDate = new DateTime(2021, 5, 18); + + for (int i = 0; i < 5; i++) + { + var initialTime = currentDate.AddHours(-(1 + i * 2)).AddMinutes(-i); + var result = DateDifferenceHelper.ParseTheDifference(currentDate - initialTime); + result.interval.Should().Be(TimeInterval.Hour, $"iterator {i}"); + result.value.Should().Be(1 + i * 2); + } + } + + [Test] + public void ShouldCalculateMinutes() + { + var currentDate = new DateTime(2021, 5, 18); + + for (int i = 0; i < 5; i++) + { + var initialTime = currentDate.AddMinutes(-(1 + i * 2)).AddSeconds(-i); + var result = DateDifferenceHelper.ParseTheDifference(currentDate - initialTime); + result.interval.Should().Be(TimeInterval.Minute, $"iterator {i}"); + result.value.Should().Be(1 + i * 2); + } + } } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Constants.cs b/WotBlitzStatisticsPro.Blazor/Constants.cs index ccb9f48..916bbdb 100644 --- a/WotBlitzStatisticsPro.Blazor/Constants.cs +++ b/WotBlitzStatisticsPro.Blazor/Constants.cs @@ -3,5 +3,27 @@ public class Constants { public const string ClanTagColor = "#d4d481"; + + + //public const string ScaleVeryBadColor = "#000000"; + //public const string ScaleBadColor = "#cd3333"; + //public const string ScaleBelowAverageColor = "#d77900"; + //public const string ScaleAverageColor = "#d7b600"; + //public const string ScaleGoodColor = "#6d9521"; + //public const string ScaleVeryGoodColor = "#4c762e"; + //public const string ScaleGreatColor = "#4a92b7"; + //public const string ScaleUnicumColor = "#83579d"; + //public const string ScaleSuperUnicumColor = "#5a3175"; + public const string ScaleVeryBadColor = "#a3a3a3"; + public const string ScaleBadColor = "#dc7070"; + public const string ScaleBelowAverageColor = "#ff9f25"; + public const string ScaleAverageColor = "#ffdd25"; + public const string ScaleGoodColor = "#9ad131"; + public const string ScaleVeryGoodColor = "#6fad43"; + public const string ScaleGreatColor = "#81b3cd"; + public const string ScaleUnicumColor = "#a785bb"; + public const string ScaleSuperUnicumColor = "#8348ab"; + + } } \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs b/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs index 3396792..639c02f 100644 --- a/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs +++ b/WotBlitzStatisticsPro.Blazor/Helpers/DateDifferenceHelper.cs @@ -24,13 +24,39 @@ namespace WotBlitzStatisticsPro.Blazor.Helpers return $"{difference.value} {ago}"; } + public static string SinceTime(this DateTimeOffset time, IStringLocalizer localizer) + { + var currentDate = DateTime.Now; + + var difference = ParseTheDifference(currentDate - time); + string ago = difference.interval switch + { + TimeInterval.Year => localizer.GetString("years ago"), + TimeInterval.Month => localizer.GetString("months ago"), + TimeInterval.Day => localizer.GetString("days ago"), + TimeInterval.Hour => localizer.GetString("hours ago"), + TimeInterval.Minute => localizer.GetString("minutes ago") + }; + + return $"{difference.value} {ago}"; + } + public static (int value, TimeInterval interval) ParseTheDifference(TimeSpan difference) { - // ToDo: Check hours and mins if Days is 0 + if (difference.TotalHours < 1) + { + return (Convert.ToInt32(difference.TotalMinutes), TimeInterval.Minute); + } + + if (difference.TotalDays < 1) + { + return (Convert.ToInt32(difference.TotalHours), TimeInterval.Hour); + } + return difference.TotalDays switch { >= 365 => (CalculateYears(difference.TotalDays), TimeInterval.Year), - (> 30) and (< 365) => (CalculateMonths(difference.TotalDays), TimeInterval.Month), + (>= 30) and (< 365) => (CalculateMonths(difference.TotalDays), TimeInterval.Month), _ => (Convert.ToInt32(difference.TotalDays), TimeInterval.Day) }; } diff --git a/WotBlitzStatisticsPro.Blazor/Helpers/ScaleHelper.cs b/WotBlitzStatisticsPro.Blazor/Helpers/ScaleHelper.cs new file mode 100644 index 0000000..fcef425 --- /dev/null +++ b/WotBlitzStatisticsPro.Blazor/Helpers/ScaleHelper.cs @@ -0,0 +1,21 @@ +namespace WotBlitzStatisticsPro.Blazor.Helpers +{ + public static class ScaleHelper + { + public static string ScaleColor(this int winRate) + { + return winRate switch + { + ( > 0 ) and ( < 45) => Constants.ScaleVeryBadColor, + ( >= 45 ) and ( < 47 ) => Constants.ScaleBadColor, + ( >= 47 ) and ( < 49 ) => Constants.ScaleBelowAverageColor, + ( >= 49 ) and ( < 52 ) => Constants.ScaleAverageColor, + ( >= 52 ) and ( < 54 ) => Constants.ScaleGoodColor, + ( >= 54 ) and ( < 56 ) => Constants.ScaleVeryGoodColor, + ( >= 56 ) and ( < 60 ) => Constants.ScaleGreatColor, + ( >= 60 ) and ( < 65 ) => Constants.ScaleUnicumColor, + _ => Constants.ScaleSuperUnicumColor + }; + } + } +} \ No newline at end of file diff --git a/WotBlitzStatisticsPro.Blazor/Pages/FindClanListItem.razor b/WotBlitzStatisticsPro.Blazor/Pages/FindClanListItem.razor index 394b750..f380adc 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/FindClanListItem.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/FindClanListItem.razor @@ -18,6 +18,7 @@ +
@code { [Parameter] diff --git a/WotBlitzStatisticsPro.Blazor/Pages/FindPlayerListItem.razor b/WotBlitzStatisticsPro.Blazor/Pages/FindPlayerListItem.razor index e9578ee..eb4c327 100644 --- a/WotBlitzStatisticsPro.Blazor/Pages/FindPlayerListItem.razor +++ b/WotBlitzStatisticsPro.Blazor/Pages/FindPlayerListItem.razor @@ -1,4 +1,24 @@ -@Player.Nickname @(Player.ClanTag == null ? string.Empty : $"[{Player.ClanTag}]") +@using WotBlitzStatisticsPro.Blazor.Helpers +@inject IStringLocalizer Localize +
+
+ @Player.Nickname + @if (Player.ClanTag != null) + { + [@Player.ClanTag] + } +
+
+ @Player.WinRate% +
+
+ @Player.BattlesCount +
+
+ @Player.LastBattle.SinceTime(Localize) +
+
+
@code { [Parameter] diff --git a/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx b/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx index d986568..b9ca076 100644 --- a/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx +++ b/WotBlitzStatisticsPro.Blazor/Resources/App.de.resx @@ -126,12 +126,18 @@ Startseite + + vor Stunden + Anmelden mit WG.net-ID Mitglieder + + vor Minuten + vor Monaten diff --git a/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx b/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx index 82b6bcb..9191665 100644 --- a/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx +++ b/WotBlitzStatisticsPro.Blazor/Resources/App.ru.resx @@ -126,12 +126,18 @@ На главную + + часов назад + Войти с WG.net ID Участников + + минут назад + месяцев назад diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/icons/details.battles.scale-200.png b/WotBlitzStatisticsPro.Blazor/wwwroot/icons/details.battles.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..e30e6e350c0437fec9ceaab058afa73784f6f102 GIT binary patch literal 2935 zcmaJ@c|4T)AD>B4ju0xenWoxO#$0BG$@b7$gRR01*gLC{Ik2B6yaWG|du^V^|@qP*@hif&X&a)*e=&@lkciixmf5pW1J z8o(jwI64Nw!ZA=NEQ*d}T4Lcy&_(1z>-?jYmPBBGF1-G|F~G^+TMOWU`$-6HoQ5#J zDF{R@&V@{(Nc$!-!@VdW`nQp-=0&ZY>yRb^_3%egEz5QF%H4FgvDaWj^j{Xl4kt6> zzyFo->3FX4zNFVJ;MFM>9k$7K@0s0hq1%mqS>eB&M%q~W<4Em5#mTkHnZC&RhxgNK zC+ZZLb92(j5ydX{n}Bzt?VA%_<{WS8pk$gbl{*j&4Pv-k^%RuZ1i>sy(R8!1~OH*3ncryB%usBqHP3lt^CQrLpRyEn{o~N3DPEEC?~kkA)CpJ zYS!)nDF`8t3hLo>fD;Yc!xP5 zzCL6I!2Jf#e|^37bzDJW|y zc9(HhT3FsNsUT{nnK{Sc=BT!cZ*C4p+ZqHZ<^0IYrak-CmjpIFth%BxTGf2}Y;$o* zjPvn7f)plN?Yr}b% zXno+>Ah1#Eq`uE>j$Z$INUMvLv1%+p{oJ6t&iUX8F4t16qt0%Nep#<%OB%9zOMZxR zdOl;9QI>7Ss+eH5O&nQMU!|pSWNwbAQ)D1hjAvDROsn}M+cs?abWmJYm?^QHWEsKv z6tCoCI)#(7JT?awlM#C|FS4yBJiRSc%RZVtxArXOeYIMy)?XL;!$YFcr6`qHsI)Z8L?>K1dq=r3p`su@=Y-RV^7Wzm-H`os0+K z5;(s*yd6uS1nw;4rb?{+qX{u>tFN3oqSswQsV&NN+0?I>srCWaT64bDFXNo3qpYyd z-8<&_ewth7VbYnFsj%?;gwpEtWMhl~Qq#FNeyvOR^9w=lIH5`W0Ds=*52sXLO7YH& zIRo{AifT&I`S9aDlzpPNsn~eMpJ^uoJUWJ5e!A2Y)6+64r&1}GG_v}OLpzT=m{o9j zeejpC;^Zp4Ah&xUj;~pHWwPsxsQk*y@1wR2d#_e;Zjzx;n$vv`%y8E=46O>5BQqYd zuP)1aK-R8&Ilk`x@)d**J4H6JG9CY-pnSzS#0|Z$t+_u}#U`R-$q}#dkK6m2fud)( zPMGDLoh@`+V_o}7xDm0QX57R+1|RwEBOz8eu(n2$)UUHAsKNwF5^ zkT7ij>B>4wD*J`Mp88ro4Q%aP0GIldE9v5x5>Qc zocV7iZo%6bl@%fHPxe+zs&|Ec43wVj!tK2mXBy!_3Fs~I9=V>KNNLLb>Fi>SL!TzCll_jK%4!cjT%JTn9uFLRG#1;npVg6?qdf6OQ1(}L*V+ST zu^_!q=ZZ9T`XpNiv-{(q`y4$f(zUc5id3uBj=Z4kw$;rkdwR!I>b39Sid*c1=a_#T z3N999*vmbYE!dUS$<20N*|v2xZ70*ljCIe6KlXG@)V3Q*t9H*uZT+nGs><=rr?ShX zzE5*t^-EMfkWUzrSRJ()f6@T^FVBkzlvAivGf5h-z+_YSC z`k3y8&zE{lZ^h1cdzvl#uX9ZkrnhkDfhXO!o@W|XtcREcX+(F(!hnTeVHZaaa+&>) GQU3#8;r!(Q literal 0 HcmV?d00001 diff --git a/WotBlitzStatisticsPro.Blazor/wwwroot/icons/details.wins.scale-200.png b/WotBlitzStatisticsPro.Blazor/wwwroot/icons/details.wins.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3330f55e9bf9bc17b4d5e633b91b97a795ce10 GIT binary patch literal 2762 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 F{{w1wdXxYF literal 0 HcmV?d00001