/**
  * {@inheritdoc}
  */
 public function buildForm(array $form, FormStateInterface $form_state, ContentEntityInterface $entity = NULL)
 {
     /** @var \Drupal\content_moderation\Entity\ModerationState $current_state */
     $current_state = $entity->moderation_state->entity;
     $transitions = $this->validation->getValidTransitions($entity, $this->currentUser());
     // Exclude self-transitions.
     $transitions = array_filter($transitions, function (ModerationStateTransition $transition) use($current_state) {
         return $transition->getToState() != $current_state->id();
     });
     $target_states = [];
     /** @var ModerationStateTransition $transition */
     foreach ($transitions as $transition) {
         $target_states[$transition->getToState()] = $transition->label();
     }
     if (!count($target_states)) {
         return $form;
     }
     if ($current_state) {
         $form['current'] = ['#type' => 'item', '#title' => $this->t('Status'), '#markup' => $current_state->label()];
     }
     // Persist the entity so we can access it in the submit handler.
     $form_state->set('entity', $entity);
     $form['new_state'] = ['#type' => 'select', '#title' => $this->t('Moderate'), '#options' => $target_states];
     $form['revision_log'] = ['#type' => 'textfield', '#title' => $this->t('Log message'), '#size' => 30];
     $form['submit'] = ['#type' => 'submit', '#value' => $this->t('Apply')];
     $form['#theme'] = ['entity_moderation_form'];
     return $form;
 }
 /**
  * {@inheritdoc}
  */
 public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state)
 {
     /** @var ContentEntityInterface $entity */
     $entity = $items->getEntity();
     /* @var \Drupal\Core\Config\Entity\ConfigEntityInterface $bundle_entity */
     $bundle_entity = $this->entityTypeManager->getStorage($entity->getEntityType()->getBundleEntityType())->load($entity->bundle());
     if (!$this->moderationInformation->isModeratedEntity($entity)) {
         // @todo https://www.drupal.org/node/2779933 write a test for this.
         return $element + ['#access' => FALSE];
     }
     $default = $items->get($delta)->value ?: $bundle_entity->getThirdPartySetting('content_moderation', 'default_moderation_state', FALSE);
     /** @var \Drupal\content_moderation\ModerationStateInterface $default_state */
     $default_state = $this->entityTypeManager->getStorage('moderation_state')->load($default);
     if (!$default || !$default_state) {
         throw new \UnexpectedValueException(sprintf('The %s bundle has an invalid moderation state configuration, moderation states are enabled but no default is set.', $bundle_entity->label()));
     }
     $transitions = $this->validator->getValidTransitions($entity, $this->currentUser);
     $target_states = [];
     /** @var \Drupal\content_moderation\Entity\ModerationStateTransition $transition */
     foreach ($transitions as $transition) {
         $target_states[$transition->getToState()] = $transition->label();
     }
     // @todo https://www.drupal.org/node/2779933 write a test for this.
     $element += ['#access' => FALSE, '#type' => 'select', '#options' => $target_states, '#default_value' => $default, '#published' => $default ? $default_state->isPublishedState() : FALSE, '#key_column' => $this->column];
     $element['#element_validate'][] = array(get_class($this), 'validateElement');
     // Use the dropbutton.
     $element['#process'][] = [get_called_class(), 'processActions'];
     return $element;
 }