Odstranění zbytečných stránek, přidání administrace pro pozvánky.

This commit is contained in:
Matěj Kubíček
2026-09-17 17:06:27 +02:00
parent 2040a16879
commit 3a35d10227
11 changed files with 136 additions and 121 deletions
@@ -0,0 +1,34 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using StuzkovakWeb.Data;
using StuzkovakWeb.ViewModels;
namespace StuzkovakWeb.Areas.Admin.Controllers;
public class InvitesController : AdminBaseController
{
private readonly AppDbContext _context;
public InvitesController(AppDbContext context)
{
_context = context;
}
public async Task<IActionResult> Index()
{
var invites = await _context.Invites.ToListAsync();
return View(invites);
}
public async Task<IActionResult> Details(Guid id)
{
var invite = await _context.Invites.FirstOrDefaultAsync(i => i.Id == id);
if (invite == null) return NotFound();
return View(new AdminInviteDetailViewModel
{
Id = invite.Id,
TeacherName = invite.TeacherName,
IsAccepted = invite.IsAccepted
});
}
}
@@ -0,0 +1,40 @@
@model StuzkovakWeb.ViewModels.AdminInviteDetailViewModel
@{
ViewData["Title"] = "Detail pozvánky";
}
<div class="mb-4">
<a asp-action="Index" class="btn btn-secondary">&larr; Zpět na seznam pozvánek</a>
</div>
@if (TempData["SuccessMessage"] != null)
{
<div class="alert alert-success">@TempData["SuccessMessage"]</div>
}
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h3 class="card-title mb-0">Pozvánka pro učitele: @Model.TeacherName</h3>
</div>
<div class="card-body">
<dl class="row">
<dt class="col-sm-3">ID</dt>
<dd class="col-sm-9">@Model.Id</dd>
<dt class="col-sm-3">Učitel</dt>
<dd class="col-sm-9">@Model.TeacherName</dd>
<dt class="col-sm-3">Přijetí</dt>
<dd class="col-sm-9">@{
if (Model.IsAccepted == true)
{
<span class="badge bg-success">Ano</span>
}
else if (Model.IsAccepted == false)
{
<span class="badge bg-danger">Ne</span>
}
}</dd>
</dl>
</div>
</div>
@@ -0,0 +1,41 @@
@model List<StuzkovakWeb.Entities.InviteEntity>
@{
ViewData["Title"] = "Invite Management";
}
<div class="d-flex justify-content-between align-items-center mb-4">
<h1>Pozvánky</h1>
</div>
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th>ID</th>
<th>Učitel</th>
<th>Potvrzení</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach (var invite in Model)
{
<tr>
<td>@invite.Id</td>
<td>@invite.TeacherName</td>
<td>@{
if (invite.IsAccepted == true)
{
<span class="badge bg-success">Ano</span>
}
else if (invite.IsAccepted == false)
{
<span class="badge bg-danger">Ne</span>
}
}</td>
<td>
<a asp-action="Details" asp-route-id="@invite.Id" class="btn btn-sm btn-outline-primary">Details</a>
</td>
</tr>
}
</tbody>
</table>
@@ -36,16 +36,6 @@ public class AuthController : Controller
return View(new AuthLoginViewModel { ReturnUrl = returnUrl }); return View(new AuthLoginViewModel { ReturnUrl = returnUrl });
} }
[HttpGet]
[AllowAnonymous]
public IActionResult Register(string? returnUrl)
{
if (User.Identity?.IsAuthenticated == true)
return RedirectToAction("Index", "Home");
return View(new AuthRegisterViewModel { ReturnUrl = returnUrl });
}
[HttpGet] [HttpGet]
public IActionResult AccessDenied() => View(); public IActionResult AccessDenied() => View();
@@ -100,36 +90,6 @@ public class AuthController : Controller
return RedirectToAction("Index", "Home"); return RedirectToAction("Index", "Home");
} }
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register(AuthRegisterViewModel model)
{
if (!ModelState.IsValid) return View(model);
var user = new UserEntity
{
UserName = model.UserName.Trim(),
Email = model.Email.Trim().ToLower(),
};
var result = await _userManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
foreach (var error in result.Errors)
ModelState.AddModelError(string.Empty, error.Description);
return View(model);
}
await _userManager.AddToRoleAsync(user, "User");
_logger.LogInformation("User {UserName} registered.", user.UserName);
if (!string.IsNullOrEmpty(model.ReturnUrl) && Url.IsLocalUrl(model.ReturnUrl))
return Redirect(model.ReturnUrl);
return RedirectToAction("Login");
}
[HttpPost] [HttpPost]
[Authorize] [Authorize]
[ValidateAntiForgeryToken] [ValidateAntiForgeryToken]
@@ -11,11 +11,6 @@ public class HomeController : Controller
return View(); return View();
} }
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error() public IActionResult Error()
{ {
@@ -10,4 +10,6 @@ public class AppDbContext : IdentityDbContext<UserEntity>
: base(options) : base(options)
{ {
} }
public DbSet<InviteEntity> Invites { get; set; }
} }
@@ -0,0 +1,8 @@
namespace StuzkovakWeb.Entities;
public class InviteEntity
{
public Guid Id { get; set; } = Guid.NewGuid();
public required string TeacherName { get; set; }
public bool? IsAccepted { get; set; } = null;
}
@@ -0,0 +1,8 @@
namespace StuzkovakWeb.ViewModels;
public class AdminInviteDetailViewModel
{
public Guid Id { get; set; }
public string TeacherName { get; set; }
public bool? IsAccepted { get; set; }
}
@@ -1,50 +0,0 @@
@model AuthRegisterViewModel
<div class="row justify-content-center mt-5">
<div class="col-md-4">
<div class="card shadow-sm">
<div class="card-body p-4">
<h1 class="card-title text-center mb-4">Register</h1>
<form asp-action="Register">
@Html.AntiForgeryToken()
<div asp-validation-summary="ModelOnly" class="alert alert-danger" role="alert"></div>
<div class="mb-3">
<label asp-for="UserName" class="form-label"></label>
<input asp-for="UserName" class="form-control" placeholder="Username"/>
<span asp-validation-for="UserName" class="text-danger small"></span>
</div>
<div class="mb-3">
<label asp-for="Email" class="form-label"></label>
<input asp-for="Email" class="form-control" placeholder="Email"/>
<span asp-validation-for="Email" class="text-danger small"></span>
</div>
<div class="mb-3">
<label asp-for="Password" class="form-label"></label>
<input asp-for="Password" class="form-control" placeholder="Password"/>
<span asp-validation-for="Password" class="text-danger small"></span>
</div>
<div class="mb-3">
<label asp-for="ConfirmPassword" class="form-label"></label>
<input asp-for="ConfirmPassword" class="form-control" placeholder="Confirm Password"/>
<span asp-validation-for="ConfirmPassword" class="text-danger small"></span>
</div>
<input asp-for="ReturnUrl" type="hidden"/>
<div class="d-grid">
<input type="submit" value="Register" class="btn btn-primary"/>
</div>
</form>
</div>
</div>
</div>
</div>
@section Scripts {
@{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); }
}
@@ -1,9 +1,9 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="cs">
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>@ViewData["Title"] - StuzkovakWeb</title> <title>@ViewData["Title"] Stužkovák 4.EP</title>
<script type="importmap"></script> <script type="importmap"></script>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css"/> <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css"/>
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/> <link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>
@@ -13,20 +13,12 @@
<header> <header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3"> <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container-fluid"> <div class="container-fluid">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">StuzkovakWeb</a> <a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">Stužkovák 4.EP</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent" <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation"> aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between"> <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</li>
</ul>
<ul class="navbar-nav"> <ul class="navbar-nav">
@if (User.Identity?.IsAuthenticated == true) @if (User.Identity?.IsAuthenticated == true)
{ {
@@ -50,15 +42,6 @@
</ul> </ul>
</li> </li>
} }
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Auth" asp-action="Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Auth" asp-action="Login">Login</a>
</li>
}
</ul> </ul>
</div> </div>
</div> </div>
@@ -69,12 +52,6 @@
@RenderBody() @RenderBody()
</main> </main>
</div> </div>
<footer class="border-top footer text-muted">
<div class="container">
&copy; 2026 - StuzkovakWeb - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script> <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script> <script src="~/js/site.js" asp-append-version="true"></script>