Added test to cover.
}
/**
- * @return T[]
+ * @return self<T>
+ */
+ public function negated(): self
+ {
+ $values = array_values(array_filter($this->options, fn (SearchOption $option) => $option->negated));
+ return new self($values);
+ }
+
+ /**
+ * @return self<T>
*/
- public function negated(): array
+ public function nonNegated(): 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);
}
}
}
// 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));
}
<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>
</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>
$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}'));
$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);