From 058958eda935072dea44c43c00b8d7e2dbba511b Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Thu, 28 May 2026 14:32:36 +0200 Subject: [PATCH] Add a filter to show only Unreferenced Assets. --- composer.json | 4 +- config/data_index_filters.yaml | 4 ++ doc/01_Architecture_Overview/01_Grid.md | 13 +++++ .../Filter/Asset/UnreferencedFilter.php | 49 +++++++++++++++++++ src/DataIndex/Query/AssetQuery.php | 8 +++ src/DataIndex/Query/AssetQueryInterface.php | 2 + src/Grid/Column/ColumnType.php | 1 + 7 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/DataIndex/Filter/Asset/UnreferencedFilter.php diff --git a/composer.json b/composer.json index d25f64682..7354d05f0 100644 --- a/composer.json +++ b/composer.json @@ -21,8 +21,8 @@ "league/csv": "^9.27", "nesbot/carbon": "^3.8.4", "pimcore/static-resolver-bundle": "^3.6.1 ", - "pimcore/generic-data-index-bundle": "^2.5.0", - "pimcore/pimcore": "^12.3", + "pimcore/generic-data-index-bundle": "^2.5.3", + "pimcore/pimcore": "^12.3.9", "zircote/swagger-php": "^4.8 || ^5.0", "ext-zip": "*", "symfony/mercure": "^0.6.5", diff --git a/config/data_index_filters.yaml b/config/data_index_filters.yaml index 80d98fe5b..d53131d39 100644 --- a/config/data_index_filters.yaml +++ b/config/data_index_filters.yaml @@ -131,3 +131,7 @@ services: Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\CRM\ConsentFilter: tags: [ 'pimcore.studio_backend.search_index.data_object.filter' ] + + # Asset + Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\Asset\UnreferencedFilter: + tags: [ 'pimcore.studio_backend.search_index.asset.filter' ] diff --git a/doc/01_Architecture_Overview/01_Grid.md b/doc/01_Architecture_Overview/01_Grid.md index f1600b4d5..92ffc33bd 100644 --- a/doc/01_Architecture_Overview/01_Grid.md +++ b/doc/01_Architecture_Overview/01_Grid.md @@ -135,6 +135,7 @@ Available filters are: | classificationstore.number | object | `from`, `to`, `is`, `setting` | true | | crm.consent | array | `true` or `false` | true | | dataobject.relation | array | array of `type`, `ids` objects | true | +| system.unreferenced | boolean | Asset grid only — unreferenced assets | false | ### Examples: @@ -242,6 +243,18 @@ To filter by this structure: ... ``` +Filter unreferenced assets (asset grid only): +```json +... +"columnFilters" [ + { + "type": "system.unreferenced", + "filterValue": true + } +] +... +``` + ## Advanced Columns Advanced columns combine multiple data sources and transformers. Data source types: diff --git a/src/DataIndex/Filter/Asset/UnreferencedFilter.php b/src/DataIndex/Filter/Asset/UnreferencedFilter.php new file mode 100644 index 000000000..adfc9991c --- /dev/null +++ b/src/DataIndex/Filter/Asset/UnreferencedFilter.php @@ -0,0 +1,49 @@ +getSimpleColumnFilterByType(ColumnType::SYSTEM_UNREFERENCED->value); + + if ($filter === null) { + return $query; + } + + if ($filter->getFilterValue() === true) { + $query->filterUnreferenced(); + } + + return $query; + } +} diff --git a/src/DataIndex/Query/AssetQuery.php b/src/DataIndex/Query/AssetQuery.php index 6057e925a..6a8707012 100644 --- a/src/DataIndex/Query/AssetQuery.php +++ b/src/DataIndex/Query/AssetQuery.php @@ -22,6 +22,7 @@ use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IdsFilter; use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\IntegerFilter; use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Basic\NumberFilter; +use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Dependency\UnreferencedFilter; use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\BooleanMultiSelectFilter; use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter; use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\MultiSelectFilter; @@ -128,6 +129,13 @@ public function filterMetadata(string $name, string $type, mixed $data): self return $this; } + public function filterUnreferenced(): self + { + $this->search->addModifier(new UnreferencedFilter()); + + return $this; + } + public function orderByField(string $fieldName, SortDirection $direction): self { $this->search->addModifier(new OrderByField($fieldName, $direction)); diff --git a/src/DataIndex/Query/AssetQueryInterface.php b/src/DataIndex/Query/AssetQueryInterface.php index 4a332f36c..762b0e02b 100644 --- a/src/DataIndex/Query/AssetQueryInterface.php +++ b/src/DataIndex/Query/AssetQueryInterface.php @@ -22,5 +22,7 @@ interface AssetQueryInterface extends QueryInterface { public function filterMetadata(string $name, string $type, mixed $data): self; + public function filterUnreferenced(): self; + public function getSearch(): AssetSearchInterface; } diff --git a/src/Grid/Column/ColumnType.php b/src/Grid/Column/ColumnType.php index 9c27b6769..d9c1e6a01 100644 --- a/src/Grid/Column/ColumnType.php +++ b/src/Grid/Column/ColumnType.php @@ -23,6 +23,7 @@ enum ColumnType: string case SYSTEM_TIME = 'system.time'; case SYSTEM_DATE = 'system.date'; case SYSTEM_BOOLEAN = 'system.boolean'; + case SYSTEM_UNREFERENCED = 'system.unreferenced'; case SYSTEM_TAG = 'system.tag'; case SYSTEM_PQL_QUERY = 'system.pql'; case SYSTEM_NUMBER = 'system.number';