cocktailweb/CocktailWeb/Pages/Settings/CocktailHinzufuegen.razor.cs
2024-02-07 19:54:55 +01:00

132 lines
4.9 KiB
C#

using CocktailWeb.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.EntityFrameworkCore;
namespace CocktailWeb.Pages.Settings
{
public partial class CocktailHinzufuegen
{
[Parameter]
public string? id { get; set; }
public List<Flasche> FlaschenListe { get; set; } = new();
public Cocktail? EditCocktail;
private IBrowserFile? CocktaiLBildDatei;
private DbDataContext? _DataContext;
protected override async Task OnInitializedAsync()
{
if (id != null)
{
_DataContext ??= await DataContextFactory.CreateDbContextAsync();
if (_DataContext != null)
{
EditCocktail = _DataContext.Cocktails.Include(c => c.Cocktailflaschen).ThenInclude(cf => cf.Flasche).Single(c => c.Id == Convert.ToInt32(id));
}
}
// Falls keine ID angegeben wurde oder der Cocktail in der Datenbank nicht gefunden wurde, gehen wir davon aus dass ein neuer Cocktail erstellt wird.
if (EditCocktail == null)
{
EditCocktail = new();
}
await FillFlaschenListe();
await InvokeAsync(StateHasChanged);
}
public async Task FillFlaschenListe()
{
_DataContext ??= await DataContextFactory.CreateDbContextAsync();
if (_DataContext != null)
{
FlaschenListe = await _DataContext.Flaschen.OrderBy(f => f.Name).ToListAsync();
}
}
public void FlascheHinzufuegen(MouseEventArgs e, Flasche f)
{
EditCocktail?.Cocktailflaschen.Add(new CocktailFlasche() { Flasche = f, Reihenfolge = EditCocktail.Cocktailflaschen.Count + 1 });
CocktailFlaschenSortieren();
}
public void FlascheEntfernen(MouseEventArgs e, CocktailFlasche cf)
{
EditCocktail?.Cocktailflaschen.Remove(cf);
CocktailFlaschenSortieren();
}
/// <summary>
/// Geht die Liste durch und setzt die Reihenfolge neu
/// </summary>
void CocktailFlaschenSortieren()
{
// Reihenfolge neu sortieren, damit keine Lücken entstehen
int i = 1;
foreach (var c in EditCocktail.Cocktailflaschen.OrderBy(cf => cf.Reihenfolge))
{
c.Reihenfolge = i;
i++;
}
}
public void FlascheReihenfolge(MouseEventArgs e, CocktailFlasche cf, int Richtung)
{
cf.Reihenfolge += Richtung;
CocktailFlaschenSortieren();
}
public void Bild_OnChange(InputFileChangeEventArgs e)
{
CocktaiLBildDatei = e.GetMultipleFiles().FirstOrDefault();
//this.StateHasChanged(); War in nem Stackexchange.. Nötig?
}
private async Task OnSubmit(EventArgs e)
{
_DataContext ??= await DataContextFactory.CreateDbContextAsync();
if (EditCocktail != null && _DataContext != null)
{
if (id != null)
{
_DataContext.Cocktails.Update(EditCocktail);
}
else
{
_DataContext.Cocktails.Add(EditCocktail);
}
await _DataContext.SaveChangesAsync();
if (CocktaiLBildDatei != null)
{
try
{
// Bild hochladen
var relativeuploadpath = Path.Join(Config.Value.ImageUploadDir, $"{EditCocktail.Id}{Path.GetExtension(CocktaiLBildDatei.Name)}");
var fullpath = Path.Join(env.WebRootPath, relativeuploadpath);
string? folder = Path.GetDirectoryName(fullpath);
if (folder != null && !Path.Exists(folder)) Directory.CreateDirectory(folder);
Stream stream = CocktaiLBildDatei.OpenReadStream(maxAllowedSize: Config.Value.MaxAllowedUploadSizeInMB * 1024 * 1024);
FileStream fs = File.Create(fullpath);
await stream.CopyToAsync(fs);
stream.Close();
fs.Close();
EditCocktail.ImageURL = relativeuploadpath;
// URL hinterlegen und wieder speichern
_DataContext.Cocktails.Update(EditCocktail);
await _DataContext.SaveChangesAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Error uploading image: {ex.Message}");
}
}
}
nav.NavigateTo("/settings/cocktails");
}
}
}