1
0
mirror of https://github.com/BookStackApp/BookStack.git synced 2024-11-22 10:52:30 +01:00

Search: Prevented negated terms filling in UI inputs

Added test to cover.
This commit is contained in:
Dan Brown 2024-10-03 19:38:07 +01:00
parent cd84d08157
commit 966ff91386
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
5 changed files with 28 additions and 10 deletions

View File

@ -63,10 +63,20 @@ class SearchOptionSet
}
/**
* @return T[]
* @return self<T>
*/
public function negated(): array
public function negated(): self
{
return array_values(array_filter($this->options, fn (SearchOption $option) => $option->negated));
$values = array_values(array_filter($this->options, fn (SearchOption $option) => $option->negated));
return new self($values);
}
/**
* @return self<T>
*/
public function nonNegated(): self
{
$values = array_values(array_filter($this->options, fn (SearchOption $option) => !$option->negated));
return new self($values);
}
}

View File

@ -244,9 +244,9 @@ class SearchOptions
}
// Negated items
array_push($options, ...$this->exacts->negated());
array_push($options, ...$this->tags->negated());
array_push($options, ...$this->filters->negated());
array_push($options, ...$this->exacts->negated()->all());
array_push($options, ...$this->tags->negated()->all());
array_push($options, ...$this->filters->negated()->all());
return implode(' ', array_map(fn(SearchOption $o) => $o->toString(), $options));
}

View File

@ -9,7 +9,7 @@
<h5>{{ trans('entities.search_advanced') }}</h5>
@php
$filterMap = $options->filters->toValueMap();
$filterMap = $options->filters->nonNegated()->toValueMap();
@endphp
<form method="get" action="{{ url('/search') }}">
<h6>{{ trans('entities.search_terms') }}</h6>
@ -30,10 +30,10 @@
</div>
<h6>{{ trans('entities.search_exact_matches') }}</h6>
@include('search.parts.term-list', ['type' => 'exact', 'currentList' => $options->exacts->toValueArray()])
@include('search.parts.term-list', ['type' => 'exact', 'currentList' => $options->exacts->nonNegated()->toValueArray()])
<h6>{{ trans('entities.search_tags') }}</h6>
@include('search.parts.term-list', ['type' => 'tags', 'currentList' => $options->tags->toValueArray()])
@include('search.parts.term-list', ['type' => 'tags', 'currentList' => $options->tags->nonNegated()->toValueArray()])
@if(!user()->isGuest())
<h6>{{ trans('entities.search_options') }}</h6>

View File

@ -577,6 +577,14 @@ class EntitySearchTest extends TestCase
$this->withHtml($resp)->assertFieldHasValue('extras', '{updated_by:dan} {created_by:dan} -"dog" -[a=b] -{viewed_by_me}');
}
public function test_negated_searches_dont_show_in_inputs()
{
$resp = $this->asEditor()->get('/search?term=' . urlencode('-{created_by:me} -[a=b] -"dog"'));
$this->withHtml($resp)->assertElementNotExists('input[name="tags[]"][value="a=b"]');
$this->withHtml($resp)->assertElementNotExists('input[name="exact[]"][value="dog"]');
$this->withHtml($resp)->assertElementNotExists('input[name="filters[created_by]"][value="me"][checked="checked"]');
}
public function test_searches_with_user_filters_using_me_adds_them_into_advanced_search_form()
{
$resp = $this->asEditor()->get('/search?term=' . urlencode('test {updated_by:me} {created_by:me}'));

View File

@ -123,7 +123,7 @@ class SearchOptionsTest extends TestCase
$options = SearchOptions::fromRequest($request);
$this->assertCount(2, $options->tags->all());
$this->assertEquals('b=c', $options->tags->negated()[0]->value);
$this->assertEquals('b=c', $options->tags->negated()->all()[0]->value);
$this->assertEquals('viewed_by_me', $options->filters->all()[0]->getKey());
$this->assertTrue($options->filters->all()[0]->negated);
$this->assertEquals('dino', $options->exacts->all()[0]->value);