diff --git a/src/Plugin/Field/FieldType/WorkflowsFieldItem.php b/src/Plugin/Field/FieldType/WorkflowsFieldItem.php index c8dc055..c93d0be 100644 --- a/src/Plugin/Field/FieldType/WorkflowsFieldItem.php +++ b/src/Plugin/Field/FieldType/WorkflowsFieldItem.php @@ -124,7 +124,7 @@ class WorkflowsFieldItem extends FieldItemBase implements OptionsProviderInterfa $allowed_states = $type->getStates(); if (!empty($value) && $type->hasState($value) && ($current = $type->getState($value))) { $allowed_states = array_filter($allowed_states, function(StateInterface $state) use ($current) { - return $current->canTransitionTo($state->id()); + return $current->id() === $state->id() || $current->canTransitionTo($state->id()); }); } $state_labels = array_map(function ($state) { diff --git a/tests/src/Kernel/WorkflowsFieldTest.php b/tests/src/Kernel/WorkflowsFieldTest.php index b82f03d..16bed9b 100644 --- a/tests/src/Kernel/WorkflowsFieldTest.php +++ b/tests/src/Kernel/WorkflowsFieldTest.php @@ -2,7 +2,7 @@ namespace Drupal\Tests\workflows_field\Kernel; -use Drupal\Core\Form\FormState; +use Drupal\Core\Field\FieldFilteredMarkup; use Drupal\KernelTests\KernelTestBase; use Drupal\node\Entity\Node; use Drupal\workflows\Entity\Workflow; @@ -85,53 +85,44 @@ class WorkflowsFieldTest extends KernelTestBase { $this->assertEquals([ '#markup' => 'In Discussion', + '#allowed_tags' => FieldFilteredMarkup::allowedTags(), ], $node->field_status->view()[0]); } /** - * Test the default widget. + * Test the implementation of OptionsProviderInterface. */ - public function testWidget() { + public function testOptionsProvider() { $node = Node::create([ 'title' => 'Foo', 'type' => 'project', + 'field_status' => 'in_discussion', ]); $node->save(); - /** @var \Drupal\Core\Field\WidgetPluginManager $widget */ - $widget_manager = \Drupal::service('plugin.manager.field.widget'); - $widget = $widget_manager->createInstance('options_select', [ - 'field_definition' => $node->field_status->getFieldDefinition(), - 'settings' => [], - 'third_party_settings' => [], - ]); - - $form_state = new FormState(); - $empty = []; - - // Test with an empty field item list to begin with. - $form = $widget->formElement($node->field_status, 0, $empty, $empty, $form_state); $this->assertEquals([ - '#type' => 'select', - '#options' => [ - 'in_discussion' => 'In Discussion', - 'approved' => 'Approved', - 'rejected' => 'Rejected', - ], - '#default_value' => 'in_discussion', - ], $form['value']); + 'implementing' => 'Implementing', + 'approved' => 'Approved', + 'rejected' => 'Rejected', + 'planning' => 'Planning', + 'in_discussion' => 'In Discussion', + ], $node->field_status[0]->getPossibleOptions()); + $this->assertEquals([ + 'approved' => 'Approved', + 'rejected' => 'Rejected', + ], $node->field_status[0]->getSettableOptions()); - // Test with an existing status. - $node->field_status->value = 'approved'; - $form = $widget->formElement($node->field_status, 0, $empty, $empty, $form_state); $this->assertEquals([ - '#type' => 'select', - '#options' => [ - 'approved' => 'Approved', - 'planning' => 'Planning', - ], - '#default_value' => 'approved', - ], $form['value']); + 'implementing', + 'approved', + 'rejected', + 'planning', + 'in_discussion', + ], $node->field_status[0]->getPossibleValues()); + $this->assertEquals([ + 'approved', + 'rejected', + ], $node->field_status[0]->getSettableValues()); } /**