feat(board): show upcoming deadline tasks
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user