Search: Prevented negated terms filling in UI inputs
Added test to cover.
This commit is contained in:
parent
cd84d08157
commit
966ff91386
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -244,9 +244,9 @@ class SearchOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
// Negated items
|
// Negated items
|
||||||
array_push($options, ...$this->exacts->negated());
|
array_push($options, ...$this->exacts->negated()->all());
|
||||||
array_push($options, ...$this->tags->negated());
|
array_push($options, ...$this->tags->negated()->all());
|
||||||
array_push($options, ...$this->filters->negated());
|
array_push($options, ...$this->filters->negated()->all());
|
||||||
|
|
||||||
return implode(' ', array_map(fn(SearchOption $o) => $o->toString(), $options));
|
return implode(' ', array_map(fn(SearchOption $o) => $o->toString(), $options));
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<h5>{{ trans('entities.search_advanced') }}</h5>
|
<h5>{{ trans('entities.search_advanced') }}</h5>
|
||||||
|
|
||||||
@php
|
@php
|
||||||
$filterMap = $options->filters->toValueMap();
|
$filterMap = $options->filters->nonNegated()->toValueMap();
|
||||||
@endphp
|
@endphp
|
||||||
<form method="get" action="{{ url('/search') }}">
|
<form method="get" action="{{ url('/search') }}">
|
||||||
<h6>{{ trans('entities.search_terms') }}</h6>
|
<h6>{{ trans('entities.search_terms') }}</h6>
|
||||||
|
@ -30,10 +30,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h6>{{ trans('entities.search_exact_matches') }}</h6>
|
<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>
|
<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())
|
@if(!user()->isGuest())
|
||||||
<h6>{{ trans('entities.search_options') }}</h6>
|
<h6>{{ trans('entities.search_options') }}</h6>
|
||||||
|
|
|
@ -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}');
|
$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()
|
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}'));
|
$resp = $this->asEditor()->get('/search?term=' . urlencode('test {updated_by:me} {created_by:me}'));
|
||||||
|
|
|
@ -123,7 +123,7 @@ class SearchOptionsTest extends TestCase
|
||||||
|
|
||||||
$options = SearchOptions::fromRequest($request);
|
$options = SearchOptions::fromRequest($request);
|
||||||
$this->assertCount(2, $options->tags->all());
|
$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->assertEquals('viewed_by_me', $options->filters->all()[0]->getKey());
|
||||||
$this->assertTrue($options->filters->all()[0]->negated);
|
$this->assertTrue($options->filters->all()[0]->negated);
|
||||||
$this->assertEquals('dino', $options->exacts->all()[0]->value);
|
$this->assertEquals('dino', $options->exacts->all()[0]->value);
|
||||||
|
|
Loading…
Reference in New Issue