Fixed localization issues, fixed text-warning not accessible,

This commit is contained in:
2025-11-30 10:28:50 +01:00
parent db8f2fcdf1
commit b005975c81
10 changed files with 76 additions and 20 deletions

View File

@@ -24,7 +24,7 @@ public class OrderController : Controller
// POST: Order/Create
[HttpPost]
public async Task<IActionResult> Create(Order order, string[] itemNames, decimal[] itemPrices)
public async Task<IActionResult> Create(Order order, string[] itemNames, string[] itemPrices)
{
if (!ModelState.IsValid)
return View();
@@ -38,13 +38,14 @@ public class OrderController : Controller
// Add menu items
for (int i = 0; i < itemNames.Length; i++)
{
if (!string.IsNullOrEmpty(itemNames[i]) && itemPrices[i] > 0)
itemPrices[i] = itemPrices[i].Replace(".", ",");
if (!string.IsNullOrEmpty(itemNames[i]) && decimal.TryParse(itemPrices[i], out var price) && price > 0)
{
_context.MenuItems.Add(new MenuItem
{
OrderId = order.Id,
Name = itemNames[i],
Price = itemPrices[i]
Price = price
});
}
}
@@ -111,6 +112,26 @@ public class OrderController : Controller
return View(order);
}
// GET: Order/Close/{code}
public async Task<IActionResult> Close(string code)
{
var order = await _context.Orders.FirstOrDefaultAsync(o => o.OrderCode == code);
if (order == null)
return NotFound("Order not found");
if (order.IsClosed)
return BadRequest("Order is already closed");
order.IsClosed = true;
order.ClosedAt = DateTime.UtcNow;
_context.Orders.Update(order);
await _context.SaveChangesAsync();
return RedirectToAction("Details", new { code = order.OrderCode });
}
private string GenerateOrderCode()
{
return Guid.NewGuid().ToString().Substring(0, 8).ToUpper();

View File

@@ -80,7 +80,15 @@ if (!app.Environment.IsDevelopment())
}
app.UseHttpsRedirection();
app.UseRequestLocalization();
// Add localization
var supportedCultures = new[] { "de", "de-DE", "en-US" };
var localizationOptions = new RequestLocalizationOptions()
.SetDefaultCulture("de")
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
app.UseRouting();
app.UseAuthentication();

View File

@@ -100,7 +100,7 @@
<value>Gesamt</value>
</data>
<data name="IOwe" xml:space="preserve">
<value>Ich schulde</value>
<value>Offener Betrag</value>
</data>
<data name="AddMore" xml:space="preserve">
<value>Mehr hinzufügen</value>
@@ -267,4 +267,16 @@
<data name="RegistrationSuccessful" xml:space="preserve">
<value>Registrierung erfolgreich! Leitung zum Login...</value>
</data>
<data name="Created" xml:space="preserve">
<value>Erstellt</value>
</data>
<data name="MyItems" xml:space="preserve">
<value>Meine Artikel</value>
</data>
<data name="CurrencySymbol" xml:space="preserve">
<value>€</value>
</data>
<data name="Currency" xml:space="preserve">
<value>{0} €</value>
</data>
</root>

View File

@@ -100,7 +100,7 @@
<value>Total</value>
</data>
<data name="IOwe" xml:space="preserve">
<value>I owe</value>
<value>Outstanding amount</value>
</data>
<data name="AddMore" xml:space="preserve">
<value>Add More</value>
@@ -267,4 +267,16 @@
<data name="RegistrationSuccessful" xml:space="preserve">
<value>Registration successful! Redirecting to login...</value>
</data>
<data name="Created" xml:space="preserve">
<value>Created</value>
</data>
<data name="MyItems" xml:space="preserve">
<value>My Items</value>
</data>
<data name="CurrencySymbol" xml:space="preserve">
<value>$</value>
</data>
<data name="Currency" xml:space="preserve">
<value>${0}</value>
</data>
</root>

View File

@@ -14,4 +14,5 @@ public class LocalizationService
public string Get(string key) => _localizer[key];
public string this[string key] => _localizer[key];
public string this[string key, params object[] args] => _localizer[key, args];
}

View File

@@ -11,8 +11,6 @@
<div class="row mb-4">
<div class="col-md-12">
<h1>@Localizer.Get("Welcome")</h1>
<p>@Localizer.Get("LoggedInAs"): <strong>@User.Identity?.Name</strong></p>
<a href="/Account/Logout" class="btn btn-danger">@Localizer.Get("Logout")</a>
</div>
</div>
@@ -63,7 +61,7 @@
<small class="text-muted">@Localizer.Get("Created"): @order.CreatedAt.ToString("MMM dd, yyyy HH:mm")</small><br>
<small>@Localizer.Get("Items"): @order.MenuItems.Count | @Localizer.Get("Orders"): @order.OrderItems.Count</small>
</p>
<p class="text-success"><strong>@Localizer.Get("Total"): $@order.OrderItems.Sum(oi => oi.MenuItem.Price * oi.Quantity).ToString("F2")</strong></p>
<p class="text-success"><strong>@Localizer.Get("Total"): @Localizer["Currency", order.OrderItems.Sum(oi => oi.MenuItem.Price * oi.Quantity).ToString("F2")]</strong></p>
<div class="d-flex gap-2">
<a href="/order/details?code=@order.OrderCode" class="btn btn-sm btn-primary">@Localizer.Get("View")</a>
@if (!order.IsClosed)
@@ -72,7 +70,7 @@
}
else
{
<span class="badge bg-secondary">@Localizer.Get("Closed")</span>
<span class="badge bg-secondary align-content-center">@Localizer.Get("Closed")</span>
}
</div>
</div>
@@ -109,7 +107,7 @@
<small class="text-muted">@Localizer.Get("CreatedBy"): @order.CreatorName</small><br>
<small>@Localizer.Get("MyItems"): @myItems.Count</small>
</p>
<p class="text-warning"><strong>@Localizer.Get("IOwe"): $@myItems.Sum(oi => oi.MenuItem.Price * oi.Quantity).ToString("F2")</strong></p>
<p><strong>@Localizer.Get("IOwe"): @Localizer["Currency", myItems.Sum(oi => (oi.MenuItem?.Price ?? 0) * oi.Quantity).ToString("F2")]</strong></p>
<div class="d-flex gap-2">
<a href="/order/join?code=@order.OrderCode" class="btn btn-sm btn-primary">@Localizer.Get("View")</a>
@if (!order.IsClosed)

View File

@@ -15,7 +15,7 @@
<form method="post" id="createOrderForm">
<div class="mb-3">
<label for="Name" class="form-label">@Localizer["OrderName"]</label>
<input type="text" class="form-control" id="Name" name="Name" placeholder="e.g., Pizza Party" required>
<input type="text" class="form-control" id="Name" name="Name" required>
<small class="text-muted">@Localizer["GiveOrderName"]</small>
</div>
@@ -32,7 +32,7 @@
</div>
<div class="col-md-4">
<div class="input-group">
<span class="input-group-text">$</span>
<span class="input-group-text">@Localizer["CurrencySymbol"]</span>
<input type="number" class="form-control" placeholder="@Localizer["Price"]" name="itemPrices[]" step="0.01" min="0">
</div>
</div>
@@ -67,7 +67,7 @@ document.getElementById('addItemBtn').addEventListener('click', function() {
</div>
<div class="col-md-4">
<div class="input-group">
<span class="input-group-text">$</span>
<span class="input-group-text">@Localizer["CurrencySymbol"]</span>
<input type="number" class="form-control" placeholder="@Localizer["Price"]" name="itemPrices[]" step="0.01" min="0">
<button type="button" class="btn btn-outline-danger" onclick="this.closest('.item-row').remove()">@Localizer["Remove"]</button>
</div>

View File

@@ -38,7 +38,7 @@
{
<tr>
<td>@item.Name</td>
<td>$@item.Price.ToString("F2")</td>
<td>@Localizer["Currency", item.Price.ToString("F2")]</td>
</tr>
}
</tbody>
@@ -74,7 +74,7 @@
<td>@orderItem.ParticipantName</td>
<td>@orderItem.MenuItem?.Name</td>
<td>@orderItem.Quantity</td>
<td>$@(orderItem.MenuItem?.Price * orderItem.Quantity ?? 0).ToString("F2")</td>
<td>@Localizer["Currency", (orderItem.MenuItem?.Price * orderItem.Quantity ?? 0).ToString("F2")]</td>
</tr>
}
</tbody>
@@ -105,13 +105,17 @@
<h5>@Localizer.Get("QuickStats")</h5>
<p>@Localizer.Get("TotalItems"): <strong>@Model.MenuItems.Count</strong></p>
<p>@Localizer.Get("TotalOrders"): <strong>@Model.OrderItems.Count</strong></p>
<p>@Localizer.Get("TotalRevenue"): <strong>$@Model.OrderItems.Sum(oi => oi.MenuItem.Price * oi.Quantity).ToString("F2")</strong></p>
<p>@Localizer.Get("TotalRevenue"): <strong>@Localizer["Currency", Model.OrderItems.Sum(oi => oi.MenuItem.Price * oi.Quantity).ToString("F2")]</strong></p>
</div>
</div>
@if (!Model.IsClosed)
{
<a href="#" class="btn btn-danger w-100">@Localizer.Get("CloseOrder")</a>
<a href="/order/close?code=@Model.OrderCode" class="btn btn-danger w-100">@Localizer.Get("CloseOrder")</a>
}
else
{
<div class="alert alert-danger w-100">@Localizer.Get("Closed")</div>
}
</div>
</div>

View File

@@ -12,7 +12,7 @@
<div class="col-md-8">
<div class="card shadow mb-4">
<div class="card-body">
<h2>@Model.CreatorName</h2>
<h2>@Model.Name</h2>
<p class="text-muted">@Localizer["Code"]: <strong>@Model.OrderCode</strong></p>
<p>@Localizer["CreatedBy"]: <strong>@Model.CreatorName</strong></p>
</div>

View File

@@ -44,7 +44,7 @@
<footer class="border-top footer text-muted">
<div class="container">
&copy; 2025 - OneForMe - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
&copy; 2025 - OneForMe
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>