feat(ui): My Day actions, orphan-aware grouping, menu restructure
Pending UI work: - My Day add/remove context actions on task rows (parent removal cascades to children) - orphan-aware grouping: a child whose parent isn't in view renders as a top-level row, not an indented draft - shell menu restructure (Worker / Repositories submenus); 'Finalize plan' action, drop 'Queue subtasks sequentially' - notes editor refinements - subtask-row hover tweak (Surface3, no transition) - bump Avalonia 12.0.0 -> 12.0.4
This commit is contained in:
@@ -109,4 +109,83 @@ public class TaskRowViewModelPlanningTests
|
||||
var vm = MakeRow(TaskStatus.Idle, phase: PlanningPhase.Finalized);
|
||||
Assert.False(vm.CanQueuePlan);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ActivePlanningParent_CannotSendToQueue()
|
||||
{
|
||||
var vm = MakeRow(TaskStatus.Idle, phase: PlanningPhase.Active);
|
||||
vm.HasPlanningChildren = true;
|
||||
Assert.False(vm.CanSendToQueue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FinalizedParentWithChildren_CanSendToQueue()
|
||||
{
|
||||
var vm = MakeRow(TaskStatus.Idle, phase: PlanningPhase.Finalized);
|
||||
vm.HasPlanningChildren = true;
|
||||
Assert.True(vm.CanSendToQueue);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ActivePlanning_CanFinalizePlanning()
|
||||
{
|
||||
var vm = MakeRow(TaskStatus.Idle, phase: PlanningPhase.Active);
|
||||
Assert.True(vm.CanFinalizePlanning);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FinalizedPlanning_CannotFinalizePlanning()
|
||||
{
|
||||
var vm = MakeRow(TaskStatus.Idle, phase: PlanningPhase.Finalized);
|
||||
Assert.False(vm.CanFinalizePlanning);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void PlainIdle_CannotFinalizePlanning()
|
||||
{
|
||||
var vm = MakeRow(TaskStatus.Idle);
|
||||
Assert.False(vm.CanFinalizePlanning);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ChildWithParentInView_RendersAsChild()
|
||||
{
|
||||
var vm = MakeRow(TaskStatus.Idle, parentTaskId: "parent-id");
|
||||
Assert.True(vm.ParentInView); // default
|
||||
Assert.True(vm.ShowAsChild);
|
||||
Assert.True(vm.IsDraft);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void OrphanedChild_RendersFlat_WithNoDraftOrPlannedBadge()
|
||||
{
|
||||
// Parent absent from the view (e.g. removed from My Day, or daily-prep placed a lone
|
||||
// child there): the row stays a child by data but must read as a normal top-level task.
|
||||
var draftOrphan = MakeRow(TaskStatus.Idle, parentTaskId: "missing");
|
||||
draftOrphan.ParentInView = false;
|
||||
Assert.True(draftOrphan.IsChild);
|
||||
Assert.False(draftOrphan.ShowAsChild);
|
||||
Assert.False(draftOrphan.IsDraft);
|
||||
|
||||
var plannedOrphan = MakeRow(TaskStatus.Idle, parentTaskId: "missing");
|
||||
plannedOrphan.ParentFinalized = true;
|
||||
plannedOrphan.ParentInView = false;
|
||||
Assert.False(plannedOrphan.ShowAsChild);
|
||||
Assert.False(plannedOrphan.IsPlanned);
|
||||
Assert.False(plannedOrphan.IsDraft);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void CanAddToMyDay_TrueOnlyWhenNotInMyDayAndNotDone()
|
||||
{
|
||||
var row = MakeRow(TaskStatus.Idle);
|
||||
Assert.True(row.CanAddToMyDay); // idle, not yet in My Day
|
||||
|
||||
row.IsMyDay = true;
|
||||
Assert.False(row.CanAddToMyDay); // already in My Day
|
||||
|
||||
row.IsMyDay = false;
|
||||
row.Done = true;
|
||||
Assert.False(row.CanAddToMyDay); // done tasks don't belong in today's focus
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user