diff --git a/composer.json b/composer.json
index 0cba69499..ff99b0092 100644
--- a/composer.json
+++ b/composer.json
@@ -21,7 +21,7 @@
"league/csv": "^9.22",
"nesbot/carbon": "^3.8.4",
"pimcore/static-resolver-bundle": "^3.3.0",
- "pimcore/generic-data-index-bundle": "^2.2.1",
+ "pimcore/generic-data-index-bundle": "^2.3.0",
"pimcore/pimcore": "^12.3",
"zircote/swagger-php": "^4.8 || ^5.0",
"ext-zip": "*",
diff --git a/config/data_index_filters.yaml b/config/data_index_filters.yaml
index 6d6ead1de..f66df6197 100644
--- a/config/data_index_filters.yaml
+++ b/config/data_index_filters.yaml
@@ -83,6 +83,9 @@ services:
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\RGBAFilter:
tags: [ 'pimcore.studio_backend.search_index.filter' ]
+ Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\TimeFilter:
+ tags: [ 'pimcore.studio_backend.search_index.filter' ]
+
# DataObject
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\ClassNameFilter:
tags: [ 'pimcore.studio_backend.search_index.data_object.filter' ]
@@ -120,5 +123,8 @@ services:
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\Classificationstore\BooleanFilter:
tags: [ 'pimcore.studio_backend.search_index.data_object.filter' ]
+ Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\Classificationstore\TimeFilter:
+ tags: [ 'pimcore.studio_backend.search_index.data_object.filter' ]
+
Pimcore\Bundle\StudioBackendBundle\DataIndex\Filter\DataObject\CRM\ConsentFilter:
tags: [ 'pimcore.studio_backend.search_index.data_object.filter' ]
diff --git a/doc/03_Grid.md b/doc/03_Grid.md
index 891c402ba..bfdbcdd5c 100644
--- a/doc/03_Grid.md
+++ b/doc/03_Grid.md
@@ -34,6 +34,7 @@ Available filters are:
| system.string | string | Wildcard search can be used | true |
| system.datetime | object of ISO 8601 | `from`, `to`, or `on` | true |
| system.date | object of ISO 8601
will round to day | `from`, `to`, or `on` | true |
+| system.time | object (12:15) | `from`, `to`, or `on` | true |
| system.tag | object | `considerChildTags`, `tags` | false |
| system.pql | string | PQL Query | false |
| system.id | integer | | false |
@@ -50,6 +51,7 @@ Available filters are:
| classificationstore.rbga | object | `r`,`g`,`b`,`a` | true |
| classificationstore.date | object of ISO 8601
will round to day | `from`, `to`, or `on` | true |
| classificationstore.datetime | object of ISO 8601 | `from`, `to`, or `on` | true |
+| classificationstore.time | object (12:45) | `from`, `to`, or `on` | true |
| classificationstore.quantity_value | sting, integer | `from`, `to`, `is`, `setting`, `unitId` | true |
| classificationstore.input_quantity_value | string | `unitId`(string), `value`(string) | true |
| classificationstore.select | array | | true |
diff --git a/src/DataIndex/Filter/DataObject/Classificationstore/TimeFilter.php b/src/DataIndex/Filter/DataObject/Classificationstore/TimeFilter.php
new file mode 100644
index 000000000..98c7becdb
--- /dev/null
+++ b/src/DataIndex/Filter/DataObject/Classificationstore/TimeFilter.php
@@ -0,0 +1,141 @@
+getColumnFilterByType(ColumnType::CLASSIFICATION_STORE_TIME->value) as $column) {
+ $filterValue = $this->getClassificationStoreFilterValue($column->getFilterValue());
+ $key = $this->keyGroupRelationRepository->getByKeyId($filterValue->getKeyId());
+ $group = $this->groupConfigRepository->getById($filterValue->getGroupId());
+ /** @var DataObjectQueryInterface $query */
+ $query = $this->applyTimeFilter($column, $query, $key, $group, $filterValue);
+ }
+
+ return $query;
+ }
+
+ private function applyTimeFilter(
+ ColumnFilter $column,
+ DataObjectQueryInterface $query,
+ KeyGroupRelation $key,
+ GroupConfig $group,
+ ClassificationStoreFilterValue $filterValue,
+ ): QueryInterface {
+
+ $value = $filterValue->getValue();
+
+ if (isset($value['from'], $value['to'])) {
+
+ $query->classificationStoreFilter(
+ $column->getKeyWithOutLocale(),
+ $group->getName(),
+ $this->buildTimeFilterModifier(
+ $key->getName(),
+ $value['from'],
+ $value['to']
+ ),
+ $column->getLocale()
+ );
+
+ return $query;
+ }
+
+ if (isset($value['on'])) {
+ $query->classificationStoreFilter(
+ $column->getKeyWithOutLocale(),
+ $group->getName(),
+ $this->buildTimeFilterModifier(
+ $key->getName(),
+ null,
+ null,
+ $value['on']
+ ),
+ $column->getLocale()
+ );
+ }
+
+ if (isset($value['to'])) {
+ $query->classificationStoreFilter(
+ $column->getKeyWithOutLocale(),
+ $group->getName(),
+ $this->buildTimeFilterModifier(
+ $key->getName(),
+ null,
+ $value['to']
+ ),
+ $column->getLocale()
+ );
+ }
+
+ if (isset($value['from'])) {
+ $query->classificationStoreFilter(
+ $column->getKeyWithOutLocale(),
+ $group->getName(),
+ $this->buildTimeFilterModifier(
+ $key->getName(),
+ $value['from']
+ ),
+ $column->getLocale()
+ );
+ }
+
+ return $query;
+ }
+
+ private function buildTimeFilterModifier(
+ string $field,
+ ?string $startTime = null,
+ ?string $endTime = null,
+ ?string $onTime = null,
+ ): GDITimeFilter {
+ return new GDITimeFilter($field, $startTime, $endTime, $onTime);
+ }
+}
diff --git a/src/DataIndex/Filter/DateTimeTrait.php b/src/DataIndex/Filter/DateTimeTrait.php
index bd71c6441..2bb2ff0a5 100644
--- a/src/DataIndex/Filter/DateTimeTrait.php
+++ b/src/DataIndex/Filter/DateTimeTrait.php
@@ -201,7 +201,6 @@ private function applyClassificationStoreDateFilter(
),
$column->getLocale()
);
- $query->filterDatetime($column->getKey(), $this->getFromAsCarbon());
}
return $query;
diff --git a/src/DataIndex/Filter/TimeFilter.php b/src/DataIndex/Filter/TimeFilter.php
new file mode 100644
index 000000000..42d617099
--- /dev/null
+++ b/src/DataIndex/Filter/TimeFilter.php
@@ -0,0 +1,79 @@
+getColumnFilterByType(ColumnType::SYSTEM_TIME->value) as $column) {
+ $query = $this->applyDatetimeFilter($column, $query);
+ }
+
+ return $query;
+ }
+
+ private function applyDatetimeFilter(
+ ColumnFilter $column,
+ QueryInterface $query,
+ ): QueryInterface {
+
+ if (!is_array($column->getFilterValue())) {
+ throw new InvalidArgumentException('Filter value for this filter must be an array');
+ }
+
+ $filterValue = $column->getFilterValue();
+
+ if (isset($filterValue['from'], $filterValue['to'])) {
+ $query->filterTime(
+ $column->getKey(),
+ $filterValue['from'],
+ $filterValue['to']
+ );
+
+ return $query;
+ }
+
+ if (isset($filterValue['on'])) {
+ $query->filterTime($column->getKey(), null, null, $filterValue['on']);
+ }
+
+ if (isset($filterValue['to'])) {
+ $query->filterTime($column->getKey(), null, $filterValue['to']);
+ }
+
+ if (isset($filterValue['from'])) {
+ $query->filterTime($column->getKey(), $filterValue['from']);
+ }
+
+ return $query;
+ }
+}
diff --git a/src/DataIndex/Query/AssetQuery.php b/src/DataIndex/Query/AssetQuery.php
index abbb570c9..730005502 100644
--- a/src/DataIndex/Query/AssetQuery.php
+++ b/src/DataIndex/Query/AssetQuery.php
@@ -26,6 +26,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\MultiSelectFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
+use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\TimeFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ParentIdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
@@ -162,6 +163,24 @@ public function filterDatetime(
return $this;
}
+ public function filterTime(
+ string $field,
+ string|null $startTime = null,
+ string|null $endTime = null,
+ string|null $onTime = null,
+ bool $enablePqlFieldNameResolution = true
+ ): QueryInterface {
+ $this->search->addModifier(new TimeFilter(
+ $field,
+ $startTime,
+ $endTime,
+ $onTime,
+ $enablePqlFieldNameResolution
+ ));
+
+ return $this;
+ }
+
/**
* @param array $tags
*/
diff --git a/src/DataIndex/Query/DataObjectQuery.php b/src/DataIndex/Query/DataObjectQuery.php
index 746d6d467..f56e1ad97 100644
--- a/src/DataIndex/Query/DataObjectQuery.php
+++ b/src/DataIndex/Query/DataObjectQuery.php
@@ -28,6 +28,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\MultiSelectFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
+use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\TimeFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ClassIdsFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ParentIdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
@@ -251,6 +252,24 @@ public function filterDatetime(
return $this;
}
+ public function filterTime(
+ string $field,
+ string|null $startTime = null,
+ string|null $endTime = null,
+ string|null $onTime = null,
+ bool $enablePqlFieldNameResolution = true
+ ): QueryInterface {
+ $this->search->addModifier(new TimeFilter(
+ $field,
+ $startTime,
+ $endTime,
+ $onTime,
+ $enablePqlFieldNameResolution
+ ));
+
+ return $this;
+ }
+
public function booleanFilter(string $fieldName, array $values): self
{
$this->search->addModifier(new BooleanMultiSelectFilter($fieldName, $values));
@@ -269,6 +288,7 @@ public function classificationStoreFilter(
NumberRangeFilter|
NumberFilter|
BooleanMultiSelectFilter|
+ TimeFilter|
WildcardSearch $subModifier,
?string $locale = null
): self {
diff --git a/src/DataIndex/Query/DataObjectQueryInterface.php b/src/DataIndex/Query/DataObjectQueryInterface.php
index 3cd0d98b1..05ceffe94 100644
--- a/src/DataIndex/Query/DataObjectQueryInterface.php
+++ b/src/DataIndex/Query/DataObjectQueryInterface.php
@@ -21,6 +21,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\MultiSelectFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
+use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\TimeFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\FullTextSearch;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\FullTextSearch\WildcardSearch;
@@ -51,6 +52,7 @@ public function classificationStoreFilter(
MultiSelectFilter|
NumberRangeFilter|
NumberFilter|
+ TimeFilter|
BooleanMultiSelectFilter|
WildcardSearch $subModifier,
?string $locale
diff --git a/src/DataIndex/Query/DocumentQuery.php b/src/DataIndex/Query/DocumentQuery.php
index aaf5e27b1..ecc3e37f4 100644
--- a/src/DataIndex/Query/DocumentQuery.php
+++ b/src/DataIndex/Query/DocumentQuery.php
@@ -26,6 +26,7 @@
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\DateFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\MultiSelectFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\NumberRangeFilter;
+use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\FieldType\TimeFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\ParentIdFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\PathFilter;
use Pimcore\Bundle\GenericDataIndexBundle\Model\Search\Modifier\Filter\Tree\TagFilter;
@@ -209,6 +210,24 @@ public function filterDatetime(
return $this;
}
+ public function filterTime(
+ string $field,
+ string|null $startTime = null,
+ string|null $endTime = null,
+ string|null $onTime = null,
+ bool $enablePqlFieldNameResolution = true
+ ): QueryInterface {
+ $this->search->addModifier(new TimeFilter(
+ $field,
+ $startTime,
+ $endTime,
+ $onTime,
+ $enablePqlFieldNameResolution
+ ));
+
+ return $this;
+ }
+
public function filterNumber(
string $fieldName,
int|float $searchTerm,
diff --git a/src/DataIndex/Query/QueryInterface.php b/src/DataIndex/Query/QueryInterface.php
index 673a3297f..f93b9b390 100644
--- a/src/DataIndex/Query/QueryInterface.php
+++ b/src/DataIndex/Query/QueryInterface.php
@@ -70,6 +70,14 @@ public function filterDatetime(
bool $enablePqlFieldNameResolution = true
): self;
+ public function filterTime(
+ string $field,
+ string|null $startTime = null,
+ string|null $endTime = null,
+ string|null $onTime = null,
+ bool $enablePqlFieldNameResolution = true
+ ): self;
+
public function filterNumber(
string $fieldName,
int|float $searchTerm,
diff --git a/src/Grid/Column/ColumnType.php b/src/Grid/Column/ColumnType.php
index 53340c569..e60005faf 100644
--- a/src/Grid/Column/ColumnType.php
+++ b/src/Grid/Column/ColumnType.php
@@ -20,6 +20,7 @@ enum ColumnType: string
case SYSTEM_INTEGER = 'system.integer';
case SYSTEM_ID = 'system.id';
case SYSTEM_DATETIME = 'system.datetime';
+ case SYSTEM_TIME = 'system.time';
case SYSTEM_DATE = 'system.date';
case SYSTEM_BOOLEAN = 'system.boolean';
case SYSTEM_TAG = 'system.tag';
@@ -44,6 +45,7 @@ enum ColumnType: string
case CLASSIFICATION_STORE_RGBA = 'classificationstore.rgba';
case CLASSIFICATION_STORE_DATE = 'classificationstore.date';
case CLASSIFICATION_STORE_DATETIME = 'classificationstore.datetime';
+ case CLASSIFICATION_STORE_TIME = 'classificationstore.time';
case CLASSIFICATION_STORE_QUANTITY_VALUE = 'classificationstore.quantity_value';
case CLASSIFICATION_STORE_INPUT_QUANTITY_VALUE = 'classificationstore.input_quantity_value';
case CLASSIFICATION_STORE_QUANTITY_VALUE_RANGE = 'classificationstore.quantity_value_range';