From 344af2f954c0625816f7cc883a01f8b6dbbdda95 Mon Sep 17 00:00:00 2001 From: Kenny Young <42425095+tabascq@users.noreply.github.com> Date: Wed, 24 Apr 2019 19:41:24 -0700 Subject: [PATCH] Local Time Zone (fixes #102) (#403) * Local Time Zone (fixes #102) All times displayed in the UX for players, authors, and admins now appear in the browser's local time zone, with the exception of the event creation/properties because I don't know how to do the time zone transitions for editable fields. Internet wisdom is that the only way to do this well is to do it in Javascript because anything done on the server will use the server timezone instead of the user timezone. I searched around for a while to locate the easiest-looking version of this, and it seems to be working properly. * PR changes --- ServerCore/Helpers/TimeHelper.cs | 21 +++++++++++++++++++ .../ModelBases/EventSpecificPageModel.cs | 5 +++++ ServerCore/Pages/Events/Create.cshtml | 1 + ServerCore/Pages/Events/Details.cshtml | 1 + ServerCore/Pages/Events/Edit.cshtml | 1 + ServerCore/Pages/Hints/AuthorIndex.cshtml | 2 +- ServerCore/Pages/Puzzles/Feedback.cshtml | 2 +- ServerCore/Pages/Puzzles/Status.cshtml | 4 ++-- .../Pages/Submissions/AuthorIndex.cshtml | 2 +- ServerCore/Pages/Submissions/Index.cshtml | 2 +- ServerCore/Pages/Teams/Answers.cshtml | 2 +- ServerCore/Pages/Teams/Play.cshtml | 2 +- ServerCore/Pages/Teams/Status.cshtml | 4 ++-- ServerCore/wwwroot/js/site.js | 5 +++++ 14 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 ServerCore/Helpers/TimeHelper.cs diff --git a/ServerCore/Helpers/TimeHelper.cs b/ServerCore/Helpers/TimeHelper.cs new file mode 100644 index 00000000..99fd376d --- /dev/null +++ b/ServerCore/Helpers/TimeHelper.cs @@ -0,0 +1,21 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using ServerCore.DataModel; + +namespace ServerCore.Helpers +{ + public static class TimeHelper + { + /// + /// returns a time with the formatting required for the jQuery code in site.js to convert it to browser local time + /// + /// + /// + public static string LocalTime(DateTime? date) + { + return date == null ? " " : $""; + } + } +} diff --git a/ServerCore/ModelBases/EventSpecificPageModel.cs b/ServerCore/ModelBases/EventSpecificPageModel.cs index ecd5d943..047185e9 100644 --- a/ServerCore/ModelBases/EventSpecificPageModel.cs +++ b/ServerCore/ModelBases/EventSpecificPageModel.cs @@ -87,6 +87,11 @@ public async Task GetTeamId() } } + public string LocalTime(DateTime? date) + { + return TimeHelper.LocalTime(date); + } + public class EventBinder : IModelBinder { public async Task BindModelAsync(ModelBindingContext bindingContext) diff --git a/ServerCore/Pages/Events/Create.cshtml b/ServerCore/Pages/Events/Create.cshtml index 3ffdb1fb..e558e00f 100644 --- a/ServerCore/Pages/Events/Create.cshtml +++ b/ServerCore/Pages/Events/Create.cshtml @@ -6,6 +6,7 @@ }

Create a new event

+

ALL TIMES UTC! Current time is @DateTime.UtcNow.ToShortTimeString()

Event


diff --git a/ServerCore/Pages/Events/Details.cshtml b/ServerCore/Pages/Events/Details.cshtml index d23a40bc..f0eb3ad3 100644 --- a/ServerCore/Pages/Events/Details.cshtml +++ b/ServerCore/Pages/Events/Details.cshtml @@ -9,6 +9,7 @@ }

@Model.Event.Name: Details

+

ALL TIMES UTC! Current time is @DateTime.UtcNow.ToShortTimeString()

Edit | Import | Delete diff --git a/ServerCore/Pages/Events/Edit.cshtml b/ServerCore/Pages/Events/Edit.cshtml index 636ca316..c9da1c29 100644 --- a/ServerCore/Pages/Events/Edit.cshtml +++ b/ServerCore/Pages/Events/Edit.cshtml @@ -9,6 +9,7 @@ }

@Model.Event.Name: Edit

+

ALL TIMES UTC! Current time is @DateTime.UtcNow.ToShortTimeString()

Cancel
diff --git a/ServerCore/Pages/Hints/AuthorIndex.cshtml b/ServerCore/Pages/Hints/AuthorIndex.cshtml index b73a9878..036eaad6 100644 --- a/ServerCore/Pages/Hints/AuthorIndex.cshtml +++ b/ServerCore/Pages/Hints/AuthorIndex.cshtml @@ -77,7 +77,7 @@ @Html.DisplayFor(modelItem => item.Hint.Cost) - @Html.DisplayFor(modelItem => item.UnlockTime) + @Html.Raw(Model.LocalTime(item.UnlockTime)) } diff --git a/ServerCore/Pages/Puzzles/Feedback.cshtml b/ServerCore/Pages/Puzzles/Feedback.cshtml index 074e1c17..3e090411 100644 --- a/ServerCore/Pages/Puzzles/Feedback.cshtml +++ b/ServerCore/Pages/Puzzles/Feedback.cshtml @@ -68,7 +68,7 @@ else @Html.DisplayFor(modelItem => item.Submitter.Email) - @Html.DisplayFor(modelItem => item.Feedback.SubmissionTime) + @Html.Raw(Model.LocalTime(item.Feedback.SubmissionTime)) @Html.DisplayFor(modelItem => item.Feedback.WrittenFeedback) diff --git a/ServerCore/Pages/Puzzles/Status.cshtml b/ServerCore/Pages/Puzzles/Status.cshtml index 12cebe86..c3584029 100644 --- a/ServerCore/Pages/Puzzles/Status.cshtml +++ b/ServerCore/Pages/Puzzles/Status.cshtml @@ -55,7 +55,7 @@ } else { - @Html.DisplayFor(modelItem => item.UnlockedTime) + @Html.Raw(Model.LocalTime(item.UnlockedTime)) X } @@ -66,7 +66,7 @@ } else { - @Html.DisplayFor(modelItem => item.SolvedTime) + @Html.Raw(Model.LocalTime(item.SolvedTime)) X } diff --git a/ServerCore/Pages/Submissions/AuthorIndex.cshtml b/ServerCore/Pages/Submissions/AuthorIndex.cshtml index 4be0484e..b5209868 100644 --- a/ServerCore/Pages/Submissions/AuthorIndex.cshtml +++ b/ServerCore/Pages/Submissions/AuthorIndex.cshtml @@ -88,7 +88,7 @@ @Html.DisplayFor(modelItem => item.SubmissionText) - @Html.DisplayFor(modelItem => item.TimeSubmitted) + @Html.Raw(Model.LocalTime(item.TimeSubmitted)) } diff --git a/ServerCore/Pages/Submissions/Index.cshtml b/ServerCore/Pages/Submissions/Index.cshtml index 73bd6ac0..8a64a44b 100644 --- a/ServerCore/Pages/Submissions/Index.cshtml +++ b/ServerCore/Pages/Submissions/Index.cshtml @@ -96,7 +96,7 @@ { - @Html.DisplayFor(modelItem => item.TimeSubmitted) + @Html.Raw(Model.LocalTime(item.TimeSubmitted)) @Html.DisplayFor(modelItem => item.Submitter.Name) diff --git a/ServerCore/Pages/Teams/Answers.cshtml b/ServerCore/Pages/Teams/Answers.cshtml index 25b88c9b..e7692d64 100644 --- a/ServerCore/Pages/Teams/Answers.cshtml +++ b/ServerCore/Pages/Teams/Answers.cshtml @@ -43,7 +43,7 @@ { - @item.TimeSubmitted + @Html.Raw(Model.LocalTime(item.TimeSubmitted)) @item.Group diff --git a/ServerCore/Pages/Teams/Play.cshtml b/ServerCore/Pages/Teams/Play.cshtml index ccd88169..d810ef3b 100644 --- a/ServerCore/Pages/Teams/Play.cshtml +++ b/ServerCore/Pages/Teams/Play.cshtml @@ -78,7 +78,7 @@ @if (item.State.SolvedTime != null) { - Solved at @item.State.SolvedTime + Solved on @Html.Raw(Model.LocalTime(item.State.SolvedTime)) } else if (@Model.Event.IsAnswerSubmissionActive) { diff --git a/ServerCore/Pages/Teams/Status.cshtml b/ServerCore/Pages/Teams/Status.cshtml index 457a896c..0cc28ff8 100644 --- a/ServerCore/Pages/Teams/Status.cshtml +++ b/ServerCore/Pages/Teams/Status.cshtml @@ -54,7 +54,7 @@ } else { - @Html.DisplayFor(modelItem => item.UnlockedTime) + @Html.Raw(Model.LocalTime(item.UnlockedTime)) X } @@ -65,7 +65,7 @@ } else { - @Html.DisplayFor(modelItem => item.SolvedTime) + @Html.Raw(Model.LocalTime(item.SolvedTime)) X } diff --git a/ServerCore/wwwroot/js/site.js b/ServerCore/wwwroot/js/site.js index 82ecce7b..c0eab246 100644 --- a/ServerCore/wwwroot/js/site.js +++ b/ServerCore/wwwroot/js/site.js @@ -1 +1,6 @@ // Write your Javascript code. +$("time").each(function (elem) { + var utctimeval = $(this).html(); + var date = new Date(utctimeval); + $(this).html(date.toLocaleString()); +}); \ No newline at end of file