Files
2026-05-01 19:48:34 -05:00

238 lines
12 KiB
Plaintext

@page "/admin"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin")]
@rendermode InteractiveServer
@inject IJSRuntime JS
<dialog id="imageViewerModal" class="image-viewer-modal">
@if (SelectedRequestMedia?.Any() == true)
{
<div class="image-viewer-modal-header">
<span>Request: @SelectedRequestMedia[0].RequestNumber</span>
<button class="close-btn" @onclick="CloseImageViewer">&times;</button>
</div>
}
<div class="image-viewer-carousel-container">
@if (SelectedRequestMedia?.Any() == true)
{
<button class="image-viewer-nav-btn" @onclick="ImageViewerModal_PrevImage">&#10094;</button>
<div class="image-viewer-image-stage">
<img src="@GetWebPath(SelectedRequestMedia[SelectedRequestMediaImageIndex].MediaPath)" alt="Appliance repair evidence" />
<div class="image-viewer-image-counter">
Image @(SelectedRequestMediaImageIndex + 1) of @SelectedRequestMedia.Count
</div>
</div>
<button class="image-viewer-nav-btn" @onclick="ImageViewerModal_NextImage">&#10095;</button>
}
else
{
<div class="image-viewer-no-images">No images found for this request.</div>
}
</div>
</dialog>
<div class="admin-wrapper">
<div class="container">
<header class="admin-header">
<h1>Admin Panel</h1>
<p>Update your business details and home page content below.</p>
</header>
@if (HomePageModel == null)
{
<div class="loading-state">
<div class="spinner"></div>
<p>Loading your settings...</p>
</div>
}
else
{
<div class="admin-wrapper">
<div class="container">
<header class="admin-header">
<div class="tab-container">
<button class="tab-btn @(CurrentTab == AdminTab.Home ? "active" : "")"
@onclick="() => CurrentTab = AdminTab.Home">
Home Page
</button>
</div>
<div class="tab-container">
<button class="tab-btn @(CurrentTab == AdminTab.BusinessInfo ? "active" : "")"
@onclick="() => CurrentTab = AdminTab.BusinessInfo">
Business Info
</button>
</div>
<div class="tab-container">
<button class="tab-btn @(CurrentTab == AdminTab.Requests ? "active" : "")"
@onclick="() => CurrentTab = AdminTab.Requests">
Requests
</button>
</div>
</header>
@if (CurrentTab == AdminTab.Home)
{
<EditForm FormName="HomePageForm" Model="HomePageModel" OnValidSubmit="SaveHomePageModel" On class="admin-form">
<DataAnnotationsValidator />
<div class="form-section text-center">
<h3><i class="icon">🏠</i> Hero Section</h3>
<div class="input-group">
<label>Main Headline</label>
<InputText @bind-Value="HomePageModel.HeaderLine1" class="form-input" />
</div>
<div class="input-group">
<label>Highlighted Text (Green)</label>
<InputText @bind-Value="HomePageModel.HeaderLine2" class="form-input" />
</div>
<div class="input-group">
<label>Description Text</label>
<InputTextArea @bind-Value="HomePageModel.HeaderText" class="form-input" rows="3" />
</div>
</div>
<div class="form-section text-center">
<h3><i class="icon">🛠️</i> Services</h3>
<div class="cards-grid">
@foreach (var card in HomePageModel.ServicesCards)
{
<div class="content-card">
<button class="close-btn" @onclick="async () => await DeleteContentCard(card)">&times;</button>
<div class="input-group">
<label>Header</label>
<InputTextArea @bind-Value="card.Header" class="form-input" />
</div>
<div class="input-group">
<label>Text</label>
<InputTextArea @bind-Value="card.Text" class="form-input" />
</div>
</div>
}
</div>
<button type="button" class="btn btn-save" @onclick="AddServiceCard">Add Service Card</button>
</div>
<div class="form-section text-center">
<h3><i class="icon">🛡️</i> Trust</h3>
<div class="cards-grid">
@foreach (var card in HomePageModel.TrustCards)
{
<div class="content-card">
<button class="close-btn" @onclick="async () => await DeleteContentCard(card)">&times;</button>
<div class="input-group">
<label>Header</label>
<InputTextArea @bind-Value="card.Header" class="form-input" />
</div>
<div class="input-group">
<label>Text</label>
<InputTextArea @bind-Value="card.Text" class="form-input" />
</div>
</div>
}
</div>
<button type="button" class="btn btn-save" @onclick="AddTrustCard">Add Trust Card</button>
</div>
<div class="admin-footer">
<button type="submit" class="btn btn-save">Save</button>
<button type="button" class="btn btn-revert" @onclick="RevertHomePageModel">Revert</button>
</div>
</EditForm>
}
else if (CurrentTab == AdminTab.BusinessInfo)
{
<EditForm FormName="BusinessInfoForm" Model="BusinessInfo" OnValidSubmit="SaveBusinessInfo" On class="admin-form">
<DataAnnotationsValidator />
<div class="form-section text-center">
<h3><i class="icon">🏠</i> Business Info</h3>
<div class="input-group">
<label>Business Name</label>
<InputText @bind-Value="BusinessInfo.Name" class="form-input" />
</div>
<div class="input-group">
<label>Phone Number</label>
<InputText @bind-Value="BusinessInfo.PhoneNumber" class="form-input" />
</div>
<div class="input-group">
<label>Support Email</label>
<InputText @bind-Value="BusinessInfo.SupportEmail" class="form-input" />
</div>
</div>
<div class="admin-footer">
<button type="submit" class="btn btn-save">Save</button>
<button type="button" class="btn btn-revert" @onclick="RevertBusinessInfo">Revert</button>
</div>
</EditForm>
}
else if (CurrentTab == AdminTab.Requests)
{
<div class="form-section">
<h3><i class="icon">📋</i> Service Requests</h3>
@if (RepairRequests == null || !RepairRequests.Any())
{
<p class="text-muted">No service requests found.</p>
}
else
{
<div class="requests-list">
@foreach (var request in RepairRequests)
{
<div class="content-card request-card">
<div class="request-header">
<span class="request-id">@request.RequestNumber</span>
<span class="request-date">@request.CreatedAt.ToString("MMM dd, yyyy")</span>
</div>
<div class="request-body">
<div class="info-row">
<span class="label">Customer:</span>
<span class="value">@request.Name</span>
</div>
<div class="info-row">
<span class="label">Phone:</span>
<span class="value">@request.FormattedPhoneNumber</span>
<a href="tel:@request.Phone" class="phone-link">
<i class="icon">📞</i>
</a>
</div>
<div class="info-row">
<span class="label">Appliance:</span>
<span class="value"><strong>@request.Brand</strong> @request.Type</span>
</div>
<div class="info-notes">
<span class="label">Issue Notes:</span>
<p>@request.Notes</p>
</div>
</div>
<div class="request-actions">
<button class="btn-small btn-view" @onclick="async () => await ViewRequestImages(request)">View Images</button>
</div>
</div>
}
</div>
}
</div>
}
</div>
</div>
}
</div>
</div>