diff --git a/ServerCore/Pages/Submissions/Index.cshtml b/ServerCore/Pages/Submissions/Index.cshtml index fb8e2518..de052d45 100644 --- a/ServerCore/Pages/Submissions/Index.cshtml +++ b/ServerCore/Pages/Submissions/Index.cshtml @@ -92,20 +92,20 @@ - @foreach (var item in Model.Submissions) + @for (int i = Model.Submissions.Count-1; i >= 0; --i) { - @Html.Raw(Model.LocalTime(item.TimeSubmitted)) + @Html.Raw(Model.LocalTime(Model.Submissions[i].TimeSubmitted)) - @Html.DisplayFor(modelItem => item.Submitter.Name) + @Html.DisplayFor(modelItem => Model.Submissions[i].Submitter.Name) - @Html.DisplayFor(modelItem => item.SubmissionText) + @Html.DisplayFor(modelItem => Model.Submissions[i].SubmissionText) - @(item.Response != null ? item.Response.ResponseText : "Incorrect") + @(Model.Submissions[i].Response != null ? Model.Submissions[i].Response.ResponseText : "Incorrect") } diff --git a/ServerCore/Pages/Teams/Play.cshtml b/ServerCore/Pages/Teams/Play.cshtml index 393ffb9b..70c9abaf 100644 --- a/ServerCore/Pages/Teams/Play.cshtml +++ b/ServerCore/Pages/Teams/Play.cshtml @@ -6,22 +6,47 @@ ViewData["AdminRoute"] = "/Puzzles/Index"; ViewData["AuthorRoute"] = "/Puzzles/Index"; // Needs route data - ViewData["PlayRoute"] = "/Teams/Play"; + + Boolean unsolvedFilter = Model.StateFilter == PlayModel.PuzzleStateFilter.Unsolved; } +

Puzzles

View All Correct Answers
+
+
+ + All + + + Unsolved + +
+
@@ -32,7 +57,7 @@ } @@ -41,73 +66,74 @@ @if (Model.AllowFeedback) { - + } -@foreach (var item in Model.PuzzleViews) { - - - - @if (Model.ShowAnswers) - { + @foreach (var item in Model.PuzzleViews) + { + + - } - - - @if (Model.AllowFeedback) - { - - } - - } + + @if (Model.ShowAnswers) + { + + } + + + @if (Model.AllowFeedback) + { + + } + + }
- + @Html.DisplayNameFor(model => model.PuzzleViews[0].Group) - + Puzzle - + Solve - Feedback - + Feedback +
- @Html.DisplayFor(modelItem => item.Group) - - @if (!string.IsNullOrWhiteSpace(item.Errata)) - { - - } - - @if (item.CustomUrl != null) - { - @item.Name - } - else if (item.Content != null) - { - @Html.ActionLink(item.Name, "Index", "Files", new { eventId = Model.Event.ID, filename = item.Content.ShortName }, new { target = "_blank" }) - } - else - { - @Html.DisplayFor(modelItem => item.Name) - } -
- @if (item.Answer != null) + @Html.DisplayFor(modelItem => item.Group) + + @if (!string.IsNullOrWhiteSpace(item.Errata)) { - @Html.ActionLink("View answer", "Index", "Files", new { eventId = Model.Event.ID, filename = item.Answer.ShortName }, new { target = "_blank" }) + } - - - @if (item.SolvedTime != null) + + @if (item.CustomUrl != null) { - Solved on @Html.Raw(Model.LocalTime(item.SolvedTime)) + @item.Name } - else if (@Model.Event.IsAnswerSubmissionActive) + else if (item.Content != null) { - Submit Answer + @Html.ActionLink(item.Name, "Index", "Files", new { eventId = Model.Event.ID, filename = item.Content.ShortName }, new { target = "_blank" }) } else { - See past submissions + @Html.DisplayFor(modelItem => item.Name) } - - - Hints - - Submit feedback -
+ @if (item.Answer != null) + { + @Html.ActionLink("View answer", "Index", "Files", new { eventId = Model.Event.ID, filename = item.Answer.ShortName }, new { target = "_blank" }) + } + + + @if (item.SolvedTime != null) + { + Solved on @Html.Raw(Model.LocalTime(item.SolvedTime)) + } + else if (@Model.Event.IsAnswerSubmissionActive) + { + Submit Answer + } + else + { + See past submissions + } + + + Hints + + Submit feedback +
diff --git a/ServerCore/Pages/Teams/Play.cshtml.cs b/ServerCore/Pages/Teams/Play.cshtml.cs index 8d96ac44..fa308502 100644 --- a/ServerCore/Pages/Teams/Play.cshtml.cs +++ b/ServerCore/Pages/Teams/Play.cshtml.cs @@ -25,6 +25,8 @@ public PlayModel(PuzzleServerContext serverContext, UserManager us public IList PuzzleViews { get; set; } + public PuzzleStateFilter? StateFilter { get; set; } + public int TeamID { get; set; } public SortOrder? Sort { get; set; } @@ -35,7 +37,7 @@ public PlayModel(PuzzleServerContext serverContext, UserManager us public bool AllowFeedback { get; set; } - public async Task OnGetAsync(SortOrder? sort, int teamId) + public async Task OnGetAsync(SortOrder? sort, int teamId, PuzzleStateFilter? stateFilter) { TeamID = teamId; Team myTeam = await UserEventHelper.GetTeamForPlayer(_context, Event, LoggedInUser); @@ -49,6 +51,7 @@ public async Task OnGetAsync(SortOrder? sort, int teamId) throw new Exception("Not currently registered for a team"); } this.Sort = sort; + this.StateFilter = stateFilter; ShowAnswers = Event.AnswersAvailableBegin <= DateTime.UtcNow; AllowFeedback = Event.AllowFeedback; @@ -97,13 +100,18 @@ join PuzzleStatePerTeam pspt in stateForTeamQ on puzzle.ID equals pspt.PuzzleID throw new ArgumentException($"unknown sort: {sort}"); } + if (this.StateFilter == PuzzleStateFilter.Unsolved) + { + visiblePuzzlesQ = visiblePuzzlesQ.Where(puzzles => puzzles.SolvedTime == null); + } + PuzzleViews = await visiblePuzzlesQ.ToListAsync(); Dictionary files = await (from file in _context.ContentFiles where file.Event == Event && file.FileType == ContentFileType.Puzzle select file).ToDictionaryAsync(file => file.PuzzleID); - foreach(var puzzleView in PuzzleViews) + foreach (var puzzleView in PuzzleViews) { files.TryGetValue(puzzleView.ID, out ContentFile content); puzzleView.Content = content; @@ -112,8 +120,8 @@ join PuzzleStatePerTeam pspt in stateForTeamQ on puzzle.ID equals pspt.PuzzleID if (ShowAnswers) { Dictionary answers = await (from file in _context.ContentFiles - where file.Event == Event && file.FileType == ContentFileType.Answer - select file).ToDictionaryAsync(file => file.PuzzleID); + where file.Event == Event && file.FileType == ContentFileType.Answer + select file).ToDictionaryAsync(file => file.PuzzleID); foreach (var puzzleView in PuzzleViews) { @@ -162,5 +170,11 @@ public enum SortOrder SolveAscending, SolveDescending } + + public enum PuzzleStateFilter + { + All, + Unsolved + } } }