diff --git a/src/Controller/PartListsController.php b/src/Controller/PartListsController.php index 978a9a81..94285804 100644 --- a/src/Controller/PartListsController.php +++ b/src/Controller/PartListsController.php @@ -30,6 +30,7 @@ namespace App\Controller; use App\DataTables\PartsDataTable; +use App\Entity\Parts\Category; use Omines\DataTablesBundle\DataTableFactory; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; @@ -44,19 +45,9 @@ class PartListsController extends AbstractController * * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\Response */ - public function showCategory(int $id, Request $request, DataTableFactory $dataTable) + public function showCategory(Category $category, Request $request, DataTableFactory $dataTable) { - /*$table = $dataTable->create() - ->add("id", TextColumn::class) - ->add("name", TextColumn::class) - ->add("description", TextColumn::class) - ->add("category", TextColumn::class, ['field' => 'category.name']) - ->createAdapter(ORMAdapter::class, [ - 'entity' => Part::class - ]) - ->handleRequest($request); */ - - $table = $dataTable->createFromType(PartsDataTable::class, ['cid' => $id]) + $table = $dataTable->createFromType(PartsDataTable::class, ['category' => $category]) ->handleRequest($request); if ($table->isCallback()) { @@ -66,6 +57,43 @@ class PartListsController extends AbstractController return $this->render('parts_list.html.twig', ['datatable' => $table]); } + /** + * @Route("/parts/by_tag/{tag}", name="part_list_tags") + * @param string $tag + * @param Request $request + * @param DataTableFactory $dataTable + * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\Response + */ + public function showTag(string $tag, Request $request, DataTableFactory $dataTable) + { + $table = $dataTable->createFromType(PartsDataTable::class, ['tag' => $tag]) + ->handleRequest($request); + + if ($table->isCallback()) { + return $table->getResponse(); + } + + return $this->render('parts_list.html.twig', ['datatable' => $table]); + } + + /** + * @Route("/parts/search/{keyword}", name="parts_search") + */ + public function showSearch(Request $request, DataTableFactory $dataTable, string $keyword = "") + { + $search = $keyword; + dump($search); + + $table = $dataTable->createFromType(PartsDataTable::class, ['search' => $search]) + ->handleRequest($request); + + if ($table->isCallback()) { + return $table->getResponse(); + } + + return $this->render('parts_list.html.twig', ['datatable' => $table]); + } + /** * @Route("/parts", name="parts_show_all") * diff --git a/src/DataTables/PartsDataTable.php b/src/DataTables/PartsDataTable.php index 16c7a606..4f38a03b 100644 --- a/src/DataTables/PartsDataTable.php +++ b/src/DataTables/PartsDataTable.php @@ -29,6 +29,7 @@ namespace App\DataTables; +use App\Entity\Parts\Category; use App\Entity\Parts\Part; use App\Services\EntityURLGenerator; use Doctrine\ORM\QueryBuilder; @@ -50,6 +51,30 @@ class PartsDataTable implements DataTableTypeInterface $this->urlGenerator = $urlGenerator; } + protected function buildCriteria(QueryBuilder $builder, array $options) + { + if (isset($options['category'])) { + $em = $builder->getEntityManager(); + $category = $options['category']; + $repo = $em->getRepository(Category::class); + $list = $repo->toNodesList($category); + $list[] = $category; + + $builder->andWhere('part.category IN (:cid)')->setParameter('cid', $list); + } + + if (isset($options['tag'])) { + $builder->andWhere('part.tags LIKE :tag')->setParameter('tag', '%' . $options['tag'] . '%'); + } + + dump($options['search']); + + if (isset($options['search'])) { + $builder->AndWhere('part.name LIKE :search')->orWhere('part.description LIKE :search')->orWhere('part.comment LIKE :search') + ->setParameter('search', '%' . $options['search'] . '%'); + } + } + /** * @param DataTable $dataTable * @param array $options @@ -57,27 +82,24 @@ class PartsDataTable implements DataTableTypeInterface public function configure(DataTable $dataTable, array $options) { $dataTable//->add("id", TextColumn::class) - ->add('name', TextColumn::class, ['label' => 'name.label', + ->add('name', TextColumn::class, ['label' => 'name.label', 'render' => function ($value, Part $context) { return $this->urlGenerator->infoHTML($context); }, ]) ->add('description', TextColumn::class, ['label' => 'description.label']) ->add('category', TextColumn::class, ['field' => 'category.name', 'label' => 'category.label']) - ->add('instock', TextColumn::class, ['label' => 'instock.label_short']) - ->add('mininstock', TextColumn::class, ['label' => 'mininstock.label_short']) + ->add('amountSum', TextColumn::class, ['label' => 'instock.label_short']) + ->add('minamount', TextColumn::class, ['label' => 'mininstock.label_short']) //->add('storelocation', TextColumn::class, ['field' => 'storelocation.name', 'label' => 'storelocation.label']) ->addOrderBy('name') ->createAdapter(ORMAdapter::class, [ 'entity' => Part::class, 'criteria' => [ - function (QueryBuilder $builder) use ($options) { - if (isset($options['cid'])) { - $builder->andWhere('part.category = :cid') - ->setParameter('cid', $options['cid']); - } - }, - new SearchCriteriaProvider(), - ], + function (QueryBuilder $builder) use ($options) { + $this->buildCriteria($builder, $options); + }, + new SearchCriteriaProvider() + ] ]); } } diff --git a/templates/_navbar.html.twig b/templates/_navbar.html.twig index cac412f5..5e09de66 100644 --- a/templates/_navbar.html.twig +++ b/templates/_navbar.html.twig @@ -18,7 +18,7 @@ - - + + + {% trans %}go.exclamation{% endtrans %} diff --git a/templates/helper.twig b/templates/helper.twig index 05a48a08..5bdcda6d 100644 --- a/templates/helper.twig +++ b/templates/helper.twig @@ -50,7 +50,7 @@ {% macro string_to_tags(string, class="badge badge-info") %} {% for tag in string|split(',') %} - {{ tag | trim }} + {{ tag | trim }} {% endfor %} {% endmacro %}