Repository navigation
Refactor: Relocate the ReadyForMove presentation to the caller #630
Description
Activity
Relocate the
ReadyForMovepresentation to the caller (Issue #630)-
Date captured: 2026-08-26
-
Author: Dan Moisan
-
Status: Promoted -> docs/features/active/Relocate_the_ReadyForMove_presentation_to_the_caller/ (Issue Refactor: Relocate the
ReadyForMovepresentation to the caller #630) -
Captures: follow-up candidate 3 of
## Follow-up Candidatesin
docs/features/active/qfc-collection-controller-defects-468/spec.md -
Origin: issue Bug: qfc-collection-controller-coupling-and-modal-getter #474 defect 2, task
[P14-T5] -
Origin feature folder:
docs/features/active/qfc-collection-controller-defects-468 -
Issue: Refactor: Relocate the
ReadyForMovepresentation to the caller #630 -
Issue URL: Refactor: Relocate the
ReadyForMovepresentation to the caller #630 -
Last Updated: 2026-08-26
Summary
Issue #474 defect 2 was that move readiness could not be evaluated without presenting a modal dialog:
theReadyForMoveproperty calledMessageBox.Showon its false path, so any caller that merely
wanted to ask whether the collection was ready also told the user it was not.Issue #468's branch fixed the testability half of this by splitting the evaluation from the
notification inside the controller:internal bool TryGetMoveReadiness(out string notifications)
carries the evaluation, and a private injectable delegate_notifyNotReadycarries the notification,
defaulting to the unchanged modal call. The property still shows the dialog, so production behaviour
is unchanged.The preferred end state — recorded in
2026-08-07-qfc-collection-controller-coupling-and-modal-getter.md:52-54— goes further: the dialog
should not live in the collection controller at all.Proposed approach when promoted
- Add
bool TryGetMoveReadiness(out string notifications)toIQfcCollectionController. - Remove the dialog from the
ReadyForMovegetter, and remove the_notifyNotReadydelegate along
with it. - Move the
MessageBoxpresentation into theelsebranch ofActionOkAsyncin
QuickFiler/Controllers/QfcFormController.EventHandlers.cs, where a form-owning controller is the
appropriate place to present a modal.
Why it was deferred rather than absorbed
Two reasons, both structural. It edits
QuickFiler/Controllers/QfcFormController.EventHandlers.cs,
which is outside the issue #468 branch's owned file set. And it changes the
IQfcCollectionControllercontract, which the branch's scope lock forbids: the branch's task text
for[P13-T1]says explicitly "Do not addTryGetMoveReadinesstoIQfcCollectionController."Unresolved prerequisite
Research did not exhaustively verify whether any
Mock<IQfcCollectionController>exists in
QuickFiler.Test. Adding a member to that interface breaks every hand-written test double that
implements it, while Moq-generated mocks auto-implement the new member. That search must be run
before committing to the contract change, and its result determines the size of the test-side diff.Acceptance ideas (for the promoted entry to refine)
MessageBox.Showdoes not occur inQuickFiler/Controllers/QfcCollectionController.csat all.IQfcCollectionControllerdeclaresTryGetMoveReadiness(out string notifications).- A test drives
ActionOkAsync's not-ready branch through an injected presentation seam and asserts
the notification text, with no dialog presented. - The two existing readiness tests in
QuickFiler.Test/Controllers/QfcCollectionControllerDefects468Tests.csare retargeted at the
interface member and still pass.
-
Problem / Why
(not provided in potential file)
Proposed Behavior
(not provided in potential file)
Acceptance Criteria
(not provided in potential file)
Constraints & Risks
(not provided in potential file)
Test Conditions
(not provided in potential file)
Source
From: docs/features/potential/2026-08-26-qfc-relocate-readyformove-presentation-to-caller.md