Skip to content

Commit 03ff9e0

Browse files
committed
Improve API of grid filters and grid filter states
1 parent 0e01f06 commit 03ff9e0

9 files changed

Lines changed: 122 additions & 28 deletions

File tree

Component/Grid/GridViewModel.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Loki\AdminComponents\Grid\Column\Column;
66
use Loki\AdminComponents\Grid\Filter\FilterFactory;
77
use Loki\AdminComponents\Grid\Filter\StaticFilterInterface;
8+
use Loki\AdminComponents\Grid\State\FilterState;
89
use Magento\Framework\Data\OptionSourceInterface;
910
use Magento\Framework\DataObject;
1011
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
@@ -143,7 +144,7 @@ public function getJsData(): array
143144
...parent::getJsData(),
144145
...$this->getState()->toArray(),
145146
'namespace' => $this->getNamespace(),
146-
'gridFilters' => $this->getGridFilterValues(),
147+
'gridFilters' => $this->getGridFilterStates(),
147148
'columnPositions' => $this->getColumnPositions(),
148149
'newUrl' => $this->getNewUrl(),
149150
'indexUrl' => $this->getIndexUrl(),
@@ -288,7 +289,7 @@ public function getButtons(): array
288289
isset($buttonAction['cssClass']) ? (string)$buttonAction['cssClass'] : '',
289290
isset($buttonAction['url']) ? (string)$buttonAction['url'] : '',
290291
isset($buttonAction['subButtons']) ? (string)$buttonAction['subButtons'] : [],
291-
isset($buttonAction['primary']) ?(bool)$buttonAction['primary'] : false,
292+
isset($buttonAction['primary']) ? (bool)$buttonAction['primary'] : false,
292293
);
293294
}
294295
}
@@ -323,26 +324,29 @@ public function getGridFilters(): array
323324
return [];
324325
}
325326

326-
foreach($gridFilterDefinitions as $gridFilterDefinition) {
327+
foreach ($gridFilterDefinitions as $gridFilterDefinition) {
327328
$gridFilters[] = $this->filterFactory->createFromArray($gridFilterDefinition);
328329
}
329330

330331
return $gridFilters;
331332
}
332333

333-
public function getGridFilterValues(): array
334+
/**
335+
* @return FilterState[]
336+
*/
337+
public function getGridFilterStates(): array
334338
{
335-
$gridFilterValues = [];
339+
$gridFilterStates = [];
336340
foreach ($this->getGridFilters() as $gridFilter) {
337-
$value = $this->getState()->getFilterValue($gridFilter->getCode());
338-
if (empty($value)) {
341+
$filterState = $this->getState()->getFilterState($gridFilter->getCode());
342+
if (empty($filterState)) {
339343
continue;
340344
}
341345

342-
$gridFilterValues[$gridFilter->getCode()] = $value;
346+
$gridFilterStates[$gridFilter->getCode()] = $filterState;
343347
}
344348

345-
return $gridFilterValues;
349+
return $gridFilterStates;
346350
}
347351

348352
public function getCellActions(DataObject $item): array

Form/Field/FieldFactory.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public function create(
3838
$data['field_type'] = $this->fieldTypeProvider->getFieldTypeByCode($data['field_type']);
3939
}
4040

41+
if (false === $data['field_type'] instanceof FieldTypeInterface) {
42+
throw new \RuntimeException((string)__('Field type "%1" could not be resolved', $data['field_type']));
43+
}
44+
4145
if (!isset($data['scope'])) {
4246
$data['scope'] = 'item';
4347
}

Grid/Action/FilterAction.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public function execute(GridRepository $gridRepository, array $value): void
2626
$state->setFilter(
2727
(string)$value['filter']['name'],
2828
(string)$value['filter']['value'],
29+
isset($value['filter']['condition_type']) ? (string)$value['filter']['condition_type'] : 'eq',
2930
);
3031
}
3132
}

Grid/Filter/Filter.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,6 @@ private function getFieldType(): string
6767
return 'select';
6868
}
6969

70-
return 'text';
70+
return 'input';
7171
}
7272
}

Grid/State.php

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
namespace Loki\AdminComponents\Grid;
55

66
use Loki\AdminComponents\Grid\Column\Column;
7+
use Loki\AdminComponents\Grid\Filter\Filter;
8+
use Loki\AdminComponents\Grid\State\FilterState;
9+
use Loki\AdminComponents\Grid\State\FilterStateFactory;
710
use Magento\Backend\Model\Session;
811
use Magento\Framework\Data\Collection\AbstractDb;
912

1013
class State
1114
{
1215
public function __construct(
1316
private Session $session,
17+
private FilterStateFactory $filterStateFactory,
1418
private string $namespace,
1519
private int $defaultLimit = 20,
1620
) {
@@ -76,6 +80,7 @@ public function getSortDirection(): string
7680
{
7781
$sortDirection = strtoupper((string)$this->get('sort_direction'));
7882
$sortDirection = $sortDirection === AbstractDb::SORT_ORDER_ASC ? AbstractDb::SORT_ORDER_ASC : AbstractDb::SORT_ORDER_DESC;
83+
7984
return $sortDirection;
8085
}
8186

@@ -125,17 +130,36 @@ public function setSearchableFields(array $searchableFields): void
125130
$this->save('searchable_fields', implode(',', $searchableFields));
126131
}
127132

133+
/**
134+
* @return FilterState[]
135+
* @todo Rename this getFilterStates()
136+
*/
128137
public function getFilters(): array
129138
{
130-
$filters = json_decode((string)$this->get('filters'), true);
131-
if (is_array($filters)) {
132-
return $filters;
139+
$filters = [];
140+
$filtersData = json_decode((string)$this->get('filters'), true);
141+
if (false === is_array($filtersData)) {
142+
return [];
143+
}
144+
145+
foreach ($filtersData as $filterData) {
146+
if (!isset($filterData['value'])
147+
|| !isset($filterData['field'])
148+
|| !isset($filterData['condition_type'])) {
149+
continue;
150+
}
151+
152+
$filters[$filterData['field']] = $this->filterStateFactory->create(
153+
$filterData['field'],
154+
$filterData['value'],
155+
$filterData['condition_type'],
156+
);
133157
}
134158

135-
return [];
159+
return $filters;
136160
}
137161

138-
public function getFilterValue(string $name): mixed
162+
public function getFilterState(string $name): ?FilterState
139163
{
140164
$filters = $this->getFilters();
141165
if (isset($filters[$name])) {
@@ -148,16 +172,16 @@ public function getFilterValue(string $name): mixed
148172
public function setFilter(string $name, mixed $value, ?string $conditionType = 'eq'): void
149173
{
150174
$filters = $this->getFilters();
151-
if (empty($value) && isset($filters[$name])) {
175+
if (isset($filters[$name])) {
152176
unset($filters[$name]);
153-
} else {
154-
$filters[$name] = [
155-
'field' => $name,
156-
'value' => $value,
157-
'condition_type' => $conditionType,
158-
];
159177
}
160178

179+
$filters[$name] = [
180+
'field' => $name,
181+
'value' => $value,
182+
'condition_type' => $conditionType,
183+
];
184+
161185
$this->setFilters($filters);
162186
}
163187

Grid/State/FilterState.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Loki\AdminComponents\Grid\State;
5+
6+
class FilterState
7+
{
8+
public function __construct(
9+
private string $field,
10+
private string $value,
11+
private string $conditionType,
12+
) {
13+
}
14+
15+
public function getField(): string
16+
{
17+
return $this->field;
18+
}
19+
20+
public function getValue(): string
21+
{
22+
return $this->value;
23+
}
24+
25+
public function getConditionType(): string
26+
{
27+
return $this->conditionType;
28+
}
29+
30+
31+
}

Grid/State/FilterStateFactory.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Loki\AdminComponents\Grid\State;
4+
5+
use Magento\Framework\ObjectManagerInterface;
6+
7+
class FilterStateFactory
8+
{
9+
public function __construct(
10+
private ObjectManagerInterface $objectManager,
11+
) {
12+
}
13+
14+
public function create(
15+
string $field,
16+
string $value,
17+
string $conditionType = '',
18+
): FilterState {
19+
return $this->objectManager->create(FilterState::class, [
20+
'field' => $field,
21+
'value' => $value,
22+
'conditionType' => $conditionType,
23+
]);
24+
}
25+
}

ProviderHandler/RepositoryHandler.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ private function getFilterGroups(GridState $gridState): array
153153
}
154154

155155
foreach ($gridState->getFilters() as $filterData) {
156+
if (!is_array($filterData)) {
157+
continue;
158+
}
159+
156160
$filter = $this->filterFactory->create();
157161
$filter->setField($filterData['field']);
158162
$filter->setValue($filterData['value']);

view/adminhtml/templates/grid/filters.phtml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ use Loki\Components\Util\Block\TemplateRenderer;
1515

1616
$viewModel = $block->getViewModel();
1717
$gridFilters = $viewModel->getGridFilters();
18-
$gridFilterValues = $viewModel->getGridFilterValues();
18+
$gridFilterStates = $viewModel->getGridFilterStates();
19+
1920
if (empty($gridFilters)) {
2021
return;
2122
}
@@ -28,7 +29,7 @@ if (empty($gridFilters)) {
2829
</div>
2930
</div>
3031

31-
<?php if (!empty($gridFilterValues)): ?>
32+
<?php if (!empty($gridFilterStates)): ?>
3233
<div class="admin__data-grid-filters-current _show">
3334
<div class="admin__current-filters-title-wrap">
3435
<span class="admin__current-filters-title">
@@ -37,10 +38,10 @@ if (empty($gridFilters)) {
3738
</div>
3839
<div class="admin__current-filters-list-wrap">
3940
<ul class="admin__current-filters-list" data-role="filter-list">
40-
<?php foreach ($gridFilterValues as $gridFilterName => $gridFilterValue): ?>
41+
<?php foreach ($gridFilterStates as $gridFilterState): ?>
4142
<li>
42-
<span class="label"><?= $escaper->escapeHtml($gridFilterName) ?></span>:
43-
<span class="preview"><?= $escaper->escapeHtml($gridFilterValue) ?></span>
43+
<span class="label"><?= $escaper->escapeHtml($gridFilterState->getField()) ?></span>:
44+
<span class="preview"><?= $escaper->escapeHtml($gridFilterState->getValue()) ?></span>
4445
</li>
4546
<?php endforeach; ?>
4647
</ul>
@@ -60,7 +61,7 @@ if (empty($gridFilters)) {
6061
<?php if (!empty($gridFilterValues)): ?>
6162
<div class="admin__data-grid-filters-footer">
6263
<div class="admin__footer-main-actions">
63-
<button class="action-tertiary" type="button" @click="toggleFilters">
64+
<button class="action-tertiary" type="button" @click="clearFilters">
6465
<span>Clear all filters</span>
6566
</button>
6667
</div>

0 commit comments

Comments
 (0)