littleshop/LittleShop/Areas/Admin/Views/Reviews/Index.cshtml
SysAdmin e1b377a042 Initial commit of LittleShop project (excluding large archives)
- BTCPay Server integration
- TeleBot Telegram bot
- Review system
- Admin area
- Docker deployment configuration

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 15:07:38 +01:00

136 lines
8.0 KiB
Plaintext

@model IEnumerable<LittleShop.DTOs.ReviewDto>
@{
ViewData["Title"] = "Reviews";
}
<div class="container-fluid">
<div class="row">
<div class="col-12">
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold text-primary">
<i class="fas fa-star me-2"></i>Customer Reviews
</h6>
<span class="badge badge-warning">@Model.Count() Pending Approval</span>
</div>
<div class="card-body">
@if (TempData["SuccessMessage"] != null)
{
<div class="alert alert-success alert-dismissible fade show" role="alert">
@TempData["SuccessMessage"]
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@if (TempData["ErrorMessage"] != null)
{
<div class="alert alert-danger alert-dismissible fade show" role="alert">
@TempData["ErrorMessage"]
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
</div>
}
@if (!Model.Any())
{
<div class="text-center py-4">
<div class="mb-3">
<i class="fas fa-star fa-3x text-muted"></i>
</div>
<h5 class="text-muted">No pending reviews</h5>
<p class="text-muted">New customer reviews will appear here for approval.</p>
</div>
}
else
{
<div class="table-responsive">
<table class="table table-hover">
<thead class="table-light">
<tr>
<th>Product</th>
<th>Customer</th>
<th>Rating</th>
<th>Review</th>
<th>Order ID</th>
<th>Date</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach (var review in Model.OrderByDescending(r => r.CreatedAt))
{
<tr>
<td>
<strong>@review.ProductName</strong>
</td>
<td>
<span class="text-muted">@review.CustomerDisplayName</span>
@if (review.IsVerifiedPurchase)
{
<i class="fas fa-check-circle text-success ms-1" title="Verified Purchase"></i>
}
</td>
<td>
<div class="d-flex align-items-center">
@for (int i = 1; i <= 5; i++)
{
<i class="fas fa-star @(i <= review.Rating ? "text-warning" : "text-muted")"></i>
}
<span class="ms-2 text-muted">(@review.Rating/5)</span>
</div>
</td>
<td>
@if (!string.IsNullOrEmpty(review.Title))
{
<strong class="d-block">@review.Title</strong>
}
@if (!string.IsNullOrEmpty(review.Comment))
{
<span class="text-muted">
@(review.Comment.Length > 100 ? review.Comment.Substring(0, 100) + "..." : review.Comment)
</span>
}
</td>
<td>
<small class="text-monospace">@review.OrderId.ToString().Substring(0, 8)...</small>
</td>
<td>
<small>@review.CreatedAt.ToString("MMM dd, yyyy")</small>
</td>
<td>
<div class="btn-group" role="group">
<a asp-action="Details" asp-route-id="@review.Id"
class="btn btn-sm btn-outline-primary" title="View Details">
<i class="fas fa-eye"></i>
</a>
@if (!review.IsApproved)
{
<form asp-action="Approve" asp-route-id="@review.Id" method="post" class="d-inline">
<button type="submit" class="btn btn-sm btn-success"
onclick="return confirm('Approve this review?')" title="Approve">
<i class="fas fa-check"></i>
</button>
</form>
}
<a asp-action="Edit" asp-route-id="@review.Id"
class="btn btn-sm btn-outline-secondary" title="Edit">
<i class="fas fa-edit"></i>
</a>
<form asp-action="Delete" asp-route-id="@review.Id" method="post" class="d-inline">
<button type="submit" class="btn btn-sm btn-outline-danger"
onclick="return confirm('Delete this review?')" title="Delete">
<i class="fas fa-trash"></i>
</button>
</form>
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
}
</div>
</div>
</div>
</div>
</div>