Skip to content

Commit

Permalink
NEW: Allow search field customisation in GridFieldFilterHeader
Browse files Browse the repository at this point in the history
  • Loading branch information
Aaron Carlino authored and GuySartorelli committed Jul 11, 2022
1 parent b62c4a9 commit 24ea191
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 4 deletions.
28 changes: 24 additions & 4 deletions src/Forms/GridField/GridFieldFilterHeader.php
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ class GridFieldFilterHeader extends AbstractGridFieldComponent implements GridFi
*/
protected $updateSearchFormCallback = null;

/**
* The name of the default search field
* @var string|null
*/
protected ?string $searchField = null;

/**
* @inheritDoc
*/
Expand Down Expand Up @@ -125,6 +131,17 @@ public function getThrowExceptionOnBadDataType()
return $this->throwExceptionOnBadDataType;
}

public function getSearchField(): ?string
{
return $this->searchField;
}

public function setSearchField(string $field): self
{
$this->searchField = $field;
return $this;
}

/**
* Check that this dataList is of the right data type.
* Returns false if it's a bad data type, and if appropriate, throws an exception.
Expand Down Expand Up @@ -281,7 +298,7 @@ public function getSearchContext(GridField $gridField)
public function getSearchFieldSchema(GridField $gridField)
{
$schemaUrl = Controller::join_links($gridField->Link(), 'schema/SearchForm');

$inst = singleton($gridField->getModelClass());
$context = $this->getSearchContext($gridField);
$params = $gridField->getRequest()->postVar('filter') ?: [];
if (array_key_exists($gridField->getName(), $params ?? [])) {
Expand All @@ -292,10 +309,13 @@ public function getSearchFieldSchema(GridField $gridField)
}
$context->setSearchParams($params);

$searchField = $context->getSearchFields()->first();
$searchField = $searchField && property_exists($searchField, 'name') ? $searchField->name : null;
$searchField = $this->getSearchField() ?: $inst->config()->get('primary_search_field');
if (!$searchField) {
$searchField = $context->getSearchFields()->first();
$searchField = $searchField && property_exists($searchField, 'name') ? $searchField->name : null;
}

$name = $gridField->Title ?: singleton($gridField->getModelClass())->i18n_plural_name();
$name = $gridField->Title ?: $inst->i18n_plural_name();

// Prefix "Search__" onto the filters for the React component
$filters = $context->getSearchParams();
Expand Down
17 changes: 17 additions & 0 deletions tests/php/Forms/GridField/GridFieldFilterHeaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace SilverStripe\Forms\Tests\GridField;

use SilverStripe\Control\HTTPRequest;
use SilverStripe\Core\Config\Config;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
Expand Down Expand Up @@ -156,4 +157,20 @@ public function testGetSearchForm()
$this->assertEquals('no-change-track', $field->extraClasses['no-change-track']);
}
}

public function testCustomSearchField()
{
$searchSchema = json_decode($this->component->getSearchFieldSchema($this->gridField));
$this->assertEquals('Name', $searchSchema->name);

Config::modify()->set(Team::class, 'primary_search_field', 'CustomSearch');
$searchSchema = json_decode($this->component->getSearchFieldSchema($this->gridField));
$this->assertEquals('CustomSearch', $searchSchema->name);

$this->component->setSearchField('ReallyCustomSearch');
$searchSchema = json_decode($this->component->getSearchFieldSchema($this->gridField));
$this->assertEquals('ReallyCustomSearch', $searchSchema->name);

$this->assertEquals('ReallyCustomSearch', $this->component->getSearchField());
}
}

0 comments on commit 24ea191

Please sign in to comment.