@using TrueCV.Application.Models
@if (Employment is null || Employment.Count == 0) {
No employment timeline data available
} else {
Employment @if (Analysis?.Gaps?.Count > 0) { Gap (@Analysis.TotalGapMonths months total) } @if (Analysis?.Overlaps?.Count > 0) { Overlap (@Analysis.TotalOverlapMonths months total) }
@{ var timelineData = GetTimelineData(); var minDate = timelineData.MinDate; var maxDate = timelineData.MaxDate; var totalMonths = GetMonthsDifference(minDate, maxDate); }
@foreach (var year in GetYearMarkers(minDate, maxDate)) { var position = GetPositionPercentage(year, minDate, totalMonths);
@year.Year
}
@foreach (var entry in Employment.OrderBy(e => e.StartDate ?? DateOnly.MaxValue)) { var startDate = entry.StartDate ?? minDate; var endDate = entry.EndDate ?? (entry.IsCurrent ? DateOnly.FromDateTime(DateTime.Today) : maxDate); var left = GetPositionPercentage(startDate, minDate, totalMonths); var width = GetWidthPercentage(startDate, endDate, totalMonths);
@entry.CompanyName
}
@if (Analysis?.Gaps?.Count > 0) {
@foreach (var gap in Analysis.Gaps) { var left = GetPositionPercentage(gap.StartDate, minDate, totalMonths); var width = GetWidthPercentage(gap.StartDate, gap.EndDate, totalMonths);
}
} @if (Analysis?.Overlaps?.Count > 0) {
@foreach (var overlap in Analysis.Overlaps) { var left = GetPositionPercentage(overlap.OverlapStart, minDate, totalMonths); var width = GetWidthPercentage(overlap.OverlapStart, overlap.OverlapEnd, totalMonths);
}
}
@if (Analysis is not null && (Analysis.Gaps.Count > 0 || Analysis.Overlaps.Count > 0)) {
@if (Analysis.Gaps.Count > 0) {
Employment Gaps
    @foreach (var gap in Analysis.Gaps) {
  • @gap.Months months gap from @gap.StartDate.ToString("MMM yyyy") to @gap.EndDate.ToString("MMM yyyy")
  • }
} @if (Analysis.Overlaps.Count > 0) {
Employment Overlaps
    @foreach (var overlap in Analysis.Overlaps) {
  • @overlap.Months months overlap between @overlap.Company1 and @overlap.Company2 (@overlap.OverlapStart.ToString("MMM yyyy") - @overlap.OverlapEnd.ToString("MMM yyyy"))
  • }
}
} }
@code { [Parameter] public TimelineAnalysisResult? Analysis { get; set; } [Parameter] public List? Employment { get; set; } private (DateOnly MinDate, DateOnly MaxDate) GetTimelineData() { if (Employment is null || Employment.Count == 0) { var today = DateOnly.FromDateTime(DateTime.Today); return (today.AddYears(-5), today); } var dates = new List(); foreach (var entry in Employment) { if (entry.StartDate.HasValue) { dates.Add(entry.StartDate.Value); } if (entry.EndDate.HasValue) { dates.Add(entry.EndDate.Value); } else if (entry.IsCurrent) { dates.Add(DateOnly.FromDateTime(DateTime.Today)); } } if (dates.Count == 0) { var today = DateOnly.FromDateTime(DateTime.Today); return (today.AddYears(-5), today); } var minDate = dates.Min().AddMonths(-3); var maxDate = dates.Max().AddMonths(3); return (minDate, maxDate); } private static int GetMonthsDifference(DateOnly start, DateOnly end) { return ((end.Year - start.Year) * 12) + end.Month - start.Month; } private static double GetPositionPercentage(DateOnly date, DateOnly minDate, int totalMonths) { if (totalMonths == 0) return 0; var months = GetMonthsDifference(minDate, date); return Math.Max(0, Math.Min(100, (double)months / totalMonths * 100)); } private static double GetWidthPercentage(DateOnly start, DateOnly end, int totalMonths) { if (totalMonths == 0) return 0; var months = GetMonthsDifference(start, end); return Math.Max(1, Math.Min(100, (double)months / totalMonths * 100)); } private static IEnumerable GetYearMarkers(DateOnly minDate, DateOnly maxDate) { var startYear = minDate.Year; var endYear = maxDate.Year; for (var year = startYear; year <= endYear; year++) { yield return new DateOnly(year, 1, 1); } } private static string FormatDateRange(DateOnly? startDate, DateOnly? endDate, bool isCurrent) { var start = startDate?.ToString("MMM yyyy") ?? "Unknown"; var end = isCurrent ? "Present" : (endDate?.ToString("MMM yyyy") ?? "Unknown"); return $"{start} - {end}"; } }