Restructure the flat 7-item navbar into logical dropdown groups (Transactions, Receipts, Accounts), add a prominent Upload button, settings gear icon, breadcrumb navigation on 11 deep pages, and dashboard quick-action cards with hover effects. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
169 lines
7.6 KiB
Plaintext
169 lines
7.6 KiB
Plaintext
@page
|
|
@model MoneyMap.Pages.ReviewAISuggestionsWithProposalsModel
|
|
@{
|
|
ViewData["Title"] = "Review AI Suggestions";
|
|
ViewData["Breadcrumbs"] = new List<(string Label, string? Url)>
|
|
{
|
|
("Transactions", Url.Page("/Transactions")),
|
|
("AI Suggestions", Url.Page("/ReviewAISuggestions")),
|
|
("Review Proposals", null)
|
|
};
|
|
}
|
|
|
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
<h2>Review AI Suggestions</h2>
|
|
<div class="d-flex gap-2">
|
|
<form method="post" asp-page-handler="ApplyAll" class="d-inline" onsubmit="return confirm('Apply all high-confidence suggestions (≥80%)?');">
|
|
<button type="submit" class="btn btn-success">
|
|
Apply All High Confidence
|
|
</button>
|
|
</form>
|
|
<a asp-page="/ReviewAISuggestions" class="btn btn-outline-secondary">Back</a>
|
|
</div>
|
|
</div>
|
|
|
|
@if (!string.IsNullOrEmpty(Model.SuccessMessage))
|
|
{
|
|
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
|
@Model.SuccessMessage
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
</div>
|
|
}
|
|
|
|
@if (!string.IsNullOrEmpty(Model.ErrorMessage))
|
|
{
|
|
<div class="alert alert-danger alert-dismissible fade show" role="alert">
|
|
@Model.ErrorMessage
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
|
</div>
|
|
}
|
|
|
|
@if (!Model.Proposals.Any())
|
|
{
|
|
<div class="alert alert-info">
|
|
<h5>No suggestions remaining</h5>
|
|
<p class="mb-0">
|
|
All AI suggestions have been processed.
|
|
<a asp-page="/ReviewAISuggestions" class="alert-link">Generate more suggestions</a>
|
|
</p>
|
|
</div>
|
|
}
|
|
else
|
|
{
|
|
<div class="alert alert-info mb-3">
|
|
<strong>Review each suggestion below.</strong> You can accept the AI's proposal, reject it, or modify it before applying.
|
|
High confidence suggestions (≥80%) are generally very reliable.
|
|
</div>
|
|
|
|
@foreach (var item in Model.Proposals)
|
|
{
|
|
var confidenceClass = item.Proposal.Confidence >= 0.8m ? "success" :
|
|
item.Proposal.Confidence >= 0.6m ? "warning" : "danger";
|
|
var confidencePercent = (item.Proposal.Confidence * 100).ToString("F0");
|
|
|
|
<div class="card shadow-sm mb-3">
|
|
<div class="card-header d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<strong>@item.Transaction.Name</strong>
|
|
<span class="text-muted ms-2">@item.Transaction.Date.ToString("yyyy-MM-dd")</span>
|
|
<span class="badge bg-@confidenceClass ms-2">@confidencePercent% Confidence</span>
|
|
</div>
|
|
<span class="@(item.Transaction.Amount < 0 ? "text-danger" : "text-success") fw-bold">
|
|
@item.Transaction.Amount.ToString("C")
|
|
</span>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-md-6">
|
|
<h6>Transaction Details</h6>
|
|
<dl class="row small">
|
|
<dt class="col-sm-3">Memo:</dt>
|
|
<dd class="col-sm-9">@item.Transaction.Memo</dd>
|
|
|
|
<dt class="col-sm-3">Amount:</dt>
|
|
<dd class="col-sm-9">@item.Transaction.Amount.ToString("C")</dd>
|
|
</dl>
|
|
</div>
|
|
<div class="col-md-6">
|
|
<h6>AI Suggestion</h6>
|
|
<dl class="row small">
|
|
<dt class="col-sm-4">Category:</dt>
|
|
<dd class="col-sm-8"><span class="badge bg-primary">@item.Proposal.Category</span></dd>
|
|
|
|
@if (!string.IsNullOrWhiteSpace(item.Proposal.CanonicalMerchant))
|
|
{
|
|
<dt class="col-sm-4">Merchant:</dt>
|
|
<dd class="col-sm-8">@item.Proposal.CanonicalMerchant</dd>
|
|
}
|
|
|
|
@if (!string.IsNullOrWhiteSpace(item.Proposal.Pattern))
|
|
{
|
|
<dt class="col-sm-4">Pattern:</dt>
|
|
<dd class="col-sm-8"><code>@item.Proposal.Pattern</code></dd>
|
|
}
|
|
|
|
@if (!string.IsNullOrWhiteSpace(item.Proposal.Reasoning))
|
|
{
|
|
<dt class="col-sm-4">Reasoning:</dt>
|
|
<dd class="col-sm-8"><em>@item.Proposal.Reasoning</em></dd>
|
|
}
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
|
|
<hr />
|
|
|
|
<div class="d-flex gap-2 justify-content-end">
|
|
<form method="post" asp-page-handler="RejectProposal" class="d-inline">
|
|
<input type="hidden" name="transactionId" value="@item.Transaction.Id" />
|
|
<button type="submit" class="btn btn-outline-danger btn-sm">
|
|
Reject
|
|
</button>
|
|
</form>
|
|
|
|
<form method="post" asp-page-handler="ApplyProposal" class="d-inline">
|
|
<input type="hidden" name="transactionId" value="@item.Transaction.Id" />
|
|
<input type="hidden" name="category" value="@item.Proposal.Category" />
|
|
<input type="hidden" name="merchant" value="@item.Proposal.CanonicalMerchant" />
|
|
<input type="hidden" name="pattern" value="@item.Proposal.Pattern" />
|
|
<input type="hidden" name="confidence" value="@item.Proposal.Confidence" />
|
|
<input type="hidden" name="createRule" value="false" />
|
|
<button type="submit" class="btn btn-outline-primary btn-sm">
|
|
Apply (No Rule)
|
|
</button>
|
|
</form>
|
|
|
|
<form method="post" asp-page-handler="ApplyProposal" class="d-inline">
|
|
<input type="hidden" name="transactionId" value="@item.Transaction.Id" />
|
|
<input type="hidden" name="category" value="@item.Proposal.Category" />
|
|
<input type="hidden" name="merchant" value="@item.Proposal.CanonicalMerchant" />
|
|
<input type="hidden" name="pattern" value="@item.Proposal.Pattern" />
|
|
<input type="hidden" name="confidence" value="@item.Proposal.Confidence" />
|
|
<input type="hidden" name="createRule" value="true" />
|
|
<button type="submit" class="btn btn-primary btn-sm">
|
|
Apply + Create Rule
|
|
</button>
|
|
</form>
|
|
|
|
<a asp-page="/EditTransaction" asp-route-id="@item.Transaction.Id" class="btn btn-outline-secondary btn-sm">
|
|
Edit Manually
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
}
|
|
}
|
|
|
|
<div class="card shadow-sm mt-3">
|
|
<div class="card-header">
|
|
<strong>Understanding Confidence Scores</strong>
|
|
</div>
|
|
<div class="card-body">
|
|
<ul class="small mb-0">
|
|
<li><span class="badge bg-success">≥80%</span> - High confidence, very reliable</li>
|
|
<li><span class="badge bg-warning text-dark">60-79%</span> - Medium confidence, review recommended</li>
|
|
<li><span class="badge bg-danger"><60%</span> - Low confidence, manual review strongly recommended</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|