dotCMS / dotCMS/core

dot-wizard fires workflow action from a previously cancelled wizard

Open
#35,422 2 comments 0 reactions 1 assignee View on GitHub

@oidacra is already working on this.

Since Apr 23, 2026.

dotCMS : Workflow OKR : Customer Support QA : Not Needed Team : Falcon Type : Defect
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

  1. Go to any legacy content portlet with a workflow action that requires inputs, e.g. /dotAdmin/#/c/c_Blog-Entries.
  2. Right-click on a content row (Row A) and choose a workflow action that opens the wizard (e.g. Send for Review).
  3. When the wizard opens, click the X (or press ESC / Cancel) to dismiss it without submitting.
  4. Right-click on a different content row (Row B) and choose the same workflow action.
  5. 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 previous open() calls.
  • Submitting the wizard (output$) continues to deliver the collected payload exactly once to the current subscriber and then completes the stream (so take(1) consumers unsubscribe cleanly).
  • No consumer of DotWizardService needs to change its code for the fix to take effect (DotWorkflowEventHandlerService, DotEmaWorkflowActionsService, etc. continue to work).
  • Unit tests in dot-wizard.service.spec.ts cover: (a) cancel() completes without emitting, (b) a cancelled subscription does not receive output from a subsequent open(), (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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.