@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.")
@AppLocalization.Text("report.totalEstimatedEffort", "Total Estimated Effort")
@AppLocalization.Number(totalHours, "N1") @AppLocalization.Text("common.hoursAbbrev", "hrs")
@AppLocalization.Text("common.actualHours", "Actual Hours")
@AppLocalization.Number(actualHours, "N1") @AppLocalization.Text("common.hoursAbbrev", "hrs")
@AppLocalization.Text("report.variance", "Variance")
@AppLocalization.LocalizeDigits(varianceHours.ToString("+0.0;-0.0;0.0", System.Globalization.CultureInfo.InvariantCulture)) @AppLocalization.Text("common.hoursAbbrev", "hrs")
@AppLocalization.Text("report.utilization", "Utilization")
@AppLocalization.Number(utilizationPercent, "N0")%
| @AppLocalization.Text("common.index", "No.") | @AppLocalization.Text("common.issue", "Issue") | @AppLocalization.Text("common.taskProject", "Task & Project") | @AppLocalization.Text("common.assignee", "Assignee") | @AppLocalization.Text("common.estimatedHours", "Est. Hours") | @AppLocalization.Text("common.actualHours", "Actual Hours") | @AppLocalization.Text("common.dueDate", "Due Date") | @AppLocalization.Text("common.status", "Status") |
|---|---|---|---|---|---|---|---|
| @AppLocalization.Number((currentPage - 1) * pageSize + entry.index + 1) |
@Content.GetIssueTitle(issue) @if (!string.IsNullOrEmpty(Content.GetIssueDescription(issue))) {@Content.GetIssueDescription(issue) } |
@Content.GetText(issue.TaskTitle, issue.TaskTitleMy)
@Content.GetText(issue.ProjectName, issue.ProjectNameMy)
|
@if (Content.GetText(issue.AssignedToName, issue.AssignedToNameMy) is { Length: > 0 } assigneeName)
{
@assigneeName[0].ToString().ToUpper()
@Content.GetText(issue.AssignedToName, issue.AssignedToNameMy)
}
else
{
@AppLocalization.Text("common.unassigned", "Unassigned")
}
|
@AppLocalization.Number(issue.EstimatedHours ?? 0, "N1") @AppLocalization.Text("common.hoursAbbrev", "hrs") | @AppLocalization.Number(issue.ActualHours ?? 0, "N1") @AppLocalization.Text("common.hoursAbbrev", "hrs") | @DisplayFormats.Date(issue.DueDate) | @{ var (statusLabel, statusClass) = issue.StatusId switch { AppTaskStatus.InProgress => (AppLocalization.StatusLabel(AppTaskStatus.InProgress), "bg-blue-50 text-blue-700"), AppTaskStatus.Done => (AppLocalization.StatusLabel(AppTaskStatus.Done), "bg-emerald-50 text-emerald-700"), _ => (AppLocalization.StatusLabel(AppTaskStatus.Todo), "bg-slate-100 text-slate-600") }; } @statusLabel |