@page "/manage-category/{id?}" @layout AdminLayout @using Generic.Media.Components @using Commerce.Contracts.DTOs @inject CategoryAPIConsumer categoryAPIConsumer @inject ISnackbar Snackbar

@(string.IsNullOrEmpty(Id) ? "Create Category" : "Edit Category")

@foreach (var lang in _languages) { }

Configuration

Groups multiple products

Category Name
@(_languages[_activeLang])

Description
@(_languages[_activeLang])

Category Specifications
@(_languages[_activeLang])

@if (!_technicalDetails.ContainsKey(_activeLang) || !_technicalDetails[_activeLang].Any()) {

No specifications for @(_languages[_activeLang])

} else { @foreach (var item in _technicalDetails[_activeLang]) {
} }

Category Media

@code { [Parameter] public string? Id { get; set; } CategoryVM category = new(); private EditContext? _editContext; Media? mediaComponent; Dictionary _names = new(); Dictionary _descriptions = new(); Dictionary> _technicalDetails = new(); private string _activeLang = "en"; private readonly Dictionary _languages = new() { { "en", "English" }, { "ar", "العربية" }, { "es", "Español" }, { "de", "Deutsch" } }; protected override async Task OnInitializedAsync() { if (!string.IsNullOrEmpty(Id)) { category = await categoryAPIConsumer.GetCategory(Id); } // Map from Translations to local dictionaries foreach(var t in category.Translations ?? new()) { _names[t.Language] = t.Info.Name; _descriptions[t.Language] = t.Info.Description; _technicalDetails[t.Language] = t.Info.TechnicalDetails?.ToList() ?? new(); } // Ensure supported cultures exist in dictionaries foreach (var lang in _languages.Keys) { if (!_names.ContainsKey(lang)) _names[lang] = ""; if (!_descriptions.ContainsKey(lang)) _descriptions[lang] = ""; if (!_technicalDetails.ContainsKey(lang)) _technicalDetails[lang] = new(); } category.Photos ??= Array.Empty(); SyncTranslations(); _editContext = new EditContext(category); } void SyncTranslations() { category.Translations = _languages.Keys.Select(lang => new CategoryTranslationVM { Language = lang, Info = new CategoryInfoVM { Name = _names.GetValueOrDefault(lang, ""), Description = _descriptions.GetValueOrDefault(lang, ""), TechnicalDetails = _technicalDetails.GetValueOrDefault(lang, new()) } }).ToList(); } async Task HandleSubmit() { SyncTranslations(); if (_editContext != null && _editContext.Validate()) { await OnSubmit(); } } void AddTechnicalDetail() { if (!_technicalDetails.ContainsKey(_activeLang)) { _technicalDetails[_activeLang] = new List(); } _technicalDetails[_activeLang].Add(new TechnicalDetailVM()); } void RemoveTechnicalDetail(TechnicalDetailVM item) { if (_technicalDetails.ContainsKey(_activeLang)) { _technicalDetails[_activeLang].Remove(item); } } async Task OnSubmit() { Console.WriteLine("OnSubmit started"); try { if (mediaComponent != null) { Console.WriteLine("Starting ProcessUploadsAsync"); var uploadResult = await mediaComponent.ProcessUploadsAsync(); Console.WriteLine("ProcessUploadsAsync finished successfully"); category.Photos = uploadResult.FinalUrls.ToArray(); } SyncTranslations(); if (string.IsNullOrEmpty(Id)) { Console.WriteLine("Creating category..."); await categoryAPIConsumer.CreateCategory(category); ToastService.ShowToast("Category created successfully!", ToastLevel.Success); ResetForm(); } else { Console.WriteLine("Updating category..."); await categoryAPIConsumer.UpdateCategory(category); ToastService.ShowToast("Category updated successfully!", ToastLevel.Success); } } catch (Exception ex) { Console.WriteLine($"Caught exception in OnSubmit: {ex.Message}"); ToastService.ShowToast($"Error: {ex.Message}", ToastLevel.Error); } } void ResetForm() { category = new(); _names.Clear(); _descriptions.Clear(); _technicalDetails.Clear(); foreach (var lang in _languages.Keys) { _names[lang] = ""; _descriptions[lang] = ""; _technicalDetails[lang] = new(); } SyncTranslations(); _editContext = new EditContext(category); if (mediaComponent != null) { mediaComponent.Clear(); } } }