From 03ca74d85a981d4586684739122a203bd48d7b5c Mon Sep 17 00:00:00 2001 From: slinky55 Date: Sat, 25 Apr 2026 21:25:53 -0500 Subject: [PATCH] edited admin page, added request viewer --- Components/Pages/Home.Razor.cs | 37 ++++--- .../admin/{EditPages.razor => Admin.razor} | 63 +++++++++++- .../{EditPages.razor.cs => Admin.razor.cs} | 15 ++- .../{EditPages.razor.css => Admin.razor.css} | 98 +++++++++++++++++++ Models.cs | 41 +++++++- 5 files changed, 234 insertions(+), 20 deletions(-) rename Components/Pages/admin/{EditPages.razor => Admin.razor} (66%) rename Components/Pages/admin/{EditPages.razor.cs => Admin.razor.cs} (85%) rename Components/Pages/admin/{EditPages.razor.css => Admin.razor.css} (72%) diff --git a/Components/Pages/Home.Razor.cs b/Components/Pages/Home.Razor.cs index 49f494c..9fd0ed7 100644 --- a/Components/Pages/Home.Razor.cs +++ b/Components/Pages/Home.Razor.cs @@ -1,28 +1,37 @@ -using Microsoft.Extensions.Caching.Memory; +using Microsoft.AspNetCore.Components; +using Microsoft.Extensions.Caching.Memory; namespace ApplianceRepair.Components.Pages { - public partial class Home(IMemoryCache cache, HomePageReader homePageReader, ContentCardReader contentCardReader, BusinessConfigReader businessConfigReader) + public partial class Home(IMemoryCache cache, HomePageReader homePageReader, ContentCardReader contentCardReader, BusinessConfigReader businessConfigReader) : ComponentBase { private HomePageModel? Model; protected override async Task OnInitializedAsync() { - if (!cache.TryGetValue(nameof(HomePageModel), out Model)) - { - 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)) ?? []; + // TODO: Figure out a better cache system, needs to be marked dirty if admin makes a config change + //if (!cache.TryGetValue(nameof(HomePageModel), out Model)) + //{ + // 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)) ?? []; - Model = new HomePageModel(latestHomeRecord, businessConfig, servicesList, trustList); + // Model = new HomePageModel(latestHomeRecord, businessConfig, servicesList, trustList); - var cacheOptions = new MemoryCacheEntryOptions() - .SetAbsoluteExpiration(TimeSpan.FromHours(24)) - .SetSlidingExpiration(TimeSpan.FromHours(2)); + // var cacheOptions = new MemoryCacheEntryOptions() + // .SetAbsoluteExpiration(TimeSpan.FromHours(24)) + // .SetSlidingExpiration(TimeSpan.FromHours(2)); - cache.Set(nameof(HomePageModel), Model, cacheOptions); - } + // cache.Set(nameof(HomePageModel), Model, cacheOptions); + //} + + 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)) ?? []; + + Model = new HomePageModel(latestHomeRecord, businessConfig, servicesList, trustList); } } } diff --git a/Components/Pages/admin/EditPages.razor b/Components/Pages/admin/Admin.razor similarity index 66% rename from Components/Pages/admin/EditPages.razor rename to Components/Pages/admin/Admin.razor index 08efd5a..5fc0791 100644 --- a/Components/Pages/admin/EditPages.razor +++ b/Components/Pages/admin/Admin.razor @@ -1,10 +1,12 @@ -@page "/admin/editpages" +@page "/admin" +@using Microsoft.AspNetCore.Authorization +@attribute [Authorize] @rendermode InteractiveServer
-

Page Content Management

+

Admin Panel

Update your business details and home page content below.

@@ -32,6 +34,12 @@ Business Info
+
+ +
@if (CurrentTab == AdminTab.Home) @@ -136,6 +144,57 @@
} + else if (CurrentTab == AdminTab.Requests) + { +
+

📋 Service Requests

+ + @if (RepairRequests == null || !RepairRequests.Any()) + { +

No service requests found.

+ } + else + { +
+ @foreach (var request in RepairRequests) + { +
+
+ @request.RequestNumber + @request.CreatedAt.ToString("MMM dd, yyyy") +
+ +
+
+ Customer: + @request.Name +
+
+ Phone: + @request.FormattedPhoneNumber + + 📞 + +
+
+ Appliance: + @request.Brand @request.Type +
+
+ Issue Notes: +

@request.Notes

+
+
+ +
+ +
+
+ } +
+ } +
+ } } diff --git a/Components/Pages/admin/EditPages.razor.cs b/Components/Pages/admin/Admin.razor.cs similarity index 85% rename from Components/Pages/admin/EditPages.razor.cs rename to Components/Pages/admin/Admin.razor.cs index ad848a2..d21b581 100644 --- a/Components/Pages/admin/EditPages.razor.cs +++ b/Components/Pages/admin/Admin.razor.cs @@ -1,11 +1,14 @@ -namespace ApplianceRepair.Components.Pages.admin +using Microsoft.AspNetCore.Components; + +namespace ApplianceRepair.Components.Pages.admin { - public partial class EditPages(HomePageReader homePageReader, ContentCardReader contentCardReader, BusinessConfigReader businessConfigReader) + public partial class Admin(HomePageReader homePageReader, ContentCardReader contentCardReader, BusinessConfigReader businessConfigReader, RepairRequestReader repairRequestReader) : ComponentBase { public HomePageModel? HomePageModel; public BusinessInfoModel? BusinessInfo; + public List? RepairRequests; - private enum AdminTab { Home, About, BusinessInfo } + private enum AdminTab { Home, Requests, BusinessInfo } private AdminTab CurrentTab = AdminTab.Home; protected override async Task OnInitializedAsync() @@ -17,6 +20,12 @@ 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 RevertHomePageModel() diff --git a/Components/Pages/admin/EditPages.razor.css b/Components/Pages/admin/Admin.razor.css similarity index 72% rename from Components/Pages/admin/EditPages.razor.css rename to Components/Pages/admin/Admin.razor.css index 77a3f83..eddde49 100644 --- a/Components/Pages/admin/EditPages.razor.css +++ b/Components/Pages/admin/Admin.razor.css @@ -164,6 +164,75 @@ label { line-height: 1.5; } +.requests-list { + display: flex; + flex-direction: column; + gap: 1.5rem; + padding-top: 1rem; +} + +.request-card { + display: grid; + grid-template-columns: 150px 1fr 180px; + align-items: center; + text-align: left; + padding: 20px; +} + +.request-id { + font-weight: 700; + color: #2a5298; + font-size: 1.1rem; +} + +.request-date { + font-size: 0.85rem; + color: #888; +} + +.request-body { + border-left: 1px solid #eee; + border-right: 1px solid #eee; + padding: 0 20px; +} + +.info-row { + margin-bottom: 5px; + font-size: 0.9rem; +} + +.info-row .label { + display: inline; + text-transform: none; + margin: 0; + color: #666; + font-weight: 600; +} + +.info-notes { + margin-top: 10px; + font-size: 0.85rem; + font-style: italic; + color: #444; +} + +.phone-link { + color: #2a5298; + text-decoration: none; + font-weight: 600; + transition: color 0.2s; +} + +.phone-link:hover { + color: #4CAF50; /* Changes to green on hover to signify 'Call' */ + text-decoration: underline; +} + +.request-actions { + display: flex; + justify-content: flex-end; +} + .btn-save { background: #4CAF50; color: white; @@ -182,6 +251,23 @@ label { background: #43a047; } +.btn-small { + padding: 8px 20px; + border-radius: 20px; + font-size: 0.8rem; + font-weight: 600; + cursor: pointer; + border: 1px solid #2a5298; + background: transparent; + color: #2a5298; + transition: all 0.2s ease; +} + +.btn-small:hover { + background: #2a5298; + color: white; +} + .btn-revert { background: transparent; color: #666; @@ -237,4 +323,16 @@ label { justify-content: center; row-gap: 2rem; } + + .request-card { + grid-template-columns: 1fr; + gap: 15px; + } + + .request-body { + border: none; + padding: 10px 0; + border-top: 1px solid #eee; + border-bottom: 1px solid #eee; + } } \ No newline at end of file diff --git a/Models.cs b/Models.cs index 5faae83..1d67b32 100644 --- a/Models.cs +++ b/Models.cs @@ -123,7 +123,46 @@ } } - public class RepairRequestModel : RepairRequestRecord { } + public class RepairRequestModel : RepairRequestRecord + { + public string FormattedPhoneNumber + { + get + { + if (!string.IsNullOrEmpty(Phone)) + { + return $"({Phone[0..3]})-{Phone[3..6]}-{Phone[6..10]}"; + } + + return ""; + } + } + + public string PhoneNumberCallLink + { + get + { + if (!string.IsNullOrEmpty(Phone)) + { + return $"tel:{Phone}"; + } + + return ""; + } + } + + public RepairRequestModel() { } + + public RepairRequestModel(RepairRequestRecord record) + { + RequestNumber = record.RequestNumber; + Type = record.Type; + Brand = record.Brand; + Notes = record.Notes; + Phone = record.Phone; + Name = record.Name; + } + } public class BusinessInfoModel : BusinessConfigRecord {