From 8ca581c501433953c228f5303b8a51f2d4f656a6 Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Fri, 13 Dec 2024 11:36:43 +1300 Subject: [PATCH] FIX Treat value not in SingleSelectField options as blank (#11510) 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()); + } }