Security update for Core, with self-updated composer
[yaffs-website] / web / core / modules / workflows / src / Form / WorkflowTransitionAddForm.php
index fe3a40636d659eed594d8245c2a1a8137e247972..84522929892a0278ac89bdd53ea5cb49d441a55b 100644 (file)
@@ -5,13 +5,43 @@ 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\workflows\State;
+use Drupal\workflows\TransitionInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Class WorkflowTransitionAddForm.
  */
 class WorkflowTransitionAddForm extends EntityForm {
 
+  /**
+   * 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}
    */
@@ -27,6 +57,8 @@ class WorkflowTransitionAddForm extends EntityForm {
 
     /* @var \Drupal\workflows\WorkflowInterface $workflow */
     $workflow = $this->getEntity();
+    $workflow_type = $workflow->getTypePlugin();
+
     $form['label'] = [
       '#type' => 'textfield',
       '#title' => $this->t('Label'),
@@ -45,7 +77,7 @@ class WorkflowTransitionAddForm 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'),
@@ -57,15 +89,19 @@ class WorkflowTransitionAddForm extends EntityForm {
       '#type' => 'radios',
       '#title' => $this->t('To'),
       '#required' => TRUE,
-      '#default_value' => [],
       '#options' => $states,
     ];
 
     // Add additional form fields from the workflow type plugin.
-    $form['type_settings'] = [
-      $workflow->get('type') => $workflow->getTypePlugin()->buildTransitionConfigurationForm($form_state, $workflow),
-      '#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);
+      $form['type_settings'] += $this->pluginFormFactory
+        ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY)
+        ->buildConfigurationForm($form['type_settings'], $subform_state);
+    }
 
     return $form;
   }
@@ -82,7 +118,7 @@ class WorkflowTransitionAddForm extends EntityForm {
   public function exists($transition_id) {
     /** @var \Drupal\workflows\WorkflowInterface $original_workflow */
     $original_workflow = \Drupal::entityTypeManager()->getStorage('workflow')->loadUnchanged($this->getEntity()->id());
-    return $original_workflow->hasTransition($transition_id);
+    return $original_workflow->getTypePlugin()->hasTransition($transition_id);
   }
 
   /**
@@ -104,30 +140,33 @@ class WorkflowTransitionAddForm extends EntityForm {
     }
     /** @var \Drupal\workflows\WorkflowInterface $entity */
     $values = $form_state->getValues();
-    $entity->addTransition($values['id'], $values['label'], array_filter($values['from']), $values['to']);
-    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()->addTransition($values['id'], $values['label'], array_filter($values['from']), $values['to']);
   }
 
-
   /**
    * {@inheritdoc}
    */
   public function validateForm(array &$form, FormStateInterface $form_state) {
     /** @var \Drupal\workflows\WorkflowInterface $workflow */
     $workflow = $this->getEntity();
+    $workflow_type = $workflow->getTypePlugin();
+
     $values = $form_state->getValues();
     foreach (array_filter($values['from']) as $from_state_id) {
-      if ($workflow->hasTransitionFromStateToState($from_state_id, $values['to'])) {
+      if ($workflow->getTypePlugin()->hasTransitionFromStateToState($from_state_id, $values['to'])) {
         $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);
+      $this->pluginFormFactory
+        ->createInstance($workflow_type, TransitionInterface::PLUGIN_FORM_KEY)
+        ->validateConfigurationForm($form['type_settings'], $subform_state);
+    }
   }
 
   /**
@@ -136,6 +175,17 @@ class WorkflowTransitionAddForm 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($form_state->getValue('id'));
+
+    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('Created %label transition.', [
       '%label' => $form_state->getValue('label'),