using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; namespace ApplianceRepair.Components.Pages.admin { public partial class Admin(HomePageReader homePageReader, ContentCardReader contentCardReader, BusinessConfigReader businessConfigReader, RepairRequestReader repairRequestReader, RepairRequestMediaReader repairRequestMediaReader) : ComponentBase { public HomePageModel? HomePageModel; public BusinessInfoModel? BusinessInfo; public List? RepairRequests; public List? SelectedRequestMedia; public int SelectedRequestMediaImageIndex = 0; private enum AdminTab { Home, Requests, BusinessInfo } private AdminTab CurrentTab = AdminTab.Home; protected override async Task OnInitializedAsync() { var businessConfig = await businessConfigReader.ReadLatestRecord() ?? Defaults.DefaultBusinessConfig; var latestHomeRecord = await homePageReader.ReadLatestRecord() ?? Defaults.DefaultHomePageContent; var servicesList = await contentCardReader.ReadAllByPageAndGroup(HomePageModel.PageName, nameof(HomePageModel.ContentCardTypes.Services)) ?? []; var trustList = await contentCardReader.ReadAllByPageAndGroup(HomePageModel.PageName, nameof(HomePageModel.ContentCardTypes.Trust)) ?? []; BusinessInfo = new BusinessInfoModel(businessConfig); HomePageModel = new HomePageModel(latestHomeRecord, businessConfig, servicesList, trustList); RepairRequests = []; (await repairRequestReader.ReadAll()).ForEach((record) => { RepairRequests.Add(new RepairRequestModel(record)); }); } private async void RefreshContentCards() { if (HomePageModel == null) { return; } var servicesList = await contentCardReader.ReadAllByPageAndGroup(HomePageModel.PageName, nameof(HomePageModel.ContentCardTypes.Services)) ?? []; var trustList = await contentCardReader.ReadAllByPageAndGroup(HomePageModel.PageName, nameof(HomePageModel.ContentCardTypes.Trust)) ?? []; HomePageModel.ServicesCards.Clear(); foreach (var card in servicesList) { HomePageModel.ServicesCards.Add(new ContentCardModel(card)); } HomePageModel.TrustCards.Clear(); foreach (var card in trustList) { HomePageModel.TrustCards.Add(new ContentCardModel(card)); } } private async void RevertHomePageModel() { var businessConfig = await businessConfigReader.ReadLatestRecord() ?? Defaults.DefaultBusinessConfig; var latestHomeRecord = await homePageReader.ReadLatestRecord() ?? Defaults.DefaultHomePageContent; var servicesList = await contentCardReader.ReadAllByPageAndGroup(HomePageModel.PageName, nameof(HomePageModel.ContentCardTypes.Services)) ?? []; var trustList = await contentCardReader.ReadAllByPageAndGroup(HomePageModel.PageName, nameof(HomePageModel.ContentCardTypes.Trust)) ?? []; BusinessInfo = new BusinessInfoModel(businessConfig); HomePageModel = new HomePageModel(latestHomeRecord, businessConfig, servicesList, trustList); } private async void RevertBusinessInfo() { var businessConfig = await businessConfigReader.ReadLatestRecord() ?? Defaults.DefaultBusinessConfig; BusinessInfo = new BusinessInfoModel(businessConfig); } private async void SaveHomePageModel() { HomePageModel.UpdatedAt = DateTime.Now; await homePageReader.UpdateRecord(HomePageModel); foreach (var card in HomePageModel.ServicesCards) { card.UpdatedAt = DateTime.Now; await contentCardReader.UpdateRecord(card); } foreach (var card in HomePageModel.TrustCards) { card.UpdatedAt = DateTime.Now; await contentCardReader.UpdateRecord(card); } } private async void SaveBusinessInfo() { BusinessInfo.UpdatedAt = DateTime.Now; await businessConfigReader.UpdateRecord(BusinessInfo); } private async Task DeleteContentCard(ContentCardModel card) { await contentCardReader.DeleteRecord(card); RefreshContentCards(); } private void AddServiceCard() { HomePageModel?.ServicesCards.Add(new ContentCardModel() { CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now, BelongsToPage = HomePageModel.PageName, Group = HomePageModel.ContentCardTypes.Services.ToString(), Header = "Service Name", Text = "Short Description" }); } private async void AddTrustCard() { HomePageModel?.TrustCards.Add(new ContentCardModel() { CreatedAt = DateTime.Now, UpdatedAt = DateTime.Now, BelongsToPage = HomePageModel.PageName, Group = HomePageModel.ContentCardTypes.Trust.ToString(), Header = "Header", Text = "Short Description" }); } private async Task ViewRequestImages(RepairRequestModel request) { if (!string.IsNullOrEmpty(request.RequestNumber)) { SelectedRequestMedia = await repairRequestMediaReader.ReadAllByRequestNumber(request.RequestNumber); SelectedRequestMediaImageIndex = 0; await JS.InvokeVoidAsync("eval", $"document.getElementById('imageViewerModal').showModal()"); } } private async Task CloseImageViewer() { await JS.InvokeVoidAsync("eval", $"document.getElementById('imageViewerModal').close()"); SelectedRequestMedia = []; } private async Task ImageViewerModal_PrevImage() { if (SelectedRequestMedia == null) return; SelectedRequestMediaImageIndex++; if (SelectedRequestMediaImageIndex >= SelectedRequestMedia.Count()) { SelectedRequestMediaImageIndex = 0; } } private async Task ImageViewerModal_NextImage() { if (SelectedRequestMedia == null) return; SelectedRequestMediaImageIndex--; if (SelectedRequestMediaImageIndex < 0) { SelectedRequestMediaImageIndex = SelectedRequestMedia.Count() - 1; } } private string GetWebPath(string fullPath = "") { if (string.IsNullOrEmpty(fullPath)) return ""; var marker = "wwwroot"; var index = fullPath.IndexOf(marker); if (index != -1) { // Returns "/uploads/filename.jpg" return fullPath.Substring(index + marker.Length).Replace('\\', '/'); } return fullPath; } } }