@model AdminFeatureRequestIndexViewModel @using Microsoft.AspNetCore.Html @using System.Text.Encodings.Web @{ ViewData["Title"] = "Feature Requests"; ViewData["ShellClass"] = "plotline-shell-wide feature-request-admin-page"; }

Admin

Feature Requests

Admin dashboard
@if (TempData["AdminMessage"] is string adminMessage) {
@adminMessage
}
Reset
@if (!Model.Requests.Any()) {

No feature requests found

New suggestions will appear here once users submit them.

} else {
@foreach (var request in Model.Requests) { }
Title User Status Area Importance Created Latest Activity Conversation Messages Latest message
@request.Title @(request.UserDisplayName ?? request.UserEmail) @StatusBadge(request.Status) @(request.AppArea ?? "Not set") @(request.Importance ?? "Not set") @FormatDate(request.CreatedUtc) @FormatNullableDate(request.LatestActivityUtc) @ConversationBadge(request.ConversationState) @request.MessageCount.ToString("N0") @Preview(request.LatestMessagePreview) Open
} @functions { private static string FormatDate(DateTime value) => value.ToLocalTime().ToString("yyyy-MM-dd HH:mm"); private static string FormatNullableDate(DateTime? value) => value.HasValue ? FormatDate(value.Value) : "None yet"; private static string Preview(string? value) { if (string.IsNullOrWhiteSpace(value)) { return "No messages yet"; } var cleaned = value.ReplaceLineEndings(" ").Trim(); return cleaned.Length <= 90 ? cleaned : $"{cleaned[..90]}..."; } private static IHtmlContent StatusBadge(string status) { var css = status switch { FeatureRequestStatuses.New => "text-bg-primary", FeatureRequestStatuses.NeedsDetail => "text-bg-warning", FeatureRequestStatuses.UnderReview => "text-bg-info", FeatureRequestStatuses.Candidate => "text-bg-secondary", FeatureRequestStatuses.Planned => "text-bg-success", FeatureRequestStatuses.InProgress => "text-bg-success", FeatureRequestStatuses.Shipped => "text-bg-dark", FeatureRequestStatuses.NotPlanned => "text-bg-light", _ => "text-bg-secondary" }; return new HtmlString($"{HtmlEncoder.Default.Encode(status)}"); } private static IHtmlContent ConversationBadge(string state) { var css = state switch { FeatureRequestConversationStates.WaitingForAdminReply => "text-bg-danger", FeatureRequestConversationStates.WaitingForUserReply => "text-bg-warning", _ => "text-bg-secondary" }; return new HtmlString($"{HtmlEncoder.Default.Encode(state)}"); } }