generated from egmont11/ASP.Net-Core-MVC-Template
Odstranění zbytečných stránek, přidání administrace pro pozvánky.
This commit is contained in:
@@ -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">← 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 });
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[AllowAnonymous]
|
||||
public IActionResult Register(string? returnUrl)
|
||||
{
|
||||
if (User.Identity?.IsAuthenticated == true)
|
||||
return RedirectToAction("Index", "Home");
|
||||
|
||||
return View(new AuthRegisterViewModel { ReturnUrl = returnUrl });
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
public IActionResult AccessDenied() => View();
|
||||
|
||||
@@ -100,36 +90,6 @@ public class AuthController : Controller
|
||||
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]
|
||||
[Authorize]
|
||||
[ValidateAntiForgeryToken]
|
||||
|
||||
@@ -11,11 +11,6 @@ public class HomeController : Controller
|
||||
return View();
|
||||
}
|
||||
|
||||
public IActionResult Privacy()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
public IActionResult Error()
|
||||
{
|
||||
|
||||
@@ -10,4 +10,6 @@ public class AppDbContext : IdentityDbContext<UserEntity>
|
||||
: 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>
|
||||
<html lang="en">
|
||||
<html lang="cs">
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<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>
|
||||
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css"/>
|
||||
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true"/>
|
||||
@@ -13,20 +13,12 @@
|
||||
<header>
|
||||
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||
<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"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<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">
|
||||
@if (User.Identity?.IsAuthenticated == true)
|
||||
{
|
||||
@@ -50,15 +42,6 @@
|
||||
</ul>
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -69,12 +52,6 @@
|
||||
@RenderBody()
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<footer class="border-top footer text-muted">
|
||||
<div class="container">
|
||||
© 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/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="~/js/site.js" asp-append-version="true"></script>
|
||||
|
||||
Reference in New Issue
Block a user