|
12 | 12 | use App\Service\CaseDeadlineStatuses; |
13 | 13 | use App\Service\CaseSpecialFilterStatuses; |
14 | 14 | use App\Service\FilterHelper; |
| 15 | +use App\Service\SearchService; |
15 | 16 | use Lexik\Bundle\FormFilterBundle\Filter\Form\Type as Filters; |
16 | 17 | use Lexik\Bundle\FormFilterBundle\Filter\Query\QueryInterface; |
17 | 18 | use Symfony\Component\Form\AbstractType; |
|
25 | 26 |
|
26 | 27 | class CaseFilterType extends AbstractType |
27 | 28 | { |
28 | | - public function __construct(private BoardRepository $boardRepository, private CaseEntityRepository $caseEntityRepository, private FilterHelper $filterHelper, private TranslatorInterface $translator, private UserRepository $userRepository) |
| 29 | + public function __construct(private BoardRepository $boardRepository, private CaseEntityRepository $caseEntityRepository, private FilterHelper $filterHelper, private TranslatorInterface $translator, private UserRepository $userRepository, private SearchService $searchService) |
29 | 30 | { |
30 | 31 | } |
31 | 32 |
|
@@ -276,5 +277,39 @@ function (FormEvent $event) use ($formModifier) { |
276 | 277 | 'label' => false, |
277 | 278 | 'placeholder' => $this->translator->trans('Select a general status filter', [], 'case'), |
278 | 279 | ]); |
| 280 | + |
| 281 | + $builder->add('searchFilter', Filters\TextFilterType::class, [ |
| 282 | + 'label' => false, |
| 283 | + 'attr' => [ |
| 284 | + 'placeholder' => $this->translator->trans('Search', [], 'case'), |
| 285 | + ], |
| 286 | + 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) { |
| 287 | + $searchValue = $values['value'] ?? null; |
| 288 | + if (empty($searchValue)) { |
| 289 | + return null; |
| 290 | + } |
| 291 | + |
| 292 | + $escapedSearch = $this->searchService->escapeStringForLike($searchValue, '\\'); |
| 293 | + |
| 294 | + $qb = $filterQuery->getQueryBuilder(); |
| 295 | + $paramName = 'search_query'; |
| 296 | + |
| 297 | + // Start with base search conditions |
| 298 | + $expression = $filterQuery->getExpr()->orX( |
| 299 | + $filterQuery->getExpr()->like('c.caseNumber', ':'.$paramName), |
| 300 | + $filterQuery->getExpr()->like('c.sortingAddress', ':'.$paramName) |
| 301 | + ); |
| 302 | + |
| 303 | + // Check if value matches the pattern (e.g., 12.34.56) |
| 304 | + if (preg_match('/^\d{2}\.\d{2}\.\d{2}$/', $searchValue)) { |
| 305 | + $qb->leftJoin('c.complaintCategories', 'cc'); |
| 306 | + $expression->add($filterQuery->getExpr()->like('cc.kle', ':'.$paramName)); |
| 307 | + } |
| 308 | + |
| 309 | + $parameters = ['search_query' => '%'.$escapedSearch.'%']; |
| 310 | + |
| 311 | + return $filterQuery->createCondition($expression, $parameters); |
| 312 | + }, |
| 313 | + ]); |
279 | 314 | } |
280 | 315 | } |
0 commit comments