diff --git a/WebfrontCore/Controllers/ServerController.cs b/WebfrontCore/Controllers/ServerController.cs index 8e766da89..d9ff08e33 100644 --- a/WebfrontCore/Controllers/ServerController.cs +++ b/WebfrontCore/Controllers/ServerController.cs @@ -58,11 +58,11 @@ namespace WebfrontCore.Controllers { ViewBag.Title = Localization["WEBFRONT_TITLE_SCOREBOARD"]; - return View(ProjectScoreboard(Manager.GetServers())); + return View(ProjectScoreboard(Manager.GetServers(), null, true)); } [HttpGet("[controller]/{id}/scoreboard")] - public ActionResult Scoreboard(long id) + public ActionResult Scoreboard(long id, [FromQuery]string order = null, [FromQuery] bool down = true) { var server = Manager.GetServers().FirstOrDefault(srv => srv.EndPoint == id); @@ -71,13 +71,16 @@ namespace WebfrontCore.Controllers return NotFound(); } - return View("_Scoreboard", ProjectScoreboard(new[] {server}).First()); + return View("_Scoreboard", ProjectScoreboard(new[] {server}, order, down).First()); } - private IEnumerable ProjectScoreboard(IEnumerable servers) + private static IEnumerable ProjectScoreboard(IEnumerable servers, string order, + bool down) { return servers.Select(server => new ScoreboardInfo { + OrderByKey = order, + ShouldOrderDescending = down, MapName = server.CurrentMap.ToString(), ServerName = server.Hostname, ServerId = server.EndPoint, @@ -96,7 +99,8 @@ namespace WebfrontCore.Controllers Kills = clientData.stats?.MatchData?.Kills, Deaths = clientData.stats?.MatchData?.Deaths, ScorePerMinute = clientData.stats?.SessionSPM, - Kdr = clientData.stats?.MatchData?.Kdr + Kdr = clientData.stats?.MatchData?.Kdr, + ZScore = clientData.stats?.ZScore }) .ToList() }).ToList(); diff --git a/WebfrontCore/ViewModels/ScoreboardInfo.cs b/WebfrontCore/ViewModels/ScoreboardInfo.cs index ad4e31c85..a9ac140a1 100644 --- a/WebfrontCore/ViewModels/ScoreboardInfo.cs +++ b/WebfrontCore/ViewModels/ScoreboardInfo.cs @@ -8,6 +8,8 @@ namespace WebfrontCore.ViewModels public string ServerName { get; set; } public long ServerId { get; set; } public string MapName { get; set; } + public string OrderByKey { get; set; } + public bool ShouldOrderDescending { get; set; } public List ClientInfo { get; set; } } @@ -21,5 +23,6 @@ namespace WebfrontCore.ViewModels public int? Deaths { get; set; } public double? ScorePerMinute { get; set; } public double? Kdr { get; set; } + public double? ZScore { get; set; } } } diff --git a/WebfrontCore/Views/Server/_Scoreboard.cshtml b/WebfrontCore/Views/Server/_Scoreboard.cshtml index 317a0212b..9ccbcf284 100644 --- a/WebfrontCore/Views/Server/_Scoreboard.cshtml +++ b/WebfrontCore/Views/Server/_Scoreboard.cshtml @@ -1,19 +1,41 @@ -@model WebfrontCore.ViewModels.ScoreboardInfo +@using WebfrontCore.ViewModels +@model WebfrontCore.ViewModels.ScoreboardInfo @{ Layout = null; + + object OrderByFunc(ClientScoreboardInfo item) + { + var property = typeof(ClientScoreboardInfo).GetProperties().FirstOrDefault(prop => + prop.CanRead && prop.Name.Equals(Model.OrderByKey, StringComparison.InvariantCultureIgnoreCase)); + + return property != null ? property.GetValue(item) : item.Score; + } + + string GetColumnSortDisplay(string propertyName) + { + if (propertyName == Model.OrderByKey) + { + return Model.ShouldOrderDescending ? "" : ""; + } + + return null; + } } - +
- - - - - - - + + + + + + + + - @foreach (var client in Model.ClientInfo.OrderByDescending(c => c.Score)) + @foreach (var client in Model.ShouldOrderDescending ? Model.ClientInfo.OrderByDescending(OrderByFunc) : Model.ClientInfo.OrderBy(OrderByFunc)) { + } diff --git a/WebfrontCore/wwwroot/css/src/main.scss b/WebfrontCore/wwwroot/css/src/main.scss index e4bb4e76a..c89c1cc2a 100644 --- a/WebfrontCore/wwwroot/css/src/main.scss +++ b/WebfrontCore/wwwroot/css/src/main.scss @@ -197,7 +197,7 @@ form *, select, button.btn { font-size: 1rem; } -.oi { +.oi, .table-sort-column { cursor: pointer; } @@ -454,4 +454,4 @@ div.card { padding-left: 1rem !important; padding-right: 1rem !important; line-height: 1.45rem !important; -} \ No newline at end of file +} diff --git a/WebfrontCore/wwwroot/js/scoreboard.js b/WebfrontCore/wwwroot/js/scoreboard.js index c4db64517..478057fe2 100644 --- a/WebfrontCore/wwwroot/js/scoreboard.js +++ b/WebfrontCore/wwwroot/js/scoreboard.js @@ -2,14 +2,31 @@ const serverPanel = $('.scoreboard-container.active'); const serverId = $(serverPanel).data('server-id'); - $.get(`../Server/${serverId}/Scoreboard`, (response) => { + const scoreboardTable = $(serverPanel).children('.table-sort'); + + $.get(`../Server/${serverId}/Scoreboard?order=${scoreboardTable.data('sort-column')}&down=${scoreboardTable.data('sort-down')}`, (response) => { $(serverPanel).html(response); + setupDataSorting(); }); } $(document).ready(() => { $(window.location.hash).tab('show'); $(`${window.location.hash}_nav`).addClass('active'); + + setupDataSorting(); }) +function setupDataSorting() { + const tableColumn = $('.table-sort-column'); + $(tableColumn).off('click'); + $(tableColumn).on('click', function() { + const columnName = $(this).data('column-name'); + const table = $('.table-sort'); + $(table).data('sort-column', columnName); + $(table).data('sort-down', $(table).data('sort-down') !== true); + refreshScoreboard(); + }) +} + setInterval(refreshScoreboard, 5000);
@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_PLAYER"]@ViewBag.Localization["WEBFRONT_ADV_STATS_SCORE"]@ViewBag.Localization["WEBFRONT_ADV_STATS_KILLS"]@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_DEATHS"]@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_RATIO"]@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_SPM"]@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_PING"]@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_PLAYER"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.ClientName)))@ViewBag.Localization["WEBFRONT_ADV_STATS_SCORE"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.Score)))@ViewBag.Localization["WEBFRONT_ADV_STATS_KILLS"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.Kills)))@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_DEATHS"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.Deaths)))@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_RATIO"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.Kdr)))@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_SPM"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.ScorePerMinute)))@ViewBag.Localization["WEBFRONT_ADV_STATS_ZSCORE"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.ZScore)))@ViewBag.Localization["WEBFRONT_SCOREBOARD_TABLE_PING"]@Html.Raw(GetColumnSortDisplay(nameof(ClientScoreboardInfo.Ping)))
@@ -26,6 +48,7 @@ @(client.Deaths ?? 0) @Math.Round(client.Kdr ?? 0, 2) @Math.Round(client.ScorePerMinute ?? 0)@Math.Round(client.ZScore ?? 0) @client.Ping