feat: #3610434 Add a reusable ReviewInteractionBase: render domain content above the embedded comment/outcome decision
Follows #3610065 (interactions own their completion). Adds an abstract ReviewInteractionBase in orchestra_interaction for the recurring "render the thing being reviewed, then decide" shape, so interactions stop hand-wiring the same content-plus-decision embed.
What
ReviewInteractionBase(new,@api): renders a subclass's domain body viareviewBody(), then embeds theCommentForm(the node's outcome buttons over an optional comment) beneath it. The decision resumes through the context's continuation handle, so a review completes under whichever doorway opened it (a bearer link, an assigned task, a pulled operation), with no per-doorway code.CommentDecisionConfigTrait(new): the sharedrequired+comment_variablesettings, soCommentInteractionand the base configure them without duplication. The comment-to-variable mapping stays the existingCommentVariableTrait.WebformInteractionread-only review mode refactored onto the base. This also gives it the require-a-comment and store-comment-in-variable support the standalone comment interaction already had (the review previously embedded the form without them).
Design notes
CommentInteractiondeliberately keeps redirecting to its own page and does not derive from the base; it only shares the config trait.- The base's
respond()is overridable, so a subclass with more than one presentation mode (asWebformInteractionhas, its collect and editable-review modes redirect to the form) callsreviewResponse()only for its review path.
Tests
- New
ReviewInteractionBaseTest(kernel): the body-plus-embedded-decision assembly, the required flag reaching the embedded form, the config round-trip, andresultVariables()mapping the comment only when a variable is set. - The full
orchestra_interactionandorchestra_interaction_webformkernel suites pass unchanged.