Skip to content

Commit 4786537

Browse files
authored
[Grid] Add number Filter (#1398)
* Add number Filter * Apply php-cs-fixer changes * Style * Apply php-cs-fixer changes * Style * Apply php-cs-fixer changes --------- Co-authored-by: martineiber <[email protected]>
1 parent 9dcbb4b commit 4786537

File tree

8 files changed

+169
-0
lines changed

8 files changed

+169
-0
lines changed

config/data_index_filters.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ services:
6262
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DatetimeFilter:
6363
tags: [ 'pimcore.studio_backend.search_index.filter' ]
6464

65+
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\NumberFilter:
66+
tags: [ 'pimcore.studio_backend.search_index.filter' ]
67+
6568
# DataObject
6669
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\ClassNameFilter:
6770
tags: [ 'pimcore.studio_backend.search_index.data_object.filter' ]

doc/03_Grid.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ Available filters are:
4848
| system.integer | integer | | true |
4949
| system.fulltext | string | | false |
5050
| system.boolean | boolean or null | | true |
51+
| system.number | object | `from`, `to`, `is`, `setting` | true |
5152
| classificationstore.string | string | | true |
5253
| classificationstore.rbga | array of integer | `r`,`g`,`b`,`a` | true |
5354
| classificationstore.date | object of ISO 8601 | `from`, `to`, or `on` | true |
@@ -102,6 +103,22 @@ Filter by Tags:
102103
...
103104
```
104105

106+
Filter by Number:
107+
```json
108+
...
109+
"columnFilters" [
110+
{
111+
"type": "system.number",
112+
"key": "id",
113+
"filterValue": {
114+
"setting": "less",
115+
"to": 100
116+
}
117+
}
118+
]
119+
...
120+
```
121+
105122
Classification Store Basic Filter Value:
106123
The filter value of a Classification Store looks a bit difrent. All Filter need to have a groupId and keyId
107124
```json
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
/**
5+
* This source file is available under the terms of the
6+
* Pimcore Open Core License (POCL)
7+
* Full copyright and license information is available in
8+
* LICENSE.md which is distributed with this source code.
9+
*
10+
* @copyright Copyright (c) Pimcore GmbH (https://www.pimcore.com)
11+
* @license Pimcore Open Core License (POCL)
12+
*/
13+
14+
namespace Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter;
15+
16+
use Pimcore\Bundle\StudioBackendBundle\DataIndex\Query\QueryInterface;
17+
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\InvalidArgumentException;
18+
use Pimcore\Bundle\StudioBackendBundle\Grid\Column\ColumnType;
19+
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\ColumnFilter;
20+
use Pimcore\Bundle\StudioBackendBundle\MappedParameter\Filter\ColumnFiltersParameterInterface;
21+
22+
/**
23+
* @internal
24+
*/
25+
final class NumberFilter implements FilterInterface
26+
{
27+
public function apply(mixed $parameters, QueryInterface $query): QueryInterface
28+
{
29+
if (!$parameters instanceof ColumnFiltersParameterInterface) {
30+
return $query;
31+
}
32+
33+
foreach ($parameters->getColumnFilterByType(ColumnType::SYSTEM_NUMBER->value) as $column) {
34+
$query = $this->applyNumberFilter($column, $query);
35+
}
36+
37+
return $query;
38+
}
39+
40+
private function applyNumberFilter(ColumnFilter $column, QueryInterface $query): QueryInterface
41+
{
42+
$fiterValue = $column->getFilterValue();
43+
44+
if (!isset($fiterValue['setting'])) {
45+
throw new InvalidArgumentException('This filter requires a setting value');
46+
}
47+
$setting = $fiterValue['setting'];
48+
49+
if (isset($fiterValue['is']) && $setting == 'is') {
50+
return $query->filterNumber($column->getKey(), $fiterValue['is']);
51+
}
52+
53+
if (isset($fiterValue['to']) && $setting == 'less') {
54+
return $query->filterNumberRange($column->getKey(), null, $fiterValue['to']);
55+
}
56+
57+
if (isset($fiterValue['from']) && $setting == 'more') {
58+
return $query->filterNumberRange($column->getKey(), $fiterValue['from'], null);
59+
}
60+
61+
if ($setting == 'between') {
62+
return $query->filterNumberRange($column->getKey(), $fiterValue['from'], $fiterValue['to']);
63+
}
64+
65+
throw new InvalidArgumentException('Unable to apply number filter no correct setting given');
66+
}
67+
}

src/DataIndex/Query/AssetQuery.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdFilter;
2222
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdsFilter;
2323
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IntegerFilter;
24+
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\NumberFilter;
2425
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
26+
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
2527
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ParentIdFilter;
2628
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
2729
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
@@ -196,4 +198,25 @@ public function filterFullText(string $value): QueryInterface
196198

197199
return $this;
198200
}
201+
202+
public function filterNumber(
203+
string $fieldName,
204+
int|float $searchTerm,
205+
bool $enablePqlFieldNameResolution = true
206+
): self {
207+
$this->search->addModifier(new NumberFilter($fieldName, $searchTerm, $enablePqlFieldNameResolution));
208+
209+
return $this;
210+
}
211+
212+
public function filterNumberRange(
213+
string $fieldName,
214+
int|float|null $min = null,
215+
int|float|null $max = null,
216+
bool $enablePqlFieldNameResolution = true
217+
): self {
218+
$this->search->addModifier(new NumberRangeFilter($fieldName, $min, $max, $enablePqlFieldNameResolution));
219+
220+
return $this;
221+
}
199222
}

src/DataIndex/Query/DataObjectQuery.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdFilter;
2323
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdsFilter;
2424
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IntegerFilter;
25+
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\NumberFilter;
2526
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\ClassificationStoreFilter;
2627
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
2728
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\MultiSelectFilter;
@@ -270,4 +271,25 @@ public function classificationStoreFilter(
270271

271272
return $this;
272273
}
274+
275+
public function filterNumber(
276+
string $fieldName,
277+
int|float $searchTerm,
278+
bool $enablePqlFieldNameResolution = true
279+
): self {
280+
$this->search->addModifier(new NumberFilter($fieldName, $searchTerm, $enablePqlFieldNameResolution));
281+
282+
return $this;
283+
}
284+
285+
public function filterNumberRange(
286+
string $fieldName,
287+
int|float|null $min = null,
288+
int|float|null $max = null,
289+
bool $enablePqlFieldNameResolution = true
290+
): self {
291+
$this->search->addModifier(new NumberRangeFilter($fieldName, $min, $max, $enablePqlFieldNameResolution));
292+
293+
return $this;
294+
}
273295
}

src/DataIndex/Query/DocumentQuery.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdFilter;
2222
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdsFilter;
2323
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IntegerFilter;
24+
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\NumberFilter;
2425
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
26+
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
2527
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ParentIdFilter;
2628
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
2729
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
@@ -204,4 +206,25 @@ public function filterDatetime(
204206

205207
return $this;
206208
}
209+
210+
public function filterNumber(
211+
string $fieldName,
212+
int|float $searchTerm,
213+
bool $enablePqlFieldNameResolution = true
214+
): self {
215+
$this->search->addModifier(new NumberFilter($fieldName, $searchTerm, $enablePqlFieldNameResolution));
216+
217+
return $this;
218+
}
219+
220+
public function filterNumberRange(
221+
string $fieldName,
222+
int|float|null $min = null,
223+
int|float|null $max = null,
224+
bool $enablePqlFieldNameResolution = true
225+
): self {
226+
$this->search->addModifier(new NumberRangeFilter($fieldName, $min, $max, $enablePqlFieldNameResolution));
227+
228+
return $this;
229+
}
207230
}

src/DataIndex/Query/QueryInterface.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,17 @@ public function filterDatetime(
6969
bool $roundToDay = true,
7070
bool $enablePqlFieldNameResolution = true
7171
): self;
72+
73+
public function filterNumber(
74+
string $fieldName,
75+
int|float $searchTerm,
76+
bool $enablePqlFieldNameResolution = true
77+
): self;
78+
79+
public function filterNumberRange(
80+
string $fieldName,
81+
int|float|null $min = null,
82+
int|float|null $max = null,
83+
bool $enablePqlFieldNameResolution = true
84+
): self;
7285
}

src/Grid/Column/ColumnType.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ enum ColumnType: string
2323
case SYSTEM_BOOLEAN = 'system.boolean';
2424
case SYSTEM_TAG = 'system.tag';
2525
case SYSTEM_PQL_QUERY = 'system.pql';
26+
case SYSTEM_NUMBER = 'system.number';
2627
case SYSTEM_FULLTEXT = 'system.fulltext';
2728
case METADATA_SELECT = 'metadata.select';
2829
case METADATA_INPUT = 'metadata.input';

0 commit comments

Comments
 (0)