@page "/dashboard" @attribute [Authorize] @rendermode InteractiveServer @inject ICVCheckService CVCheckService @inject NavigationManager NavigationManager @inject AuthenticationStateProvider AuthenticationStateProvider @inject ILogger Logger @inject IJSRuntime JSRuntime Dashboard - TrueCV

Dashboard

View and manage your CV verification checks

New Check
@if (_isLoading) {
Loading...

Loading your checks...

} else if (!string.IsNullOrEmpty(_errorMessage)) { } else if (_checks.Count == 0) {

No CV Checks Yet

Start by uploading your first CV for verification

Upload CV
} else {

@_checks.Count

Total Checks

@_checks.Count(c => c.Status == "Completed")

Completed

@_checks.Count(c => c.Status is "Pending" or "Processing")

In Progress
Recent CV Checks
@foreach (var check in _checks) { }
File Name Date Status Score Actions
@check.OriginalFileName
@check.CreatedAt.ToString("dd MMM yyyy HH:mm") @switch (check.Status) { case "Completed": Completed break; case "Processing": Processing break; case "Pending": Pending break; case "Failed": Failed break; default: @check.Status break; } @if (check.VeracityScore.HasValue) { @check.VeracityScore } else { - } @if (check.Status == "Completed") { View Report } else if (check.Status is "Pending" or "Processing") { } else { Retry }
}
@code { private List _checks = []; private bool _isLoading = true; private bool _isExporting; private string? _errorMessage; private Guid _userId; protected override async Task OnInitializedAsync() { await LoadChecks(); } private async Task LoadChecks() { _isLoading = true; _errorMessage = null; try { var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); var userIdClaim = authState.User.FindFirst(ClaimTypes.NameIdentifier)?.Value; if (string.IsNullOrEmpty(userIdClaim) || !Guid.TryParse(userIdClaim, out _userId)) { _errorMessage = "Unable to identify user. Please log in again."; return; } _checks = await CVCheckService.GetUserChecksAsync(_userId); } catch (Exception ex) { Logger.LogError(ex, "Error loading CV checks"); _errorMessage = "An error occurred while loading checks. Please try again."; } finally { _isLoading = false; } } private void ViewReport(CVCheckDto check) { if (check.Status == "Completed") { NavigationManager.NavigateTo($"/report/{check.Id}"); } } private static string GetScoreBadgeClass(int score) { return score switch { > 70 => "bg-success", >= 50 => "bg-warning text-dark", _ => "bg-danger" }; } private async Task ExportToCsv() { if (_isExporting) return; _isExporting = true; StateHasChanged(); try { var csvBuilder = new System.Text.StringBuilder(); csvBuilder.AppendLine("Candidate,Upload Date,Score,Score Label,Employers Verified,Employers Unverified,Gap Months,Overlap Months,Critical Flags,Warning Flags"); foreach (var check in _checks) { if (check.Status != "Completed") continue; var report = await CVCheckService.GetReportAsync(check.Id, _userId); if (report is null) continue; int verifiedCount = 0; int unverifiedCount = 0; foreach (var v in report.EmploymentVerifications) { if (v.IsVerified) verifiedCount++; else unverifiedCount++; } int criticalFlags = 0; int warningFlags = 0; foreach (var f in report.Flags) { if (f.Severity == "Critical") criticalFlags++; else if (f.Severity == "Warning") warningFlags++; } var candidateName = EscapeCsv(Path.GetFileNameWithoutExtension(check.OriginalFileName)); var uploadDate = check.CreatedAt.ToString("yyyy-MM-dd HH:mm"); csvBuilder.AppendLine(candidateName + "," + uploadDate + "," + report.OverallScore + "," + EscapeCsv(report.ScoreLabel) + "," + verifiedCount + "," + unverifiedCount + "," + report.TimelineAnalysis.TotalGapMonths + "," + report.TimelineAnalysis.TotalOverlapMonths + "," + criticalFlags + "," + warningFlags); } var fileName = "TrueCV_Report_Summary_" + DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".csv"; await JSRuntime.InvokeVoidAsync("downloadCsvFile", fileName, csvBuilder.ToString()); } catch (Exception ex) { Logger.LogError(ex, "Error exporting CSV"); } finally { _isExporting = false; StateHasChanged(); } } private static string EscapeCsv(string? field) { if (string.IsNullOrEmpty(field)) return ""; if (field.Contains(",") || field.Contains("\"") || field.Contains("\n")) { return "\"" + field.Replace("\"", "\"\"") + "\""; } return field; } private bool HasCompletedChecks() { foreach (var c in _checks) { if (c.Status == "Completed") return true; } return false; } }