2026-04-25 21:25:53 -05:00
|
|
|
|
using Microsoft.AspNetCore.Components;
|
2026-05-01 19:48:34 -05:00
|
|
|
|
using Microsoft.JSInterop;
|
2026-04-25 21:25:53 -05:00
|
|
|
|
|
|
|
|
|
|
namespace ApplianceRepair.Components.Pages.admin
|
2026-04-22 20:09:26 -05:00
|
|
|
|
{
|
2026-05-01 19:48:34 -05:00
|
|
|
|
public partial class Admin(HomePageReader homePageReader, ContentCardReader contentCardReader, BusinessConfigReader businessConfigReader, RepairRequestReader repairRequestReader, RepairRequestMediaReader repairRequestMediaReader) : ComponentBase
|
2026-04-22 20:09:26 -05:00
|
|
|
|
{
|
|
|
|
|
|
public HomePageModel? HomePageModel;
|
2026-04-25 13:14:08 -05:00
|
|
|
|
public BusinessInfoModel? BusinessInfo;
|
2026-04-25 21:25:53 -05:00
|
|
|
|
public List<RepairRequestModel>? RepairRequests;
|
2026-04-22 20:09:26 -05:00
|
|
|
|
|
2026-05-01 19:48:34 -05:00
|
|
|
|
public List<RepairRequestMediaRecord>? SelectedRequestMedia;
|
|
|
|
|
|
public int SelectedRequestMediaImageIndex = 0;
|
|
|
|
|
|
|
2026-04-25 21:25:53 -05:00
|
|
|
|
private enum AdminTab { Home, Requests, BusinessInfo }
|
2026-04-25 13:14:08 -05:00
|
|
|
|
private AdminTab CurrentTab = AdminTab.Home;
|
2026-04-22 20:09:26 -05:00
|
|
|
|
|
2026-04-25 13:14:08 -05:00
|
|
|
|
protected override async Task OnInitializedAsync()
|
2026-04-22 20:09:26 -05:00
|
|
|
|
{
|
2026-04-25 13:14:08 -05:00
|
|
|
|
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);
|
2026-04-25 21:25:53 -05:00
|
|
|
|
|
|
|
|
|
|
RepairRequests = [];
|
|
|
|
|
|
(await repairRequestReader.ReadAll()).ForEach((record) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
RepairRequests.Add(new RepairRequestModel(record));
|
|
|
|
|
|
});
|
2026-04-22 20:09:26 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-01 19:48:34 -05:00
|
|
|
|
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));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-22 20:09:26 -05:00
|
|
|
|
private async void RevertHomePageModel()
|
|
|
|
|
|
{
|
2026-04-25 13:14:08 -05:00
|
|
|
|
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);
|
2026-04-22 20:09:26 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async void SaveHomePageModel()
|
|
|
|
|
|
{
|
|
|
|
|
|
HomePageModel.UpdatedAt = DateTime.Now;
|
2026-04-25 13:14:08 -05:00
|
|
|
|
await homePageReader.UpdateRecord(HomePageModel);
|
2026-04-22 20:09:26 -05:00
|
|
|
|
|
|
|
|
|
|
foreach (var card in HomePageModel.ServicesCards)
|
|
|
|
|
|
{
|
2026-04-25 13:14:08 -05:00
|
|
|
|
card.UpdatedAt = DateTime.Now;
|
2026-04-22 20:09:26 -05:00
|
|
|
|
await contentCardReader.UpdateRecord(card);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (var card in HomePageModel.TrustCards)
|
|
|
|
|
|
{
|
2026-04-25 13:14:08 -05:00
|
|
|
|
card.UpdatedAt = DateTime.Now;
|
2026-04-22 20:09:26 -05:00
|
|
|
|
await contentCardReader.UpdateRecord(card);
|
|
|
|
|
|
}
|
2026-04-25 13:14:08 -05:00
|
|
|
|
}
|
2026-04-22 20:09:26 -05:00
|
|
|
|
|
2026-04-25 13:14:08 -05:00
|
|
|
|
private async void SaveBusinessInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
BusinessInfo.UpdatedAt = DateTime.Now;
|
|
|
|
|
|
await businessConfigReader.UpdateRecord(BusinessInfo);
|
2026-04-22 20:09:26 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-05-01 19:48:34 -05:00
|
|
|
|
private async Task DeleteContentCard(ContentCardModel card)
|
|
|
|
|
|
{
|
|
|
|
|
|
await contentCardReader.DeleteRecord(card);
|
|
|
|
|
|
RefreshContentCards();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-22 20:09:26 -05:00
|
|
|
|
private void AddServiceCard()
|
|
|
|
|
|
{
|
|
|
|
|
|
HomePageModel?.ServicesCards.Add(new ContentCardModel() {
|
|
|
|
|
|
CreatedAt = DateTime.Now,
|
|
|
|
|
|
UpdatedAt = DateTime.Now,
|
|
|
|
|
|
BelongsToPage = HomePageModel.PageName,
|
2026-04-25 13:14:08 -05:00
|
|
|
|
Group = HomePageModel.ContentCardTypes.Services.ToString(),
|
2026-04-22 20:09:26 -05:00
|
|
|
|
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"
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2026-05-01 19:48:34 -05:00
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
2026-04-22 20:09:26 -05:00
|
|
|
|
}
|
|
|
|
|
|
}
|