From 51287d545b1e6a7054726e5bccefae03839229ad Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sat, 5 Oct 2024 14:47:00 +0100 Subject: [PATCH] Searching: Fixed some form search issues - Form was not retaining certain filters - Form request handling of entity type set wrong filter name Added test to cover. --- app/Search/SearchOptions.php | 7 +++++-- tests/Entity/EntitySearchTest.php | 4 ++-- tests/Entity/SearchOptionsTest.php | 13 +++++++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/Search/SearchOptions.php b/app/Search/SearchOptions.php index 7f9db2a64..a6f820299 100644 --- a/app/Search/SearchOptions.php +++ b/app/Search/SearchOptions.php @@ -73,7 +73,7 @@ class SearchOptions } if (isset($inputs['types']) && count($inputs['types']) < 4) { - $cleanedFilters[] = new FilterSearchOption(implode('|', $inputs['types']), 'types'); + $cleanedFilters[] = new FilterSearchOption(implode('|', $inputs['types']), 'type'); } $instance->filters = new SearchOptionSet($cleanedFilters); @@ -235,11 +235,14 @@ class SearchOptions { $options = []; - // Non-[created/updated]-by-me options + // Handle filters without UI support $userFilters = ['updated_by', 'created_by', 'owned_by']; + $unsupportedFilters = ['is_template', 'sort_by']; foreach ($this->filters->all() as $filter) { if (in_array($filter->getKey(), $userFilters, true) && $filter->value !== null && $filter->value !== 'me') { $options[] = $filter; + } else if (in_array($filter->getKey(), $unsupportedFilters, true)) { + $options[] = $filter; } } diff --git a/tests/Entity/EntitySearchTest.php b/tests/Entity/EntitySearchTest.php index 3a1a0a662..57b7c3f6b 100644 --- a/tests/Entity/EntitySearchTest.php +++ b/tests/Entity/EntitySearchTest.php @@ -573,8 +573,8 @@ class EntitySearchTest extends TestCase public function test_searches_with_terms_without_controls_includes_them_in_extras() { - $resp = $this->asEditor()->get('/search?term=' . urlencode('test {updated_by:dan} {created_by:dan} -{viewed_by_me} -[a=b] -"dog"')); - $this->withHtml($resp)->assertFieldHasValue('extras', '{updated_by:dan} {created_by:dan} -"dog" -[a=b] -{viewed_by_me}'); + $resp = $this->asEditor()->get('/search?term=' . urlencode('test {updated_by:dan} {created_by:dan} -{viewed_by_me} -[a=b] -"dog" {is_template} {sort_by:last_commented}')); + $this->withHtml($resp)->assertFieldHasValue('extras', '{updated_by:dan} {created_by:dan} {is_template} {sort_by:last_commented} -"dog" -[a=b] -{viewed_by_me}'); } public function test_negated_searches_dont_show_in_inputs() diff --git a/tests/Entity/SearchOptionsTest.php b/tests/Entity/SearchOptionsTest.php index ae0f1e56a..0c2ad271c 100644 --- a/tests/Entity/SearchOptionsTest.php +++ b/tests/Entity/SearchOptionsTest.php @@ -113,6 +113,19 @@ class SearchOptionsTest extends TestCase $this->assertEquals(['"cheese"', '""', '"baked', 'beans"'], $options->exacts->toValueArray()); } + public function test_from_request_properly_parses_provided_types() + { + $request = new Request([ + 'search' => '', + 'types' => ['page', 'book'], + ]); + + $options = SearchOptions::fromRequest($request); + $filters = $options->filters->toValueMap(); + $this->assertCount(1, $filters); + $this->assertEquals('page|book', $filters['type'] ?? 'notfound'); + } + public function test_from_request_properly_parses_out_extras_as_string() { $request = new Request([