dot-wizard fires workflow action from a previously cancelled wizard
@oidacra is already working on this.
Since Apr 23, 2026.
- Dominant language
- Java
- Stars
- 970
- Forks
- 486
- Avg merge
- 3d 33m
- Merged PRs (30d)
- 170
Description
Problem Statement
The dot-wizard component shares a single RxJS Subject across every invocation of DotWizardService.open(). Consumers subscribe to that subject to react to the user's submission (e.g. firing a workflow action with the collected comment/assign/push-publish data). When the user cancels or dismisses the wizard (X button, ESC, cancel button), the component resets its internal state but does not notify the service — so the consumer's subscription remains alive.
The next time the wizard is opened for a different content item and the user submits, output$ emits on the shared subject and every leftover subscription from previously cancelled wizards fires too, each with its own stale event / inode. The practical effect is that unrelated content items get workflow actions applied to them without the user ever interacting with them.
This impacts any flow that uses DotWizardService:
DotWorkflowEventHandlerService.openWizard(legacy content portlets, e.g./dotAdmin/#/c/c_Blog-Entries)DotEmaWorkflowActionsService.openWizard(UVE)- Any other consumer that calls
dotWizardService.open(...)
Browser & OS: Reproduces on Chrome / macOS. Not browser-specific — the bug is in the Angular service layer.
Steps to Reproduce
- Go to any legacy content portlet with a workflow action that requires inputs, e.g.
/dotAdmin/#/c/c_Blog-Entries. - Right-click on a content row (Row A) and choose a workflow action that opens the wizard (e.g. Send for Review).
- When the wizard opens, click the X (or press ESC / Cancel) to dismiss it without submitting.
- Right-click on a different content row (Row B) and choose the same workflow action.
- Fill in the wizard and click Send.
Expected: Only Row B transitions to the target step (e.g. QA).
Actual: Both Row A and Row B transition to the target step. The workflow action fires once per previously cancelled wizard in addition to the current one.
Acceptance Criteria
- Dismissing the wizard via the X button, ESC, or the Cancel button completes the observable returned by
DotWizardService.open()without emitting a value. - A new
open()call returns an isolated stream — emissions on that stream never reach subscribers from previousopen()calls. - Submitting the wizard (
output$) continues to deliver the collected payload exactly once to the current subscriber and then completes the stream (sotake(1)consumers unsubscribe cleanly). - No consumer of
DotWizardServiceneeds to change its code for the fix to take effect (DotWorkflowEventHandlerService,DotEmaWorkflowActionsService, etc. continue to work). - Unit tests in
dot-wizard.service.spec.tscover: (a)cancel()completes without emitting, (b) a cancelled subscription does not receive output from a subsequentopen(), (c)output$emits and completes. - Manual verification on
/dotAdmin/#/c/c_Blog-Entries: cancel the wizard on Row A, submit the wizard on Row B → only Row B transitions.
dotCMS Version
Reproduced on main (latest).
Severity
High - Major functionality broken
Workflow actions are executed against content items the user did not interact with, bypassing explicit user intent. Any portlet that uses the wizard (workflow inputs, push publish, comment & assign) is affected.
Links
- Helpdesk ticket: https://helpdesk.dotcms.com/a/tickets/36428
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.