Merge pull request #10735 from elliot-sawyer/feature/change-search-filter-treedropdownfield

NEW: Allow different search filters on TreeDropdownField
This commit is contained in:
Guy Sartorelli 2023-05-02 08:30:51 +12:00 committed by GitHub
commit 6296c06f3a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 1 deletions

View File

@ -61,6 +61,8 @@ class TreeDropdownField extends FormField
protected $schemaComponent = 'TreeDropdownField'; protected $schemaComponent = 'TreeDropdownField';
private static $search_filter = 'PartialMatch';
private static $url_handlers = [ private static $url_handlers = [
'$Action!/$ID' => '$Action' '$Action!/$ID' => '$Action'
]; ];
@ -791,9 +793,11 @@ class TreeDropdownField extends FormField
'Title', 'Title',
'Name' 'Name'
]); ]);
$searchFilter = $this->config()->get('search_filter') ?? 'PartialMatch';
foreach ($candidates as $candidate) { foreach ($candidates as $candidate) {
if ($sourceObjectInstance->hasDatabaseField($candidate)) { if ($sourceObjectInstance->hasDatabaseField($candidate)) {
$filters["{$candidate}:PartialMatch"] = $this->search; $filters["{$candidate}:{$searchFilter}"] = $this->search;
} }
} }

View File

@ -363,4 +363,47 @@ class TreeDropdownFieldTest extends SapphireTest
'TreeBaseId is included in the default schema data' 'TreeBaseId is included in the default schema data'
); );
} }
public function testSearchFilter()
{
$field = new TreeDropdownField('TestTree', 'Test tree', TestObject::class);
// case-insensitive search against keyword 'zero' for pages
$request = new HTTPRequest('GET', 'url', ['search' => 'zero', 'format' => 'json', 'flatList' => '1' ]);
$request->setSession(new Session([]));
$response = $field->tree($request);
$tree = $response->getBody();
$json = json_decode($tree);
$children1Before = count($json->children);
$this->assertEquals($children1Before, 4, 'PartialMatch search for zero has 4 results in fixture');
TreeDropdownField::config()->set('search_filter', 'StartsWith');
$request = new HTTPRequest('GET', 'url', ['search' => 'zero', 'format' => 'json', 'flatList' => '1' ]);
$request->setSession(new Session([]));
$response = $field->tree($request);
$tree = $response->getBody();
$json = json_decode($tree);
$children1After = count($json->children);
$this->assertEquals($children1After, 1, 'StartsWith search for zero has 1 result in fixture');
//change search_filter back and repeat the test
TreeDropdownField::config()->set('search_filter', 'PartialMatch');
// case-insensitive search against keyword 'child' for pages
$request = new HTTPRequest('GET', 'url', ['search' => 'child', 'format' => 'json', 'flatList' => '1' ]);
$request->setSession(new Session([]));
$response = $field->tree($request);
$tree = $response->getBody();
$json = json_decode($tree);
$children2Before = count($json->children);
$this->assertEquals($children2Before, 9, 'PartialMatch search for child has 9 results in fixture');
TreeDropdownField::config()->set('search_filter', 'StartsWith');
$request = new HTTPRequest('GET', 'url', ['search' => 'child', 'format' => 'json', 'flatList' => '1' ]);
$request->setSession(new Session([]));
$response = $field->tree($request);
$tree = $response->getBody();
$json = json_decode($tree);
$children2After = count($json->children);
$this->assertEquals($children2After, 8, 'StartsWith search for child has 8 results in fixture (excludes grandchild)');
}
} }