feat(board): show upcoming deadline tasks

This commit is contained in:
aj
2026-08-13 16:54:13 -04:00
parent 48a749fde3
commit 94f85731ef
6 changed files with 256 additions and 14 deletions
+42 -14
View File
@@ -19,6 +19,7 @@ public class BoardModel : PageModel
}
public List<ColumnViewModel> Columns { get; set; } = new();
public List<WorkTask> UpcomingTasks { get; private set; } = new();
public string? ActiveCategory { get; set; }
public bool HasSubtasksFilter { get; set; }
public List<string> AllCategories { get; set; } = new();
@@ -277,6 +278,43 @@ public class BoardModel : PageModel
return Partial("Partials/_SearchResults", results);
}
public static List<WorkTask> SelectUpcomingTasks(
IEnumerable<WorkTask> allTasks,
string? category,
bool hasSubtasks) =>
SelectUpcomingTasks(FilterVisibleTasks(allTasks, category, hasSubtasks));
private static IEnumerable<WorkTask> FilterVisibleTasks(
IEnumerable<WorkTask> allTasks,
string? category,
bool hasSubtasks)
{
var visibleTasks = allTasks;
if (!string.IsNullOrEmpty(category))
{
visibleTasks = visibleTasks.Where(task =>
string.Equals(task.Category, category, StringComparison.OrdinalIgnoreCase));
}
if (hasSubtasks)
{
visibleTasks = visibleTasks.Where(task => task.SubTasks.Count > 0);
}
return visibleTasks;
}
private static List<WorkTask> SelectUpcomingTasks(IEnumerable<WorkTask> visibleTasks)
{
return visibleTasks
.Where(task => task.DueAt.HasValue &&
task.Status is not WorkTaskStatus.Completed and not WorkTaskStatus.Abandoned)
.OrderBy(task => task.DueAt)
.Take(8)
.ToList();
}
private async Task<IActionResult> ReturnBoardContentAsync()
{
await LoadBoardDataAsync();
@@ -296,21 +334,11 @@ public class BoardModel : PageModel
.OrderBy(c => c)
.ToList();
// Filter to top-level only
var tasks = allTasks.Where(t => t.ParentTaskId == null).ToList();
var visibleTasks = FilterVisibleTasks(allTasks, ActiveCategory, HasSubtasksFilter).ToList();
UpcomingTasks = SelectUpcomingTasks(visibleTasks);
// Apply category filter
if (!string.IsNullOrEmpty(ActiveCategory))
{
tasks = tasks.Where(t =>
string.Equals(t.Category, ActiveCategory, StringComparison.OrdinalIgnoreCase)).ToList();
}
// Apply hasSubtasks filter
if (HasSubtasksFilter)
{
tasks = tasks.Where(t => t.SubTasks.Count > 0).ToList();
}
// Keep the Kanban collection top-level only after filters apply across all tasks.
var tasks = visibleTasks.Where(task => task.ParentTaskId == null).ToList();
// Group by status into columns
var tasksByStatus = tasks.ToLookup(t => t.Status);