203 lines
11 KiB
Plaintext
203 lines
11 KiB
Plaintext
@page "/admin"
|
|
@using Microsoft.AspNetCore.Authorization
|
|
@attribute [Authorize(Roles = "Admin")]
|
|
@rendermode InteractiveServer
|
|
|
|
<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">
|
|
<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">
|
|
<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="() => {}">View Images</button>
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|
|
}
|
|
</div>
|
|
</div>
|