@page "/admin/products" @layout AdminLayout @using Generic @inject ProductAPIConsumer productAPIConsumer @inject ISnackbar Snackbar @inject IJSRuntime JS

Manage Products

Add Product
@if (_loading) { } else if (products == null || !products.Any()) { } else { @foreach (var product in products) { } }
Pic Name Price Actions
No products found.
@if (product.Photos != null && product.Photos.Any()) { Product image } else {
}
@product.Translations?.FirstOrDefault()?.Info?.Name ?? string.Empty) @product.Price?.ToString("C") Edit
@code { ProductFilter productFilter = new(); Pagination pagination = new() { PageSize = 10, CurrentPage = 1 }; bool _loading = false; List products = new(); protected override async Task OnInitializedAsync() { await LoadProducts(); } async Task LoadProducts() { _loading = true; try { var result = await productAPIConsumer.FetchProduct(productFilter, pagination); products = result.Item1 ?? new List(); pagination.ItemsCount = result.Item2; } catch (Exception ex) { Console.WriteLine($"Error loading products: {ex.Message}"); products = new List(); ToastService.ShowToast("Failed to load products", ToastLevel.Error); } finally { _loading = false; } } async Task HandlePageChange(int page) { pagination.CurrentPage = page; await LoadProducts(); } async Task HandleKeyUp(KeyboardEventArgs e) { if (e.Key == "Enter") { pagination.CurrentPage = 1; await LoadProducts(); } } async Task ClearFilters() { productFilter = new(); pagination.CurrentPage = 1; await LoadProducts(); } async Task Remove(ProductVM product) { var confirmed = await JS.InvokeAsync("confirm", $"Are you sure you want to delete '{product.Translations?.FirstOrDefault()?.Info?.Name ?? string.Empty}'?"); if (confirmed) { if (product.Id == null) return; try { var isSuccess = await productAPIConsumer.DeleteProduct(product.Id.Value.ToString()); if (isSuccess) { ToastService.ShowToast("Product deleted successfully", ToastLevel.Success); await LoadProducts(); // Reload to refresh list and pagination } else { ToastService.ShowToast("Failed to delete product", ToastLevel.Error); } } catch (Exception ex) { ToastService.ShowToast($"Error: {ex.Message}", ToastLevel.Error); } } } }