Keep concurrent writes on incident resume, uninstall orchestra_server cleanly, use the resolved Kessai client, keep node id case, and fix five more defects

Closes https://www.drupal.org/project/orchestra/issues/3633206

One commit per defect:

  • Incident resume keeps concurrent writes. IncidentResumeForm wrote back every variable it showed, so a value another branch wrote after the form was built was put back. It now writes only the values the operator changed. The form carries the values it showed in hidden fields, because on submit it is rebuilt from the variables as they are then. Test: IncidentResumeFormTest (submits through the form builder with a variable changed in between).
  • Workflow usage counts only local subprocess parents. WorkflowUsage read any node's process setting, so a remote child's name held a local workflow of the same name. It now asks the task type, through the static SubprocessTaskInterface::getChildWorkflowId(array $configuration), so no plugin is built per node (counting 60 workflows of 3 subprocess nodes: 0.28 ms vs 0.25 ms on 1.x, medians of 7, same peak memory; delete paths only). Test: RemoteDeletionTest::testRemoteChildDoesNotReferenceTheLocalNamesake().
  • Node names keep their case. The model editor lowercased every node name on save, renaming BPMN.io nodes such as Activity_1 and orphaning their layout and translations. A refused duplicate names the existing node as it is spelled. Test: OrchestraCmFormTest::testNodeNameKeepsItsCase().
  • Payment steps use the resolved Kessai client. PaymentInteraction, SettleTask, PaymentLapsed and PaymentOperationsController fetched kessai.payment_engine by name. On a site with only a remote client they could not be built. Test: DeclaredDependenciesTest::testEveryPaymentStepUsesTheResolvedClient().
  • orchestra_server uninstalls. Its .install removed the consumer fields itself, then core removed them again and the uninstall stopped on an already deleted field. Core handles them now. Test: ModuleUninstallTest.
  • One base path in links. The instance page's back link, the webform escape buttons and the webform signal URLs passed an address that already held the base path to Url::fromUserInput(), giving /sub/sub/... on a subdirectory install. The payment interaction's fix moved to InternalPathPolicy::buildUrl(), used by all four. Test: SubdirectoryUrlTest.
  • Bulk actions say what they did. The orchestra_vbo actions returned nothing, so a skipped row looked done. Each row now gets a translated message, including a cancel that lost to another actor. Tests: ProcessActionsTest::testSkippedRowsSayWhy(), testTheCancelThatLostSaysSo().
  • Remote child process is checked. The remote subprocess node refuses a process the remote does not list. It asks only when the remote or process changed from the saved settings, which the forms editor checks and the BPMN modeler (validating with the settings it saves) does not. It accepts the process when the remote does not answer. Test: RemoteSubprocessTest::testTheChildProcessIsOneTheRemoteLists().
  • Label columns load workflows once. WorkflowLabel and NodeLabel preloaded workflows and then loaded them again per row (config entities have no static cache). They now keep the page's workflows (PageWorkflowsTrait). NodeLabel no longer loads instances. WorkItemLabel drops its unused instance load and hands the page's workflow to WorkItemManagerInterface::getLabel(), which takes it as an optional argument and ignores a workflow the token does not name. Test: ShippedViewsTest::testTheLabelColumnsLoadTheWorkflowsOnce().

Every test fails on 1.x.

AI-Generated: Yes (Claude Code was used to audit the module and to write this code, its tests and this description.)

Edited by Frank Mably

Merge request reports

Loading
Loading