Startpunkten

This commit is contained in:
2026-03-05 15:43:26 +01:00
commit dd99fb7b01
95 changed files with 3262 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
@model Admin
@{
ViewData["Title"] = "Lägg till administratör";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container">
<form action="/Login/CreateAdmin" method="post">
<div class="form-group">
<label asp-for="@Model.Username" class="control-label"></label>
<input type="text" class="form-control" asp-for="Username" tabindex="1" placeholder="Username">
<span asp-validation-for="Username" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Password" class="control-label"></label>
<input type="password" class="form-control" asp-for="Password" tabindex="2" placeholder="Password">
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Skapa admin</button>
</form>
<p>@ViewBag.error</p>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,30 @@
@model Admin
@{
ViewData["Title"] = "Editera administratör";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container">
<form action="/Login/EditAdmin" method="post">
<input type="hidden" asp-for="AdminId" value="@Model.AdminId" />
<div class="form-group">
<label asp-for="Username" class="control-label"></label>
<input type="text" class="form-control" asp-for="Username" tabindex="1">
<span asp-validation-for="Username" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Password" class="control-label"></label>
<input type="password" class="form-control" asp-for="Password" tabindex="2">
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary mb-5">Editera admin</button>
</form>
<p>@ViewBag.error</p>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

29
Views/Login/Index.cshtml Normal file
View File

@@ -0,0 +1,29 @@
@model Admin
@{
ViewData["Title"] = "Logga in";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container mb-5">
<div class="myLoginForm card p-4">
<form action="~/Login/CheckLogin" method="post">
<div class="form-group">
<label asp-for="@Model.Username" class="control-label"></label>
<input type="text" class="form-control" asp-for="Username" tabindex="1" placeholder="Username">
<span asp-validation-for="Username" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Password" class="control-label"></label>
<input type="password" class="form-control" asp-for="Password" tabindex="2" placeholder="Password">
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Logga in</button>
</form>
<p class="text-danger mt-3">@TempData["msg"]</p>
<p class="text-primary mt-3" ">@TempData["hint"]</p>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,55 @@
@model List<Admin>
@{
ViewData["Title"] = "Här finns alla administratörer";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<p class="lead text-center">Det är bra om alla i receptionen är registrerade som administratör.</p>
@if (TempData.ContainsKey("Meddelande")) {
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Skapades inte!</strong> @TempData["Meddelande"]
</div>
}
else @if (TempData.ContainsKey("TooFewAdmins")) {
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Togs inte bort!</strong> @TempData["TooFewAdmins"]
</div>
}
<a asp-action="CreateAdmin" asp-controller="Login" class="btn btn-success mb-3">Skapa ny administratör</a>
<div class="container mb-5">
@if (Model.Count() >= 1) {
<table class="table">
<thead>
<tr>
<th>Administratör</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var admin in Model) {
<tr>
<td>@admin.Username</td>
<td>
<a asp-action="DeleteAdmin" asp-controller="Login" asp-route-Id="@admin.AdminId">Ta bort</a> |
<a asp-action="EditAdmin" asp-controller="Login" asp-route-Id="@admin.AdminId">Editera</a>
</td>
</tr>
}
</tbody>
</table>
}
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,38 @@
@model Person
@{
ViewData["Title"] = "Lägg till ny medlem";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container mb-5">
<form action="Create" method="post" enctype="multipart/form-data">
<div class="form-group">
<label asp-for="@Model.PersonNamn" class="control-label"></label>
<input type="text" class="form-control" asp-for="PersonNamn" tabindex="1" placeholder="Ditt namn">
<span asp-validation-for="PersonNamn" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Epost" class="control-label"></label>
<input type="text" class="form-control" asp-for="Epost" tabindex="2" placeholder="ditt.namn@adress.com">
<span asp-validation-for="Epost" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Alder" class="control-label"></label>
<input type="number" class="form-control" asp-for="Alder" tabindex="3" placeholder="Ange din ålder">
<span asp-validation-for="Alder" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Visningsbild" class="control-label"></label>
<input type="file" class="form-control" asp-for="Visningsbild" tabindex="4">
<span asp-validation-for="Visningsbild" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary mt-3">@ViewData["Title"]</button>
</form>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

36
Views/Person/Edit.cshtml Normal file
View File

@@ -0,0 +1,36 @@
@model Person
@{
ViewData["Title"] = "Editera en person";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container">
<form action="Edit" method="post" enctype="multipart/form-data">
<input type="hidden" asp-for="PersonId" value="@Model.PersonId" />
<div class="form-group">
<label>Namn</label>
<input type="text" class="form-control" asp-for="PersonNamn" tabindex="1">
<span asp-validation-for="PersonNamn" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Epost" class="control-label"></label>
<input type="text" class="form-control" asp-for="Epost" tabindex="2" placeholder="ditt.namn@adress.com">
<span asp-validation-for="Epost" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Alder" class="control-label"></label>
<input type="number" class="form-control" asp-for="Alder" tabindex="3" placeholder="Ange din ålder">
<span asp-validation-for="Alder" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Visningsbild" class="control-label"></label>
<input type="file" class="form-control" asp-for="Visningsbild" tabindex="4">
<span asp-validation-for="Visningsbild" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Spara ändringar</button>
</form>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

77
Views/Person/Index.cshtml Normal file
View File

@@ -0,0 +1,77 @@
@model List<Person>
@{
ViewData["Title"] = "Mina medlemmar";
}
@if (TempData.ContainsKey("MeddelandeSuccess")) {
<div class="alert alert-success alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Allt klart!</strong> @TempData["MeddelandeSuccess"]
</div>
}
else if (TempData.ContainsKey("MeddelandeFail")) {
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Något gick fel.</strong> @TempData["MeddelandeFail"]
</div>
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container">
<div class="row">
<div class="col-md-8">
<a href="/Person/Create" class="btn btn-success mb-5">Skapa ny medlem</a>
</div>
<div class="col-md-4">
<form asp-action="Search" method="post">
<div class="form-group">
<label class="control-label">
<input name="search" id="search" class="form-control" tabindex="1" placeholder="Namn eller E-post" />
</label>
<input type="submit" value="Sök" class="btn btn-primary" />
</div>
</form>
</div>
</div>
</div>
<div class="container mb-5">
@if (Model.Count() >= 0) {
<table class="table">
<thead>
<tr>
<th>@Html.ActionLink("Id", "Index", null, new { sortOrder = "PersonId" })</th>
<th>@Html.ActionLink("Namn", "Index", null, new { sortOrder = "PersonNamn" })</th>
<th>@Html.ActionLink("E-post", "Index", null, new { sortOrder = "Epost" })</th>
<th>@Html.ActionLink("Ålder", "Index", null, new { sortOrder = "Alder" })</th>
<th>@Html.ActionLink("Registrerad", "Index", null, new { sortOrder = "StartDatum" })</th>
<th>Visningsbild</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var person in Model) {
<tr>
<td>@person.PersonId</td>
<td>@person.PersonNamn</td>
<td>@person.Epost</td>
<td>@person.Alder</td>
<td>@person.StartDatum</td>
<td><img src="~/images/userphoto/@person.Visningsbild" alt="@person.PersonNamn" class="visningsbild" /></td>
<td>
<a asp-action="Delete" asp-controller="Person" asp-route-Id="@person.PersonId">Ta bort</a> |
<a asp-action="Edit" asp-controller="Person" asp-route-Id="@person.PersonId">Editera</a>
</td>
</tr>
}
</tbody>
</table>
}
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,65 @@
@model List<Person>
@{
ViewData["Title"] = "Sökresultat";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container">
<div class="row">
<div class="col-md-8">
<a href="/Person/Create" class="btn btn-success mb-5">Skapa ny medlem</a>
</div>
<div class="col-md-4">
<form asp-action="Search" method="post">
<div class="form-group">
<label class="control-label">
<input name="search" id="search" class="form-control" tabindex="1" placeholder="Namn eller E-post" />
</label>
<input type="submit" value="Sök" class="btn btn-primary" />
</div>
</form>
</div>
</div>
</div>
<div class="container mb-5">
@if (Model.Count() >= 0) {
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>Namn</th>
<th>Epost</th>
<th>Alder</th>
<th>Registrerad</th>
<th>Visningsbild</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var person in Model) {
<tr>
<td>@person.PersonId</td>
<td>@person.PersonNamn</td>
<td>@person.Epost</td>
<td>@person.Alder</td>
<td>@person.StartDatum</td>
<td><img src="~/images/userphoto/@person.Visningsbild" alt="@person.PersonNamn" class="visningsbild" /></td>
<td>
<a asp-action="Delete" asp-controller="Person" asp-route-Id="@person.PersonId">Ta bort</a> |
<a asp-action="Edit" asp-controller="Person" asp-route-Id="@person.PersonId">Editera</a>
</td>
</tr>
}
</tbody>
</table>
}
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,28 @@
@model List<Person>
@{
ViewData["Title"] = "Steg 1: Välj person";
}
<div class="container mb-5">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<form asp-action="DerollSport" method="post">
<div class="row">
<div class="col">
<div class="input-group mb-3">
<select name="PersonId" class="custom-select" tabindex="1">
<option selected>Välj medlem</option>
@foreach (var person in Model) {
<option value="@person.PersonId">@person.PersonNamn</option>
}
</select>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary mt-3">Vidare till nästa steg</button>
</form>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,30 @@
@model List<Person>
@{
ViewData["Title"] = "...och vilken sport ska denne sluta med?";
}
<div class="container mb-5">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<form asp-action="DerollDone" method="post">
<input type="hidden" name="PersonId" value="@ViewBag.PersonId" />
<div class="col">
<div class="input-group mb-3">
<select name="SportId" class="custom-select" tabindex="1">
<option selected>Välj sport</option>
@foreach (var sport in ViewBag.SportForValdPerson) {
<option value="@sport.SportId">@sport.SportNamn</option>
}
</select>
</div>
</div>
<button type="submit" class="btn btn-primary mt-3">Avregistrera från aktivitet</button>
</form>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,40 @@
@model IEnumerable<Person>
@{
ViewData["Title"] = "Registrera medlem i aktivitet";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<div class="container mb-5">
<h4 class="mt-4 mb-4">Vem ska börja träna vad?</h4>
<form asp-action="Enroll" method="post">
<div class="row">
<div class="col">
<div class="input-group mb-3">
<select name="Namn" class="custom-select" tabindex="1">
<option selected>Välj medlem</option>
@foreach (var namn in ViewBag.personer) {
<option value="@namn.PersonId">@namn.PersonNamn</option>
}
</select>
</div>
</div>
<div class="col">
<div class="input-group mb-3">
<select name="Sport" class="custom-select" tabindex="2">
<option selected>Välj sport</option>
@foreach (var sport in ViewBag.sporter) {
<option value="@sport.SportId">@sport.SportNamn</option>
}
</select>
</div>
</div>
</div>
<button type="submit" class="btn btn-primary mt-3">@ViewData["Title"]</button>
</form>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,57 @@
@{
ViewData["Title"] = "Klicka på en sport för att se vilka som utövar den";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
@if (TempData.ContainsKey("MeddelandeSuccess")) {
<div class="alert alert-success alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Allt klart!</strong> @TempData["MeddelandeSuccess"]
</div>
}
else if (TempData.ContainsKey("MeddelandeFail")) {
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Något gick fel.</strong> @TempData["MeddelandeFail"]
</div>
}
<div class="container mb-5">
<div class="text-center mb-3">
@foreach (var sp in ViewBag.AllaSporter) {
<span class="btn btn-light text-black-50">
@Html.ActionLink((string)sp.SportNamn, "Index", new { sportens_id = sp.SportId })
</span>
}
</div>
<h2 class="text-center">@ViewBag.SportNamn</h2>
@if (ViewBag.PersonerIValdSport != null && ViewBag.PersonerIValdSport.Count >= 1) {
<table class="table table-hover">
<thead>
<tr class="d-flex">
<th class="col-2">Person-Id</th>
<th class="col-6">Personens namn</th>
<th class="col-4">Startade</th>
</tr>
</thead>
<tbody>
@foreach (var item in ViewBag.PersonerIValdSport) {
<tr class="d-flex">
<td class="col-2">@item.PersonId</td>
<td class="col-6">@item.PersonNamn</td>
<td class="col-4">@item.StartDatum</td>
</tr>
}
</tbody>
</table>
}
else {
<p class="lead text-center mt-5 mb-5">Det finns ingen som utövar det där...</p>
}
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

25
Views/Shared/Error.cshtml Normal file
View File

@@ -0,0 +1,25 @@
@model ErrorViewModel
@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (Model.ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@Model.RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>

View File

@@ -0,0 +1,28 @@
<div class="row myFooter pt-5 pb-5">
<div class="col-sm">
<h5>&copy; 2021 - SportPalatset</h5>
<p class="m-0">Storgatan 1</p>
<p class="m-0">432 10 Staden</p>
<p class="m-0">Tel. 0123-10 20 30</p>
<p class="m-0">Fax. 0123-30 40 50</p>
<p class="m-0"><a href="mailto:info@sportpalatset.se">info@sportpalatset.se</a></p>
</div>
<div class="col-sm">
<h5>Länkar</h5>
<a href="/Person/Create" class="mb-1">Bli medlem</a><br />
<a href="/Sport/Utbud" class="mb-1">Utbudet</a><br />
<a href="/Start/Priser" class="mb-1">Priser</a><br />
<a href="/Start/Kurser" class="mb-1">Kurser</a><br />
<a href="/Start/Receptionen" class="mb-1">Receptionen</a><br />
<a href="/Start/Oppettider" class="mb-1">Öppettider</a><br />
</div>
<div class="col-sm social">
<h5>Sociala medier</h5>
<p class="m-1 mb-4">Hitta oss i våra kanaler! Vi lägger ut nya bilder hela tiden.</p>
<i class="fab fa-facebook-square"></i>
<i class="fab fa-twitter-square"></i>
<i class="fab fa-instagram-square"></i>
<i class="fab fa-tiktok"></i>
</div>
</div>

View File

@@ -0,0 +1,67 @@
<!DOCTYPE html>
<!-- Observera att detta är en skoluppgift och inte något -->
<!-- som används på riktigt. -->
<!-- Sidan är skapad för en kurs på Umeå Universitet av -->
<!-- Christian Ohlsson 2021-10-10 -->
<!-- -------------------------------------------------------- -->
<html lang="en">
<head>
<meta charset="utf-8" />
<!-- Lite meta-element för visning på vanliga webben -->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords" content="sport, palatset, sportpalatset, staden, yoga, karate, bandy" />
<meta name="description" content="Här kan du träna på många olika sporter och delta i kurser." />
@if (ViewBag.metaAbstract != null) {
<meta name="abstract" content="@ViewBag.metaAbstract" />
}
@if (ViewBag.metaImage != null) {
<meta name="image" content="@ViewBag.metaImage" />
}
<meta name="referrer" content="no-referrer">
<!-- Lite meta-element enligt Social Graph -->
<meta property="og:type" content="website" />
<meta property="og:title" content="SportPalatset - Din träningsanläggning i Staden" />
<meta property="og:description" content="Här kan du träna på många olika sporter och delta i kurser." />
<meta property="og:url" content="https://sportpalatset.se/" />
<meta property="og:site_name" content="SportPalatset" />
<meta property="og:image" content="https://sportpalatset.se/images/Logo.png" />
<!-- Lite meta-element för Twitterläsare -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:creator" content="SportPalatset" />
<meta name="twitter:image" content="https://sportpalatset.se/images/Logo.png" />
<meta name="twitter:site" content="SportPalatset" />
<title>@ViewData["Title"] - PersonSport</title>
<link rel='stylesheet' href='https://fonts.googleapis.com/css2?family=Raleway:wght@300&family=Oswald&display=swap'>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.css" />
<link rel="stylesheet" href="~/css/site.css" />
<link rel="stylesheet" href="~/css/crille.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-0">
<partial name="_Menu" />
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top">
<div class="container-fluid bg-dark">
<div class="container">
<partial name="_Footer" />
</div>
</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>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>

54
Views/Shared/_Menu.cshtml Normal file
View File

@@ -0,0 +1,54 @@
<div class="container">
<a class="navbar-brand" asp-area="" asp-controller="Start" asp-action="Index">
<img src="/images/Logo.png" height="80" alt="Logo" class="minLogotyp mr-1">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-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 btn btn-light mr-2" asp-area="" asp-controller="Sport" asp-action="Utbud">Utbud</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark btn btn-light mr-2" asp-area="" asp-controller="Start" asp-action="Priser">Priser</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark btn btn-light mr-2" asp-area="" asp-controller="Start" asp-action="Kurser">Kurser</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark btn btn-light mr-2" asp-area="" asp-controller="Start" asp-action="Receptionen">Receptionen</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark btn btn-light mr-2" asp-area="" asp-controller="Start" asp-action="Oppettider">Öppettider</a>
</li>
</ul>
@if (Context.User.Identity.IsAuthenticated) {
<div class="dropdown show">
<a class="btn bg-info dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Hantera
</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" asp-area="" asp-controller="Person" asp-action="Index">Medlemmar</a>
<a class="dropdown-item" asp-area="" asp-controller="Sport" asp-action="Index">Sporter</a>
<a class="dropdown-item" asp-area="" asp-controller="PersonSport" asp-action="Enroll">Registrera träning</a>
<a class="dropdown-item" asp-area="" asp-controller="PersonSport" asp-action="Deroll">Sluta träning</a>
<a class="dropdown-item" asp-area="" asp-controller="PersonSport" asp-action="Index">Vem utövar vad</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" asp-area="" asp-controller="Login" asp-action="ShowAdmins">Administratörer</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" asp-area="" asp-controller="Login" asp-action="Logout">Logga ut</a>
</div>
</div>
}
else {
<ul class="navbar-nav mr-0">
<li class="nav-item">
<a class="nav-link text-dark btn btn-light" asp-area="" asp-controller="Login" asp-action="Index">Login</a>
</li>
</ul>
}
</div>
</div>

View File

@@ -0,0 +1,2 @@
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

44
Views/Sport/Create.cshtml Normal file
View File

@@ -0,0 +1,44 @@
@model Sport
@{
ViewData["Title"] = "Lägg till sport";
}
<div class="container mb-5">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<form action="Create" method="post" enctype="multipart/form-data">
<div class="form-group">
<label asp-for="@Model.SportNamn" class="control-label"></label>
<input type="text" class="form-control" asp-for="SportNamn" tabindex="1" placeholder="Sportens namn">
<span asp-validation-for="SportNamn" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Ingress" class="control-label"></label>
<input type="text" class="form-control" asp-for="Ingress" tabindex="2" placeholder="Ingresstext">
<span asp-validation-for="Ingress" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.DetaljText" class="control-label"></label>
<textarea class="form-control" asp-for="DetaljText" tabindex="3" placeholder="Detaljerad text"></textarea>
<span asp-validation-for="DetaljText" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Traningstider" class="control-label"></label>
<input type="text" class="form-control" asp-for="Traningstider" tabindex="4" placeholder="Träningstider">
<span asp-validation-for="Traningstider" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Bakgrundsbild" class="control-label"></label>
<input type="file" class="form-control" asp-for="Bakgrundsbild" tabindex="5">
<span asp-validation-for="Bakgrundsbild" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Lägg till</button>
</form>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,27 @@
@model Sport
@{
ViewData["Title"] = "Mina Sporter";
}
<div class="container mt-2 mb-5">
<img src="~/images/sport/@Model.Bakgrundsbild" alt="@Model.SportNamn" class="img-fluid maxad mb-5" />
<h2>@Model.SportNamn</h2>
<p class="lead font-weight-bold">@Model.Ingress</p>
<p>@Model.DetaljText</p>
<h2>Träningstider</h2>
<p>@Model.Traningstider</p>
@if (Context.User.Identity.IsAuthenticated) {
<a href="/Sport" class="btn btn-success mt-3">Tillbaka till sporterna</a>
}
else {
<a href="/Sport/Utbud" class="btn btn-success mt-3">Tillbaka till utbudet</a>
}
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

40
Views/Sport/Edit.cshtml Normal file
View File

@@ -0,0 +1,40 @@
@model Sport
@{
ViewData["Title"] = "Editera en Sport";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<form action="Edit" method="post" enctype="multipart/form-data">
<input type="hidden" asp-for="SportId" value="@Model.SportId" />
<div class="form-group">
<label>SportNamn</label>
<input type="text" class="form-control" asp-for="SportNamn" tabindex="1">
<span asp-validation-for="SportNamn" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Ingress" class="control-label"></label>
<input type="text" class="form-control" asp-for="Ingress" value="@Model.Ingress">
<span asp-validation-for="Ingress" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="DetaljText" class="control-label"></label>
<textarea class="form-control" asp-for="DetaljText" tabindex="2">@Model.DetaljText</textarea>
<span asp-validation-for="DetaljText" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Traningstider" class="control-label"></label>
<input type="text" class="form-control" asp-for="Traningstider" tabindex="3">
<span asp-validation-for="Traningstider" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Bakgrundsbild" class="control-label"></label>
<input type="file" class="form-control" asp-for="Bakgrundsbild" tabindex="4">
<span asp-validation-for="Bakgrundsbild" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Spara ändringar</button>
</form>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

58
Views/Sport/Index.cshtml Normal file
View File

@@ -0,0 +1,58 @@
@model List<Sport>
@{
ViewData["Title"] = "Detta finns på SportPalatset";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<a href="/Sport/Create" class="btn btn-success mb-5">Skapa ny Sport</a>
@if (TempData.ContainsKey("MeddelandeSuccess")) {
<div class="alert alert-success alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Allt klart!</strong> @TempData["MeddelandeSuccess"]
</div>
}
else if (TempData.ContainsKey("MeddelandeFail")) {
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Något gick fel.</strong> @TempData["MeddelandeFail"]
</div>
}
<div class="container">
@if (Model.Count() >= 1) {
<table class="table">
<thead>
<tr>
<th>Id</th>
<th>SportNamn</th>
<th>Traningstider</th>
<th>Bild</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var sport in Model) {
<tr>
<td>@sport.SportId</td>
<td>@sport.SportNamn</td>
<td>@sport.Traningstider</td>
<td><img src="~/images/sport/@sport.Bakgrundsbild" alt="@sport.SportNamn" class="visningsbild" /></td>
<td>
<a asp-action="Delete" asp-controller="Sport" asp-route-Id="@sport.SportId">Ta bort</a> |
<a asp-action="Edit" asp-controller="Sport" asp-route-Id="@sport.SportId">Editera</a> |
<a asp-action="Details" asp-controller="Sport" asp-route-Id="@sport.SportId">Detaljer</a>
</td>
</tr>
}
</tbody>
</table>
}
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

28
Views/Sport/Utbud.cshtml Normal file
View File

@@ -0,0 +1,28 @@
@model List<Sport>
@{
ViewData["Title"] = "Detta finns på SportPalatset";
}
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<p class="lead text-center font-weight-bold mt-1 mb-4">Hos oss hittar du allt för din träning. Det spelar ingen roll om du är elitsatsande eller motionär.</p>
<div class="container">
@foreach (var sport in Model) {
<a href="/Sport/Details/@sport.SportId">
<div class="col-sm mt-3">
<div class="card bg-dark text-white">
<img class="card-img" src="~/images/sport/@sport.Bakgrundsbild" alt="@sport.SportNamn">
<div class="card-img-overlay myCard">
<h3 class="card-title">@sport.SportNamn</h3>
<p class="card-text mt-5">@sport.Ingress</p>
</div>
</div>
</div>
</a>
}
</div>
<p class="lead mt-5 mb-5 text-center font-weight-bold">Kom du ända hit utan att hitta något? Scrolla tillbaka så hittar du något kul för dig!</p>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

53
Views/Start/Index.cshtml Normal file
View File

@@ -0,0 +1,53 @@
@{
ViewData["Title"] = "Välkommen till SportPalatset";
}
@if (TempData.ContainsKey("MeddelandeSuccess")) {
<div class="alert alert-success alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Allt klart!</strong> @TempData["MeddelandeSuccess"]
</div>
}
else if (TempData.ContainsKey("MeddelandeFail")) {
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>Något gick fel.</strong> @TempData["MeddelandeFail"]
</div>
}
<div class="container mb-5">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<p class="lead text-center">
Vi har många olika sporthallar som ger dig precis den träning som du letar efter.
Kom in till oss och låt ditt nya liv börja!
</p>
<img src="~/images/arenan.jpg" alt="Arenan" class="maxad" />
<a href="/Person/Create" class="registrera mb-5">Registrera gratis medlemskap</a>
<h4 class="mt-4">Vad är SportPalatset?</h4>
<p class="lead font-weight-bold">
Kul att du frågar! Jag ska berätta!
</p>
<p>
SportPalatset är en kommunal träningsanläggning här i Staden. Vi erbjuder träning
och friskvård till kommunens alla invånare; unga i kropp eller sinne!
Vår kunniga personal hjälper dig gärna på vägen för att du skall nå precis
så långt som du vill. Hos oss finns inga måsten, bara kul träning!
</p>
<h4 class="mt-5">Vad kan jag träna hos er?</h4>
<p>
Vi har flera olika sporter och kurser som du kan vara med på. Registrera dig för ett
gratis medlemsskap här ovanför så får du tillgång till vårt månadsbrev som kommer ut varje månad.
Där får du tips om allt som händer hos oss och ibland med lite djupdykning på olika
träningsformer. Vi kallar det för "Månadens fokusträning".
</p>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

80
Views/Start/Kurser.cshtml Normal file
View File

@@ -0,0 +1,80 @@
@{
ViewData["Title"] = "Häng med på våra kurser";
}
<div class="container mb-5">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<p class="lead text-center font-weight-bold">Inte sugen på att börja träna något nytt, men vill gärna testa på? Vi har kursen för dig!</p>
<img src="~/images/kurser.jpg" alt="Arenan" class="maxad" />
<p class="lead text-center mt-5 mb-3">
Våra kurser är fasta paket där du under några enstaka gånger i mindre grupper tränar för att lära dig mer.
Efter en avslutad kurs kommer du att kunna stå på dina egna ben!
</p>
<div class="row">
<div class="col-sm mt-3">
<div class="card bg-dark text-white">
<img class="card-img" src="/images/kampsport.jpg">
<div class="card-img-overlay myKursCard">
<h3 class="card-title text-uppercase">Kampsport</h3>
</div>
</div>
</div>
<div class="col-sm mt-3">
<div class="card bg-dark text-white">
<img class="card-img" src="/images/crossfit.jpg">
<div class="card-img-overlay myKursCard">
<h3 class="card-title text-uppercase">Crossfit</h3>
</div>
</div>
</div>
<div class="col-sm mt-3">
<div class="card bg-dark text-white">
<img class="card-img" src="/images/kids.jpg">
<div class="card-img-overlay myKursCard">
<h3 class="card-title text-uppercase">Funky Kidz</h3>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm mt-3">
<div class="card bg-dark text-white">
<img class="card-img" src="/images/vardagsstark.jpg">
<div class="card-img-overlay myKursCard">
<h3 class="card-title text-uppercase">Vardagsstark</h3>
</div>
</div>
</div>
<div class="col-sm mt-3">
<div class="card bg-dark text-white">
<img class="card-img" src="/images/yoga.jpg">
<div class="card-img-overlay myKursCard">
<h3 class="card-title text-uppercase">Yoga</h3>
</div>
</div>
</div>
<div class="col-sm mt-3">
<div class="card bg-dark text-white">
<img class="card-img" src="/images/vikt.jpg">
<div class="card-img-overlay myKursCard">
<h3 class="card-title text-uppercase">Viktminskning</h3>
</div>
</div>
</div>
</div>
<p class="lead text-center mt-5 mb-3 font-weight-bold">
Blev du sugen på att testa på något? Hör av dig till receptionen för starttiden för kursen du gillade.
</p>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,141 @@
@{
ViewData["Title"] = "Öppettider";
}
<div class="container">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<p class="lead text-center font-weight-bold">Om du har ett gymkort är det alltid öppet för dig. Andra öppettider kan du se nedan.</p>
<img src="~/images/oppettider.jpg" alt="Öppettider" class="maxad" />
<h2 class="mt-5">Information om Coronaviruset</h2>
<p class="lead">
Vi följer Folkhälsomyndighetens rekommendationer och arbetar för att du ska kunna fortsätta att träna och
bada i en frisk miljö. Det gör vi bland annat genom att öka städfrekvensen, anpassa våra aktiviteter samt informera
dig som besöker oss om hur du kan hjälpa till att minska risken för smittspridning.
</p>
<p class="m-0"><i class="fas fa-check-square"></i>Följ skyltad hänvisning.</p>
<p class="m-0"><i class="fas fa-check-square"></i>Håll avstånd till andra personer</p>
<p class="m-0"><i class="fas fa-check-square"></i>Var extra noga med handhygien.</p>
<p class="m-0"><i class="fas fa-check-square"></i>Torka av gymutrustning efter användning.</p>
<h3 class="mt-5">Öppettider för SportPalatset</h3>
<p class="lead">
Läs nedan för de olika sektionernas öppettider.
Observera att på <span class="text-danger">röda dagar</span> gäller speciella öppettider.
För dig med gymkort är det dock alltid öppet som vanligt.
</p>
<h3>Kampsporthallen</h3>
<table class="table table-hover">
<thead>
<tr>
<th>Veckodag</th>
<th>Öppettider</th>
</tr>
</thead>
<tbody>
<tr>
<td>Måndag</td>
<td>07.00 - 22.00</td>
</tr>
<tr>
<td>Tisdag</td>
<td>09.00 - 21.00</td>
</tr>
<tr>
<td>Onsdag</td>
<td>07.00 - 22.00</td>
</tr>
<tr>
<td>Torsdag</td>
<td>09.00 - 21.00</td>
</tr>
<tr>
<td>Fredag</td>
<td>07.00 - 22.00</td>
</tr>
<tr>
<td>Lördag</td>
<td>10.00 - 20.00</td>
</tr>
<tr>
<td>Söndag</td>
<td>10.00 - 20.00</td>
</tr>
</tbody>
</table>
<h3>Yogasalen</h3>
<table class="table table-hover">
<thead>
<tr>
<th>Veckodag</th>
<th>Öppettider</th>
</tr>
</thead>
<tbody>
<tr>
<td>Måndag till Fredag</td>
<td>16.00 - 22.00</td>
</tr>
<tr>
<td>Lördag till Söndag</td>
<td>06.00 - 19.00</td>
</tr>
</tbody>
</table>
<h3>Stora hallen</h3>
<p>Stora hallen har endast öppet för bokade tider. Hör av dig till receptionen om du vill boka Stora hallen.</p>
<table class="table table-hover">
<thead>
<tr>
<th>Veckodag</th>
<th>Öppettider</th>
</tr>
</thead>
<tbody>
<tr>
<td>Måndag</td>
<td>09.00 - 20.00</td>
</tr>
<tr>
<td>Tisdag</td>
<td>09.00 - 20.00</td>
</tr>
<tr>
<td>Onsdag</td>
<td>09.00 - 20.00</td>
</tr>
<tr>
<td>Torsdag</td>
<td>09.00 - 20.00</td>
</tr>
<tr>
<td>Fredag</td>
<td>09.00 - 23.00</td>
</tr>
<tr>
<td>Lördag</td>
<td>07.00 - 23.00</td>
</tr>
<tr>
<td>Söndag</td>
<td>07.00 - 20.00</td>
</tr>
</tbody>
</table>
<p class="lead text-center mt-5 mb-5 font-weight-bold">
För andra sporthallars öppettider: Kontakta receptionen.
</p>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

159
Views/Start/Priser.cshtml Normal file
View File

@@ -0,0 +1,159 @@
@{
ViewData["Title"] = "Priser för kort och träningar";
}
<div class="container">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<p class="lead text-center font-weight-bold">Vi vet att det bara är på SportPalatset som du hittar en träning för just dig och din plånbok.</p>
<img src="~/images/priser.jpg" alt="Arenan" class="maxad" />
<p class="lead text-center mt-3">Vi har mycket bra priser som kommer att få dig att vilja komma lite oftare.</p>
<p class="lead text-center">
Vi ger dig de senaste och bästa träningsmöjligheterna, utbudet är näst intill obegränsat.
Om du har funderingar eller vill boka tid för rådgivning kan du kontakta oss alla dagar i veckan 0123-10 20 30.
</p>
<h3 class="mt-5">Träningskort för gym</h3>
<table class="table table-hover">
<thead>
<tr>
<th>Korttyp</th>
<th>Månadskostnad</th>
<th>Årskort</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<b>Maxade kortet</b><br />
Gruppträning, styrketräning, konditionsträning. Wellness Online. Träna på alla klubbar. Kundkonto med 1000 kr i kredit (Gäller endast autogiro).
</td>
<td>449kr/mån</td>
<td>5199kr</td>
</tr>
<tr>
<td>
<b>Guldkortet</b><br />
Styrketräning, konditionsträning. Träna på alla klubbar inom en region. Kundkonto med 1000 kr i kredit. (Gäller endast autogiro).
</td>
<td>399kr/mån</td>
<td>4699kr</td>
</tr>
<tr>
<td>
<b>Silverkortet</b><br />
Styrketräning, konditionsträning. Träna på vald Family Fitness-klubb. Gästträna för 20 kr på annan valfri SportPalatset-klubb. Kundkonto med 1000 kr i kredit. (Gäller endast autogiro).
</td>
<td>349kr/mån</td>
<td>4199kr</td>
</tr>
<tr>
<td>
<b>Dagskortet</b><br />
Tillgång till all träning vi erbjuder under en dag på valfri SportPalatset-klubb.
</td>
<td></td>
<td>119kr</td>
</tr>
</tbody>
</table>
<h3 class="mt-5">Kampsportskort</h3>
<table class="table table-hover">
<thead>
<tr>
<th>Medlemskap</th>
<th>Årskostnad</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<b>Fighting Guld</b><br />
Kortet ger dig tillträde på alla träningar i alla kampsporter på SportPalatset. Medlemsskapet är personligt.
</td>
<td>800kr/år</td>
</tr>
<tr>
<td>
<b>Fighting Student</b><br />
Kortet ger dig tillträde på alla träningar i alla kampsporter på SportPalatset. Medlemsskapet är personligt. Priset gäller vid uppvisande av giltigt Mecenat-kort.
</td>
<td>550kr/år</td>
</tr>
<tr>
<td>
<b>Fighting Pensionär</b><br />
Kortet ger dig tillträde på alla träningar i alla kampsporter på SportPalatset. Medlemsskapet är personligt och kräver att du visar legitimation och har fyllt 65år.
</td>
<td>550kr/år</td>
</tr>
</tbody>
</table>
<h3 class="mt-5">Seniorkort Zumba</h3>
<table class="table table-hover">
<thead>
<tr>
<th>Medlemsskap</th>
<th>Pris</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<b>Zumba för old-timers</b><br />
Träna exotisk dans med Zumba-inslag för dig över 65. Alla pass anpassas vi att alla kan vara med oavsett vilken nivå du startar från.
</td>
<td>1499kr/år</td>
</tr>
</tbody>
</table>
<h3 class="mt-5">Innebandykortet</h3>
<table class="table table-hover">
<thead>
<tr>
<th>Medlemsskap</th>
<th>Pris</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<b>Kullerbyttan</b><br />
Kortet som ger dig mellan 2år och 7år tillgång till alla träningar i vår innebandyhall. Naturligtvis finns tränare på plats.
</td>
<td>699kr/år</td>
</tr>
<tr>
<td>
<b>Ungdomsmedlemskap</b><br />
Kortet som ger dig mellan 8år och 14år tillgång till alla träningar i vår innebandyhall. Mobilladdare och WiFi finns, så detta blir som hemma för dig.
</td>
<td>1099kr/år</td>
</tr>
<tr>
<td>
<b>Going for Pro</b><br />
Detta är innebandy-kortet för dig som vill satsa lite extra på din innebandy. I detta kort har vi inga mobilladdare och håller WiFi avstängt för att ge dig en så koncentrerad form av innebandyträning som möjligt.
</td>
<td>1499kr/år</td>
</tr>
</tbody>
</table>
<p class=" text-center lead mt-5 mb-5 font-weight-bold">För andra priser kontakta din tränare eller receptionen</p>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,53 @@
@model MailViewModel
@{
ViewData["Title"] = "Receptionen";
}
<div class="container mb-5">
<h2 class="text-center mt-3 mb-4">@ViewData["Title"]</h2>
<p class="lead text-center font-weight-bold">Vad kan vi hjälpa till med? Receptionen på SportPalatset är bemannad alla dagar 6.30-23.00</p>
<div class="row">
<div class="col">
<img src="~/images/map.jpg" alt="Hitta hit" />
</div>
<div class="col">
<h4 class="text-dark">Du hittar oss här</h4>
<p class="m-1">Storgatan 1</p>
<p class="m-1">432 10 Staden</p>
<p class="m-1">Tel. 0123-10 20 30</p>
<p class="m-1">Fax. 0123-30 40 50</p>
<p class="m-1">info@sportpalatset.se</p>
<form action="SendMail" method="post">
<fieldset class="form-group mt-4">
<legend class="mt-3 font-weight-bold">Maila till oss</legend>
<div class="form-group">
<label asp-for="@Model.Epost" class="control-label"></label>
<input type="text" class="form-control" asp-for="Epost" tabindex="1" placeholder="Din e-postadress">
<span asp-validation-for="Epost" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Subject" class="control-label"></label>
<input type="text" class="form-control" asp-for="Subject" tabindex="2" placeholder="Ärende">
<span asp-validation-for="Subject" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="@Model.Message" class="control-label"></label>
<textarea name="Message" class="form-control" asp-for="Message" tabindex="3" placeholder="Meddelande"></textarea>
<span asp-validation-for="Message" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Skicka mail</button>
</fieldset>
</form>
</div>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

View File

@@ -0,0 +1,3 @@
@using PersonSport
@using PersonSport.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

3
Views/_ViewStart.cshtml Normal file
View File

@@ -0,0 +1,3 @@
@{
Layout = "_Layout";
}