From 07d4ffa956b89a4ed32c3a0d8bf27e602764af27 Mon Sep 17 00:00:00 2001 From: Marcel Diegelmann Date: Fri, 12 Dec 2025 10:47:05 +0100 Subject: [PATCH] =?UTF-8?q?Assembly-Filter=20und=20-Tab=20erg=C3=A4nzen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fügt Unterstützung für Assembly-Filter in der Suche sowie ein neues Tab für Assemblies in der Filteransicht hinzu. Anpassungen beinhalten Änderungen an Datenbankabfragen, Formularen und Templates. --- src/Controller/PartListsController.php | 2 +- src/DataTables/Filters/PartFilter.php | 13 +++++++++++++ src/DataTables/Filters/PartSearchFilter.php | 15 +++++++++++++++ src/DataTables/PartsDataTable.php | 7 +++++++ src/Form/Filters/PartFilterType.php | 21 +++++++++++++++++++++ templates/components/search.macro.html.twig | 6 +++++- templates/parts/lists/_filter.html.twig | 14 +++++++++++++- 7 files changed, 75 insertions(+), 3 deletions(-) diff --git a/src/Controller/PartListsController.php b/src/Controller/PartListsController.php index 808b0c5d..9b684950 100644 --- a/src/Controller/PartListsController.php +++ b/src/Controller/PartListsController.php @@ -330,7 +330,7 @@ class PartListsController extends AbstractController $filter->setSupplier($request->query->getBoolean('supplier')); $filter->setManufacturer($request->query->getBoolean('manufacturer')); $filter->setFootprint($request->query->getBoolean('footprint')); - + $filter->setAssembly($request->query->getBoolean('assembly')); $filter->setRegex($request->query->getBoolean('regex')); diff --git a/src/DataTables/Filters/PartFilter.php b/src/DataTables/Filters/PartFilter.php index cf185dfd..59afa3ca 100644 --- a/src/DataTables/Filters/PartFilter.php +++ b/src/DataTables/Filters/PartFilter.php @@ -36,6 +36,7 @@ use App\DataTables\Filters\Constraints\Part\LessThanDesiredConstraint; use App\DataTables\Filters\Constraints\Part\ParameterConstraint; use App\DataTables\Filters\Constraints\Part\TagsConstraint; use App\DataTables\Filters\Constraints\TextConstraint; +use App\Entity\AssemblySystem\Assembly; use App\Entity\Attachments\AttachmentType; use App\Entity\Parts\Category; use App\Entity\Parts\Footprint; @@ -107,6 +108,14 @@ class PartFilter implements FilterInterface public readonly TextConstraint $bomName; public readonly TextConstraint $bomComment; + /************************************************* + * Assembly + *************************************************/ + + public readonly EntityConstraint $assembly; + public readonly NumberConstraint $assemblyBomQuantity; + public readonly TextConstraint $assemblyBomName; + /************************************************* * Bulk Import Job tab *************************************************/ @@ -180,6 +189,10 @@ class PartFilter implements FilterInterface $this->bomName = new TextConstraint('_projectBomEntries.name'); $this->bomComment = new TextConstraint('_projectBomEntries.comment'); + $this->assembly = new EntityConstraint($nodesListBuilder, Assembly::class, '_assemblyBomEntries.assembly'); + $this->assemblyBomQuantity = new NumberConstraint('_assemblyBomEntries.quantity'); + $this->assemblyBomName = new TextConstraint('_assemblyBomEntries.name'); + // Bulk Import Job filters $this->inBulkImportJob = new BulkImportJobExistsConstraint(); $this->bulkImportJobStatus = new BulkImportJobStatusConstraint(); diff --git a/src/DataTables/Filters/PartSearchFilter.php b/src/DataTables/Filters/PartSearchFilter.php index aa8c20f4..f5b48297 100644 --- a/src/DataTables/Filters/PartSearchFilter.php +++ b/src/DataTables/Filters/PartSearchFilter.php @@ -66,6 +66,9 @@ class PartSearchFilter implements FilterInterface /** @var bool Use Internal Part number for searching */ protected bool $ipn = true; + /** @var bool Use assembly name for searching */ + protected bool $assembly = true; + public function __construct( /** @var string The string to query for */ protected string $keyword @@ -113,6 +116,9 @@ class PartSearchFilter implements FilterInterface if ($this->ipn) { $fields_to_search[] = 'part.ipn'; } + if ($this->assembly) { + $fields_to_search[] = '_assembly.name'; + } return $fields_to_search; } @@ -304,5 +310,14 @@ class PartSearchFilter implements FilterInterface return $this; } + public function isAssembly(): bool + { + return $this->assembly; + } + public function setAssembly(bool $assembly): PartSearchFilter + { + $this->assembly = $assembly; + return $this; + } } diff --git a/src/DataTables/PartsDataTable.php b/src/DataTables/PartsDataTable.php index fd798620..a22f0b3e 100644 --- a/src/DataTables/PartsDataTable.php +++ b/src/DataTables/PartsDataTable.php @@ -474,6 +474,13 @@ final class PartsDataTable implements DataTableTypeInterface //Do not group by many-to-* relations, as it would restrict the COUNT having clauses to be maximum 1 //$builder->addGroupBy('_projectBomEntries'); } + if (str_contains($dql, '_assembly.')) { + $builder->leftJoin('part.assembly_bom_entries', '_assemblyBomEntries'); + $builder->leftJoin('_assemblyBomEntries.assembly', '_assembly'); + } + if (str_contains($dql, '_assemblyBomEntries')) { + $builder->leftJoin('part.assembly_bom_entries', '_assemblyBomEntries'); + } if (str_contains($dql, '_jobPart')) { $builder->leftJoin('part.bulkImportJobParts', '_jobPart'); $builder->leftJoin('_jobPart.job', '_bulkImportJob'); diff --git a/src/Form/Filters/PartFilterType.php b/src/Form/Filters/PartFilterType.php index e101c635..1e7e6365 100644 --- a/src/Form/Filters/PartFilterType.php +++ b/src/Form/Filters/PartFilterType.php @@ -25,6 +25,7 @@ namespace App\Form\Filters; use App\DataTables\Filters\Constraints\Part\BulkImportPartStatusConstraint; use App\DataTables\Filters\Constraints\Part\ParameterConstraint; use App\DataTables\Filters\PartFilter; +use App\Entity\AssemblySystem\Assembly; use App\Entity\Attachments\AttachmentType; use App\Entity\InfoProviderSystem\BulkImportJobStatus; use App\Entity\InfoProviderSystem\BulkImportPartStatus; @@ -313,6 +314,26 @@ class PartFilterType extends AbstractType } + /************************************************************************** + * Assembly tab + **************************************************************************/ + if ($this->security->isGranted('read', Assembly::class)) { + $builder + ->add('assembly', StructuralEntityConstraintType::class, [ + 'label' => 'assembly.label', + 'entity_class' => Assembly::class + ]) + ->add('assemblyBomQuantity', NumberConstraintType::class, [ + 'label' => 'assembly.bom.quantity', + 'min' => 0, + 'step' => "any", + ]) + ->add('assemblyBomName', TextConstraintType::class, [ + 'label' => 'assembly.bom.name', + ]) + ; + } + /************************************************************************** * Bulk Import Job tab **************************************************************************/ diff --git a/templates/components/search.macro.html.twig b/templates/components/search.macro.html.twig index e62af2b1..747a781a 100644 --- a/templates/components/search.macro.html.twig +++ b/templates/components/search.macro.html.twig @@ -61,6 +61,10 @@ {% endif %} +
+ + +

@@ -102,4 +106,4 @@ {{ _self.settings_drodown(is_navbar) }} {% endif %} -{% endmacro %} \ No newline at end of file +{% endmacro %} diff --git a/templates/parts/lists/_filter.html.twig b/templates/parts/lists/_filter.html.twig index 2fb5bff2..c3642c91 100644 --- a/templates/parts/lists/_filter.html.twig +++ b/templates/parts/lists/_filter.html.twig @@ -31,6 +31,11 @@ {% endif %} + {% if filterForm.assembly is defined %} + + {% endif %} {% if filterForm.inBulkImportJob is defined %}
{% endif %} + {% if filterForm.assembly is defined %} +
+ {{ form_row(filterForm.assembly) }} + {{ form_row(filterForm.assemblyBomQuantity) }} + {{ form_row(filterForm.assemblyBomName) }} +
+ {% endif %} {% if filterForm.inBulkImportJob is defined %}
{{ form_row(filterForm.inBulkImportJob) }} @@ -163,4 +175,4 @@ {{ form_end(filterForm) }}
- \ No newline at end of file +