diff --git a/src/Admin/Filter/ProcessExecutionDurationFilter.php b/src/Admin/Filter/ProcessExecutionDurationFilter.php new file mode 100644 index 0000000..5f5836f --- /dev/null +++ b/src/Admin/Filter/ProcessExecutionDurationFilter.php @@ -0,0 +1,58 @@ +setFilterFqcn(self::class) + ->setProperty($propertyName) + ->setLabel($label) + ->setFormType(NumericFilterType::class) + ->setFormTypeOption('translation_domain', 'EasyAdminBundle'); + } + + public function apply(QueryBuilder $queryBuilder, FilterDataDto $filterDataDto, ?FieldDto $fieldDto, EntityDto $entityDto): void + { + if (\in_array($filterDataDto->getComparison(), ['=', '>', '>=', '<', '<=', '!='])) { + $queryBuilder->andWhere( + \sprintf( + 'entity.endDate %s date_add(entity.startDate, %s, \'SECOND\')', + $filterDataDto->getComparison(), + $filterDataDto->getValue() + ) + ); + } elseif ('between' === $filterDataDto->getComparison()) { + $queryBuilder->andWhere( + \sprintf( + 'entity.endDate BETWEEN date_add(entity.startDate, %s, \'SECOND\') and date_add(entity.startDate, %s, \'SECOND\')', + $filterDataDto->getValue(), + $filterDataDto->getValue2() + ) + ); + } + } +} diff --git a/src/Controller/Admin/ProcessExecutionCrudController.php b/src/Controller/Admin/ProcessExecutionCrudController.php index 5e60a60..bd7f27b 100644 --- a/src/Controller/Admin/ProcessExecutionCrudController.php +++ b/src/Controller/Admin/ProcessExecutionCrudController.php @@ -15,6 +15,7 @@ use CleverAge\UiProcessBundle\Admin\Field\ContextField; use CleverAge\UiProcessBundle\Admin\Field\EnumField; +use CleverAge\UiProcessBundle\Admin\Filter\ProcessExecutionDurationFilter; use CleverAge\UiProcessBundle\Entity\ProcessExecution; use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; use EasyCorp\Bundle\EasyAdminBundle\Config\Action; @@ -143,7 +144,13 @@ public function downloadLogFile( public function configureFilters(Filters $filters): Filters { - return $filters->add('code')->add('startDate'); + return $filters + ->add('code') + ->add('startDate') + ->add( + ProcessExecutionDurationFilter::new('duration', 'Duration (in seconds)') + ->setFormTypeOption('mapped', false) + ); } private function getLogFilePath(ProcessExecution $processExecution): string