From f5a68ca12bd50595fe57dddc6047a4f8e84745b5 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli Date: Fri, 13 Dec 2024 09:24:46 +1300 Subject: [PATCH] FIX Treat value not in SingleSelectField options as blank This makes the react dropdown fields behave more like the entwine ones when the DB value is not in the set of dropdown options. --- src/Forms/SingleSelectField.php | 5 ++- tests/php/Forms/DropdownFieldTest.php | 60 ++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/Forms/SingleSelectField.php b/src/Forms/SingleSelectField.php index 1dcd6b502ed..44b1a7619ee 100644 --- a/src/Forms/SingleSelectField.php +++ b/src/Forms/SingleSelectField.php @@ -53,12 +53,13 @@ public function getSchemaDataDefaults() public function getDefaultValue() { $value = $this->Value(); + $validValues = $this->getValidValues(); // assign value to field, such as first option available - if ($value === null) { + if ($value === null || !in_array($value, $validValues)) { if ($this->getHasEmptyDefault()) { $value = ''; } else { - $values = $this->getValidValues(); + $values = $validValues; $value = array_shift($values); } } diff --git a/tests/php/Forms/DropdownFieldTest.php b/tests/php/Forms/DropdownFieldTest.php index 88603aa7550..33decca0eb6 100644 --- a/tests/php/Forms/DropdownFieldTest.php +++ b/tests/php/Forms/DropdownFieldTest.php @@ -170,7 +170,7 @@ public function testEmpty() $form->method('getHTMLID') ->willReturn($formName); - + $source = [ 'first' => 'value', 0 => 'otherValue' @@ -609,4 +609,62 @@ public function testEmptySourceDoesntBlockValidation() $field->validate($v); $this->assertTrue($v->getResult()->isValid()); } + + public function provideGetDefaultValue(): array + { + return [ + [ + 'value' => null, + 'hasEmptyDefault' => true, + 'expected' => '', + ], + [ + 'value' => null, + 'hasEmptyDefault' => false, + 'expected' => 'one', + ], + [ + 'value' => 'four', + 'hasEmptyDefault' => true, + 'expected' => '', + ], + [ + 'value' => 'four', + 'hasEmptyDefault' => false, + 'expected' => 'one', + ], + [ + 'value' => 'two', + 'hasEmptyDefault' => true, + 'expected' => 'two', + ], + [ + 'value' => 'two', + 'hasEmptyDefault' => false, + 'expected' => 'two', + ], + [ + // Note this is an int, but matches against the string key + 'value' => 3, + 'hasEmptyDefault' => true, + 'expected' => 3, + ], + [ + 'value' => 3, + 'hasEmptyDefault' => false, + 'expected' => 3, + ], + ]; + } + + /** + * @dataProvider provideGetDefaultValue + */ + public function testGetDefaultValue(mixed $value, bool $hasEmptyDefault, mixed $expected): void + { + $field = new DropdownField('MyField', source: ['one' => 'one', 'two' => 'two', '3' => 'three']); + $field->setHasEmptyDefault($hasEmptyDefault); + $field->setValue($value); + $this->assertSame($expected, $field->getDefaultValue()); + } }