added BuildOverview and BuildEdit

This commit is contained in:
t.ruspekhofer 2022-02-26 20:23:28 +01:00
parent a3062165e1
commit 9ffaf908f3
5 changed files with 226 additions and 8 deletions

View file

@ -0,0 +1,69 @@
using Lieb.Models.GuildWars2;
using Microsoft.EntityFrameworkCore;
namespace Lieb.Data
{
public class GuildWars2BuildService
{
private readonly IDbContextFactory<LiebContext> _contextFactory;
public GuildWars2BuildService(IDbContextFactory<LiebContext> contextFactory)
{
_contextFactory = contextFactory;
}
public async Task AddOrEditBuild(GuildWars2Build build)
{
if (build != null)
{
using var context = _contextFactory.CreateDbContext();
if (build.GuildWars2BuildId == 0)
{
context.GuildWars2Builds.Add(build);
await context.SaveChangesAsync();
}
else
{
GuildWars2Build? buildToChange = await context.GuildWars2Builds
.FirstOrDefaultAsync(r => r.GuildWars2BuildId == build.GuildWars2BuildId);
if (buildToChange != null)
{
buildToChange.BuildName = build.BuildName;
buildToChange.Might = build.Might;
buildToChange.Quickness = build.Quickness;
buildToChange.Alacrity = build.Alacrity;
buildToChange.Heal = build.Heal;
buildToChange.Class = build.Class;
buildToChange.EliteSpecialization = build.EliteSpecialization;
await context.SaveChangesAsync();
}
}
}
}
public async Task DeleteBuild(int buildId)
{
using var context = _contextFactory.CreateDbContext();
GuildWars2Build? build = await context.GuildWars2Builds.FirstOrDefaultAsync(b => b.GuildWars2BuildId == buildId);
if (build != null)
{
context.GuildWars2Builds.Remove(build);
await context.SaveChangesAsync();
}
}
public List<GuildWars2Build> GetBuilds()
{
using var context = _contextFactory.CreateDbContext();
return context.GuildWars2Builds.ToList();
}
public GuildWars2Build GetBuild(int buildId)
{
using var context = _contextFactory.CreateDbContext();
return context.GuildWars2Builds.FirstOrDefault(b => b.GuildWars2BuildId == buildId);
}
}
}

View file

@ -0,0 +1,114 @@
@page "/buildedit"
@page "/buildedit/{buildId}"
@using Lieb.Data
@using Lieb.Models.GuildWars2
@using System.ComponentModel.DataAnnotations
@inject GuildWars2BuildService GuildWars2BuildService
@inject NavigationManager NavigationManager
@inject IJSRuntime JsRuntime
<h3>BuildEdit</h3>
<AuthorizeView Policy="Admin" Context="authorizationContext">
<EditForm Model="@_build" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<p>
<label>
Build name:
<InputText @bind-Value="_build.BuildName" />
</label>
</p>
<p>
<label>
Might:
<InputNumber @bind-Value="_build.Might" />
</label>
</p>
<p>
<label>
Quickness:
<InputNumber @bind-Value="_build.Quickness" />
</label>
</p>
<p>
<label>
Alacrity:
<InputNumber @bind-Value="_build.Alacrity" />
</label>
</p>
<p>
<label>
Heal:
<InputNumber @bind-Value="_build.Heal" />
</label>
</p>
<p>
<label>
Class:
<InputSelect @bind-Value="_build.Class">
@foreach(GuildWars2Class gw2Class in Enum.GetValues(typeof(GuildWars2Class)))
{
<option value="@gw2Class">@gw2Class.ToString()</option>
}
</InputSelect>
</label>
</p>
<p>
<label>
Elite specialization:
<InputSelect @bind-Value="_build.EliteSpecialization">
@foreach(EliteSpecialization gw2EliteSpec in Enum.GetValues(typeof(EliteSpecialization)))
{
<option value="@gw2EliteSpec">@gw2EliteSpec.ToString()</option>
}
</InputSelect>
</label>
</p>
<button type="submit">Submit</button>
</EditForm>
<br/>
<button type=button @onclick="() => DeleteBuildClicked()">Delete Build</button>
</AuthorizeView>
@code {
[Parameter]
public string buildId { get; set; }
public GuildWars2Build _build;
protected override async Task OnInitializedAsync()
{
if(!string.IsNullOrEmpty(buildId) && int.TryParse(buildId, out int parsedId))
{
_build = GuildWars2BuildService.GetBuild(parsedId);
}
else
{
_build = new GuildWars2Build();
}
}
async Task DeleteBuildClicked()
{
bool confirmed = await JsRuntime.InvokeAsync<bool>("confirm", "Are you sure?");
if (confirmed)
{
await GuildWars2BuildService.DeleteBuild(_build.GuildWars2BuildId);
NavigationManager.NavigateTo("buildoverview");
}
}
private async Task HandleValidSubmit()
{
await GuildWars2BuildService.AddOrEditBuild(_build);
NavigationManager.NavigateTo("buildoverview");
}
}

View file

@ -0,0 +1,40 @@
@page "/buildoverview"
@using Lieb.Data
@using Lieb.Models.GuildWars2
@inject GuildWars2BuildService GuildWars2BuildService
<h3>BuildOverview</h3>
<AuthorizeView Policy="Admin">
<Authorized>
<div class="nav-item px-3">
<NavLink class="nav-link" href="buildedit">
<span class="oi oi-plus" aria-hidden="true"></span> Add Build
</NavLink>
</div>
@foreach (var build in _builds) {
<div class="nav-item px-3">
@{string navLink = $"buildedit/{@build.GuildWars2BuildId}";}
<NavLink class="nav-link" href="@navLink">@build.BuildName</NavLink>
</div>
}
</Authorized>
<NotAuthorized>
@foreach (var build in _builds) {
<div>@build.BuildName</div>
}
</NotAuthorized>
</AuthorizeView>
@code
{
private List<GuildWars2Build> _builds;
protected override async Task OnInitializedAsync()
{
_builds = GuildWars2BuildService.GetBuilds();
}
}

View file

@ -23,14 +23,9 @@ builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<RaidService>(); builder.Services.AddScoped<RaidService>();
builder.Services.AddScoped<UserService>(); builder.Services.AddScoped<UserService>();
builder.Services.AddScoped<GuildWars2AccountService>(); builder.Services.AddScoped<GuildWars2AccountService>();
builder.Services.AddScoped<GuildWars2BuildService>();
//builder.Services.AddTransient<RaidService>();
//builder.Services.AddTransient<UserService>();
//builder.Services.AddTransient<GuildWars2AccountService>();
builder.Services.AddAuthentication(opt => builder.Services.AddAuthentication(opt =>
{ {
opt.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; opt.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;

View file

@ -20,8 +20,8 @@
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata"> <NavLink class="nav-link" href="buildoverview">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data <span class="oi oi-list-rich" aria-hidden="true"></span> Build Overview
</NavLink> </NavLink>
</div> </div>
</nav> </nav>