diff --git a/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml
new file mode 100644
index 00000000..a965d891
--- /dev/null
+++ b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml
@@ -0,0 +1,54 @@
+@page "/{eventId}/{eventRole}/Events/AddAdminOrAuthor"
+@model ServerCore.Pages.Events.AddAdminOrAuthorModel
+
+@{
+ ViewData["Title"] = "Add admin or author";
+ ViewData["AdminRoute"] = "/Events/Players";
+ var roleString = Model.addAdmin ? "admin" : "author";
+}
+
+
Add @roleString
+
+
+
+Select a user to make an @roleString
+
+
+
+
+
+ @Html.DisplayNameFor(model => model.Users[0].Name)
+ |
+
+ @Html.DisplayNameFor(model => model.Users[0].Email)
+ |
+
+ |
+
+
+
+ @foreach (var item in Model.Users)
+ {
+
+
+ @Html.DisplayFor(modelItem => item.Name)
+ |
+
+ @Html.DisplayFor(modelItem => item.Email)
+ |
+
+ @if (Model.addAdmin)
+ {
+ Add
+ }
+ else
+ {
+ Add
+ }
+ |
+
+ }
+
+
\ No newline at end of file
diff --git a/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml.cs b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml.cs
new file mode 100644
index 00000000..ae0bc6c8
--- /dev/null
+++ b/ServerCore/Pages/Events/AddAdminOrAuthor.cshtml.cs
@@ -0,0 +1,108 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Identity;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.AspNetCore.Mvc.Rendering;
+using Microsoft.EntityFrameworkCore;
+using ServerCore.DataModel;
+using ServerCore.ModelBases;
+
+namespace ServerCore.Pages.Events
+{
+ [Authorize("IsEventAdmin")]
+ public class AddAdminOrAuthorModel : EventSpecificPageModel
+ {
+ public IList Users { get; set; }
+
+ public bool addAdmin { get; set; }
+
+ public AddAdminOrAuthorModel(PuzzleServerContext serverContext, UserManager userManager) : base(serverContext, userManager)
+ {
+ }
+
+ public async Task OnGetAsync(bool addAdmin)
+ {
+ this.addAdmin = addAdmin;
+
+ if (addAdmin)
+ {
+ Users = await (from user in _context.PuzzleUsers
+ where !((from eventAdmin in _context.EventAdmins
+ where eventAdmin.Event == Event
+ where eventAdmin.Admin == user
+ select eventAdmin).Any())
+ select user).ToListAsync();
+ }
+ else
+ {
+ Users = await (from user in _context.PuzzleUsers
+ where !((from eventAuthor in _context.EventAuthors
+ where eventAuthor.Event == Event
+ where eventAuthor.Author == user
+ select eventAuthor).Any())
+ select user).ToListAsync();
+ }
+
+ return Page();
+ }
+
+ public async Task OnGetAddAdminAsync(int userId)
+ {
+ // Check that the user isn't already an admin
+ if (await (from admin in _context.EventAdmins
+ where admin.Admin.ID == userId &&
+ admin.Event == Event
+ select admin).AnyAsync())
+ {
+ return NotFound("User is already an admin in this event.");
+ }
+
+ EventAdmins Admin = new EventAdmins();
+
+ PuzzleUser user = await _context.PuzzleUsers.FirstOrDefaultAsync(m => m.ID == userId);
+ if (user == null)
+ {
+ return NotFound("Could not find user with ID '" + userId + "'. Check to make sure the user hasn't been removed.");
+ }
+ Admin.Admin = user;
+
+ Admin.Event = Event;
+
+ _context.EventAdmins.Add(Admin);
+ await _context.SaveChangesAsync();
+ return RedirectToPage("/Events/Players");
+ }
+
+ public async Task OnGetAddAuthorAsync(int userId)
+ {
+ // Check that the user isn't already an author
+ if (await (from author in _context.EventAuthors
+ where author.Author.ID == userId &&
+ author.Event == Event
+ select author).AnyAsync())
+ {
+ return NotFound("User is already an author in this event.");
+ }
+
+ EventAuthors Author = new EventAuthors();
+
+ PuzzleUser user = await _context.PuzzleUsers.FirstOrDefaultAsync(m => m.ID == userId);
+ if (user == null)
+ {
+ return NotFound("Could not find user with ID '" + userId + "'. Check to make sure the user hasn't been removed.");
+ }
+ Author.Author = user;
+
+ Author.Event = Event;
+
+ _context.EventAuthors.Add(Author);
+ await _context.SaveChangesAsync();
+ return RedirectToPage("/Events/Players");
+ }
+ }
+}
\ No newline at end of file
diff --git a/ServerCore/Pages/Events/Players.cshtml b/ServerCore/Pages/Events/Players.cshtml
index 6d2d9f8a..24f113c6 100644
--- a/ServerCore/Pages/Events/Players.cshtml
+++ b/ServerCore/Pages/Events/Players.cshtml
@@ -1,42 +1,136 @@
@page "/{eventId}/{eventRole}/Events/Players"
@model ServerCore.Pages.Events.PlayersModel
@{
- ViewData["Title"] = "Players";
+ ViewData["Title"] = "Users";
ViewData["AdminRoute"] = "/Events/Players";
ViewData["AuthorRoute"] = "/EventSpecific/Index";
ViewData["PlayRoute"] = "/EventSpecific/Index";
}
-Players
+Users
+
+Admins
+Add admin
+
+
+
+
+
+ @Html.DisplayNameFor(model => model.Admins[0].Name)
+ |
+
+ @Html.DisplayNameFor(model => model.Admins[0].Email)
+ |
+
+ @Html.DisplayNameFor(model => model.Admins[0].EmployeeAlias)
+ |
+
+ |
+ |
+
+
+
+ @foreach (var item in Model.Admins)
+ {
+
+
+ @Html.DisplayFor(modelItem => item.Name)
+ |
+
+ @Html.DisplayFor(modelItem => item.Email)
+ |
+
+ @Html.DisplayFor(modelItem => item.EmployeeAlias)
+ |
+
+ Remove
+ |
+ |
+
+ }
+
+
+
+All admin e-mails
+
+@Model.AdminEmails
+
+Authors
+Add author
- Player @Html.DisplayNameFor(model => model.Players[0].Member.ID)
+ @Html.DisplayNameFor(model => model.Authors[0].Item1.Name)
|
- Player @Html.DisplayNameFor(model => model.Players[0].Member.Name)
+ @Html.DisplayNameFor(model => model.Authors[0].Item1.Email)
|
- Player @Html.DisplayNameFor(model => model.Players[0].Member.Email)
+ @Html.DisplayNameFor(model => model.Authors[0].Item1.EmployeeAlias)
|
- Team @Html.DisplayNameFor(model => model.Players[0].Team.ID)
+ Puzzle count
|
- Team @Html.DisplayNameFor(model => model.Players[0].Team.Name)
|
|
- @foreach (var item in Model.Players)
+ @foreach (var item in Model.Authors)
{
- @Html.DisplayFor(modelItem => item.Member.ID)
+ @Html.DisplayFor(modelItem => item.Item1.Name)
|
+
+ @Html.DisplayFor(modelItem => item.Item1.Email)
+ |
+
+ @Html.DisplayFor(modelItem => item.Item1.EmployeeAlias)
+ |
+
+ @Html.DisplayFor(modelItem => item.Item2)
+ |
+
+ Remove
+ |
+ |
+
+ }
+
+
+
+All author e-mails
+
+@Model.AuthorEmails
+
+Players
+
+
+
+
+
+ @Html.DisplayNameFor(model => model.Players[0].Member.Name)
+ |
+
+ @Html.DisplayNameFor(model => model.Players[0].Member.Email)
+ |
+
+ @Html.DisplayNameFor(model => model.Players[0].Member.EmployeeAlias)
+ |
+
+ @Html.DisplayNameFor(model => model.Players[0].Team.Name)
+ |
+ |
+
+
+
+ @foreach (var item in Model.Players)
+ {
+
@Html.DisplayFor(modelItem => item.Member.Name)
|
@@ -44,10 +138,10 @@
@Html.DisplayFor(modelItem => item.Member.Email)
- @Html.DisplayFor(modelItem => item.Team.ID)
+ @Html.DisplayFor(modelItem => item.Member.EmployeeAlias)
|
- @Html.DisplayFor(modelItem => item.Team.Name)
+ @Html.DisplayFor(modelItem => item.Team.Name)
|
|
@@ -55,10 +149,6 @@
-All player e-mails
-
-@Model.Emails
+All player e-mails
-
\ No newline at end of file
+@Model.PlayerEmails
\ No newline at end of file
diff --git a/ServerCore/Pages/Events/Players.cshtml.cs b/ServerCore/Pages/Events/Players.cshtml.cs
index 5ee72a39..86c766b1 100644
--- a/ServerCore/Pages/Events/Players.cshtml.cs
+++ b/ServerCore/Pages/Events/Players.cshtml.cs
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -12,28 +13,101 @@ namespace ServerCore.Pages.Events
{
public class PlayersModel : EventSpecificPageModel
{
+ public IList Admins { get; set; }
+
+ public string AdminEmails { get; set; }
+
+ public IList> Authors { get; set; }
+
+ public string AuthorEmails { get; set; }
+
public IList Players { get; set; }
- public string Emails { get; set; }
+ public string PlayerEmails { get; set; }
public PlayersModel(PuzzleServerContext serverContext, UserManager userManager) : base(serverContext, userManager)
{
}
- public async Task OnGetAsync(int teamId)
+ public async Task OnGetAsync()
{
+ // Get admins
+
+ Admins = await _context.EventAdmins
+ .Where(admin => admin.Event == Event).Select(admin => admin.Admin)
+ .ToListAsync();
+
+ StringBuilder adminEmailList = new StringBuilder("");
+ foreach (PuzzleUser admin in Admins)
+ {
+ adminEmailList.Append(admin.Email + "; ");
+ }
+ AdminEmails = adminEmailList.ToString();
+
+ // Get authors
+
+ IList allAuthors = await (from author in _context.EventAuthors
+ where author.Event == Event
+ select author.Author).ToListAsync();
+
+ Dictionary allPuzzles = await (from puzzleAuthor in _context.PuzzleAuthors
+ where puzzleAuthor.Puzzle.Event == Event
+ group puzzleAuthor by puzzleAuthor.Author.ID into puzzleGroup
+ select new { authorId = puzzleGroup.Key, count = puzzleGroup.Count() })
+ .ToDictionaryAsync(x => x.authorId, x => x.count);
+
+ StringBuilder authorEmailList = new StringBuilder("");
+ Authors = new List>();
+ foreach (PuzzleUser author in allAuthors)
+ {
+ authorEmailList.Append(author.Email + "; ");
+ int puzzleCount = allPuzzles.ContainsKey(author.ID) ? allPuzzles[author.ID] : 0;
+ Authors.Add(new Tuple(author, puzzleCount));
+ }
+ AuthorEmails = authorEmailList.ToString();
+
+ // Get players
+
Players = await _context.TeamMembers
.Where(member => member.Team.Event == Event)
.ToListAsync();
- StringBuilder emailList = new StringBuilder("");
+ StringBuilder playerEmailList = new StringBuilder("");
foreach (TeamMembers Player in Players)
{
- emailList.Append(Player.Member.Email + "; ");
+ playerEmailList.Append(Player.Member.Email + "; ");
}
- Emails = emailList.ToString();
+ PlayerEmails = playerEmailList.ToString();
+
+ // Return page
return Page();
}
+
+ public async Task OnGetRemoveAdminAsync(int userId)
+ {
+ EventAdmins Admin = await _context.EventAdmins.FirstOrDefaultAsync(admin => admin.Admin.ID == userId && admin.Event == Event);
+ if (Admin == null)
+ {
+ return NotFound("Could not find event admin with ID '" + userId + "'. They may have already been removed from the admin role.");
+ }
+
+ _context.EventAdmins.Remove(Admin);
+ await _context.SaveChangesAsync();
+ return RedirectToPage("/Events/Players");
+ }
+
+ public async Task OnGetRemoveAuthorAsync(int userId)
+ {
+ EventAuthors Author = await _context.EventAuthors.FirstOrDefaultAsync(author => author.Author.ID == userId && author.Event == Event);
+ if (Author == null)
+ {
+ return NotFound("Could not find event author with ID '" + userId + "'. They may have already been removed from the author role.");
+ }
+
+ _context.EventAuthors.Remove(Author);
+ await _context.SaveChangesAsync();
+ return RedirectToPage("/Events/Players");
+ }
}
}
\ No newline at end of file
diff --git a/ServerCore/Pages/Teams/AddMember.cshtml.cs b/ServerCore/Pages/Teams/AddMember.cshtml.cs
index f239aad0..8d0cadd2 100644
--- a/ServerCore/Pages/Teams/AddMember.cshtml.cs
+++ b/ServerCore/Pages/Teams/AddMember.cshtml.cs
@@ -53,6 +53,7 @@ public async Task OnGetAsync(int teamId)
Users = await (from user in _context.PuzzleUsers
where !((from teamMember in _context.TeamMembers
where teamMember.Team.Event == Event
+ where teamMember.Member == user
select teamMember).Any())
select new Tuple(user, -1)).ToListAsync();
}
@@ -60,9 +61,6 @@ public async Task OnGetAsync(int teamId)
return Page();
}
- [BindProperty]
- public TeamMembers Member { get; set; }
-
public async Task OnGetAddMemberAsync(int teamId, int userId, int applicationId)
{
if (applicationId == -1)
diff --git a/ServerCore/ServerCore.csproj b/ServerCore/ServerCore.csproj
index 0a669c79..6d9ed873 100644
--- a/ServerCore/ServerCore.csproj
+++ b/ServerCore/ServerCore.csproj
@@ -50,6 +50,9 @@
$(IncludeRazorContentInPack)
+
+ $(IncludeRazorContentInPack)
+
$(IncludeRazorContentInPack)