@page "/reports/timesheet"
@using Microsoft.AspNetCore.Authorization
@using TaskTrackingSystem.Shared
@using TaskTrackingSystem.Shared.Models.Issue
@using TaskTrackingSystem.Shared.Models.User
@using TaskTrackingSystem.Shared.Models.Project
@using System.Text
@rendermode @(new InteractiveServerRenderMode(prerender: false))
@attribute [Authorize]
@inject ApiClientService ApiClient
@inject IJSRuntime JS
@inject AuthenticationStateProvider AuthStateProvider
@inject MenuAuthorizationService MenuAuthorization
@AppLocalization.Text("report.timeTrackingDesc", "Review estimated hours, completion timelines, and resource effort distribution across issues.")
Total Estimated Effort
@totalHours.ToString("N1") hrs
Actual Hours
@actualHours.ToString("N1") hrs
Variance
@varianceHours.ToString("+0.0;-0.0;0.0") hrs
Utilization
@utilizationPercent.ToString("N0")%
| No. | Issue | Task & Project | Assignee | Est. Hours | Actual Hours | Due Date | Status |
|---|---|---|---|---|---|---|---|
| @((currentPage - 1) * pageSize + entry.index + 1) |
@issue.Title @if (!string.IsNullOrEmpty(issue.Description)) {@issue.Description } |
@issue.TaskTitle
@issue.ProjectName
|
@if (!string.IsNullOrEmpty(issue.AssignedToName))
{
@(issue.AssignedToName.Length > 0 ? issue.AssignedToName[0].ToString().ToUpper() : "")
@issue.AssignedToName
}
else
{
Unassigned
}
|
@((issue.EstimatedHours ?? 0).ToString("N1")) hrs | @((issue.ActualHours ?? 0).ToString("N1")) hrs | @DisplayFormats.Date(issue.DueDate) | @{ var (statusLabel, statusClass) = issue.StatusId switch { AppTaskStatus.InProgress => ("In Progress", "bg-blue-50 text-blue-700"), AppTaskStatus.Done => ("Completed", "bg-emerald-50 text-emerald-700"), _ => ("To Do", "bg-slate-100 text-slate-600") }; } @statusLabel |