Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / workflows / src / Form / WorkflowTransitionEditForm.php
index 5bbabae6f7af3b75eda191aab7594e7b33ddc515..1406025a72f7ef5ddab9ad169372d0fd249ba437 100644 (file)
@@ -5,8 +5,12 @@ namespace Drupal\workflows\Form;
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformState;
+use Drupal\Core\Plugin\PluginFormFactoryInterface;
 use Drupal\Core\Url;
 use Drupal\workflows\State;
+use Drupal\workflows\TransitionInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Class WorkflowTransitionEditForm.
@@ -20,6 +24,32 @@ class WorkflowTransitionEditForm extends EntityForm {
    */
   protected $transitionId;
 
+  /**
+   * The plugin form factory.
+   *
+   * @var \Drupal\Core\Plugin\PluginFormFactoryInterface
+   */
+  protected $pluginFormFactory;
+
+  /**
+   * Creates an instance of WorkflowStateEditForm.
+   *
+   * @param \Drupal\Core\Plugin\PluginFormFactoryInterface $pluginFormFactory
+   *   The plugin form factory.
+   */
+  public function __construct(PluginFormFactoryInterface $pluginFormFactory) {
+    $this->pluginFormFactory = $pluginFormFactory;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('plugin_form.factory')
+    );
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -43,7 +73,9 @@ class WorkflowTransitionEditForm extends EntityForm {
 
     /* @var \Drupal\workflows\WorkflowInterface $workflow */
     $workflow = $this->getEntity();
-    $transition = $workflow->getTransition($this->transitionId);
+    $workflow_type = $workflow->getTypePlugin();
+    $transition = $workflow->getTypePlugin()->getTransition($this->transitionId);
+
     $form['label'] = [
       '#type' => 'textfield',
       '#title' => $this->t('Label'),
@@ -60,7 +92,7 @@ class WorkflowTransitionEditForm extends EntityForm {
 
     // @todo https://www.drupal.org/node/2830584 Add some ajax to ensure that
     //   only valid transitions are selectable.
-    $states = array_map([State::class, 'labelCallback'], $workflow->getStates());
+    $states = array_map([State::class, 'labelCallback'], $workflow->getTypePlugin()->getStates());
     $form['from'] = [
       '#type' => 'checkboxes',
       '#title' => $this->t('From'),
@@ -78,10 +110,16 @@ class WorkflowTransitionEditForm extends EntityForm {
     ];
 
     // Add additional form fields from the workflow type plugin.
-    $form['type_settings'] = [
-      $workflow->get('type') => $workflow->getTypePlugin()->buildTransitionConfigurationForm($form_state, $workflow, $transition),
-      '#tree' => TRUE,
-    ];
+    if ($workflow_type->hasFormClass(TransitionInterface::PLUGIN_FORM_KEY)) {
+      $form['type_settings'] = [
+        '#tree' => TRUE,
+      ];
+      $subform_state = SubformState::createForSubform($form['type_settings'], $form, $form_state);
+      $subform_state->set('transition', $transition);
+      $form['type_settings'] += $this->pluginFormFactory
+        ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY)
+        ->buildConfigurationForm($form['type_settings'], $subform_state);
+    }
 
     return $form;
   }
@@ -92,18 +130,29 @@ class WorkflowTransitionEditForm extends EntityForm {
   public function validateForm(array &$form, FormStateInterface $form_state) {
     /** @var \Drupal\workflows\WorkflowInterface $workflow */
     $workflow = $this->getEntity();
+    $workflow_type = $workflow->getTypePlugin();
+    $transition = $workflow_type->getTransition($this->transitionId);
+
     $values = $form_state->getValues();
     foreach (array_filter($values['from']) as $from_state_id) {
-      if ($workflow->hasTransitionFromStateToState($from_state_id, $values['to'])) {
-        $transition = $workflow->getTransitionFromStateToState($from_state_id, $values['to']);
-        if ($transition->id() !== $values['id']) {
+      if ($workflow_type->hasTransitionFromStateToState($from_state_id, $values['to'])) {
+        $existing_transition = $workflow_type->getTransitionFromStateToState($from_state_id, $values['to']);
+        if ($existing_transition->id() !== $values['id']) {
           $form_state->setErrorByName('from][' . $from_state_id, $this->t('The transition from %from to %to already exists.', [
-            '%from' => $workflow->getState($from_state_id)->label(),
-            '%to' => $workflow->getState($values['to'])->label(),
+            '%from' => $workflow->getTypePlugin()->getState($from_state_id)->label(),
+            '%to' => $workflow->getTypePlugin()->getState($values['to'])->label(),
           ]));
         }
       }
     }
+
+    if ($workflow_type->hasFormClass(TransitionInterface::PLUGIN_FORM_KEY)) {
+      $subform_state = SubformState::createForSubform($form['type_settings'], $form, $form_state);
+      $subform_state->set('transition', $transition);
+      $this->pluginFormFactory
+        ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY)
+        ->validateConfigurationForm($form['type_settings'], $subform_state);
+    }
   }
 
   /**
@@ -126,13 +175,8 @@ class WorkflowTransitionEditForm extends EntityForm {
     /** @var \Drupal\workflows\WorkflowInterface $entity */
     $values = $form_state->getValues();
     $form_state->set('created_transition', FALSE);
-    $entity->setTransitionLabel($values['id'], $values['label']);
-    $entity->setTransitionFromStates($values['id'], array_filter($values['from']));
-    if (isset($values['type_settings'])) {
-      $configuration = $entity->getTypePlugin()->getConfiguration();
-      $configuration['transitions'][$values['id']] = $values['type_settings'][$entity->getTypePlugin()->getPluginId()];
-      $entity->set('type_settings', $configuration);
-    }
+    $entity->getTypePlugin()->setTransitionLabel($values['id'], $values['label']);
+    $entity->getTypePlugin()->setTransitionFromStates($values['id'], array_filter($values['from']));
   }
 
   /**
@@ -141,9 +185,20 @@ class WorkflowTransitionEditForm extends EntityForm {
   public function save(array $form, FormStateInterface $form_state) {
     /** @var \Drupal\workflows\WorkflowInterface $workflow */
     $workflow = $this->entity;
+    $workflow_type = $workflow->getTypePlugin();
+    $transition = $workflow_type->getTransition($this->transitionId);
+
+    if ($workflow_type->hasFormClass(TransitionInterface::PLUGIN_FORM_KEY)) {
+      $subform_state = SubformState::createForSubform($form['type_settings'], $form, $form_state);
+      $subform_state->set('transition', $transition);
+      $this->pluginFormFactory
+        ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY)
+        ->submitConfigurationForm($form['type_settings'], $subform_state);
+    }
+
     $workflow->save();
     drupal_set_message($this->t('Saved %label transition.', [
-      '%label' => $workflow->getTransition($this->transitionId)->label(),
+      '%label' => $workflow->getTypePlugin()->getTransition($this->transitionId)->label(),
     ]));
     $form_state->setRedirectUrl($workflow->toUrl('edit-form'));
   }