Issue #3613559: Keep the variables node Add controls out of the modeler properties panel

Follow-up to [#3613299]. Two controls that only work in the workflow editor were leaking into a BPMN modeler's properties panel.

What was wrong

A modeler turns this plugin's settings form into an element template, one field per form element, and its panel has no rebuild cycle. So "Add a provider" appeared there as a dropdown that does nothing, and the Add button, being a submit element, appeared as a text field named "Add". Neither can work in that panel: a drag handle cannot drag and a button has nothing to rebuild.

The list itself was never broken there. The panel's providers field holds the JSON list and editing it saves correctly, so the panel stays a usable raw editor.

What changes

The rich editor is offered only to a host that can rebuild around it, which says so by passing a SubformState. A modeler calls the plugin with a bare FormState and no parents, and now gets the two settings it can actually write: providers as the flat JSON value it is already stored as, and the scope. The workflow editor is untouched, table, Add and Remove included.

The generated template goes from

Plugin ID | Join | Split | Providers | Add a provider | Add | Variable scope

to

Plugin ID | Join | Split | Providers | Variable scope

The replay guard, restated

The providers_editor hidden marker added in [#3613299] is gone, replaced by $form_state->isProgrammed(). That is what Component::validate() sets when modeler_api replays the plugin on every save, so it names the thing being detected instead of inventing a field to detect it with.

The guard is still needed, and I confirmed the hard way that it is: the replay embeds the subform, so it renders the table, and a table cannot take its own stored JSON string back as rows. Removing the guard entirely wiped the node on every diagram save again. Preserving what the plugin already holds is also what keeps the panel editable, since that value is the one the diagram just brought in.

Tests

Three new: a modeler gets the flat pair and neither add control, a list typed into a panel is stored as typed, and a programmed replay carrying a changed list writes it through. The existing cases now build through a subform state, which is how a host actually calls this form. Green: 68 tests across the variables node, the canvas form and the modeler, plus phpcs, phpstan and cspell.

Docs and French updated.

Merge request reports

Loading