From 59e36fb8243d93f6f6777bdeba01db1b24ef4c81 Mon Sep 17 00:00:00 2001 From: Sebastian Almberg <83243306+Sebbeben@users.noreply.github.com> Date: Tue, 10 Feb 2026 21:10:55 +0100 Subject: [PATCH] Fix batch EDA edit: required validation and pre-populate shared values - Add required=false to TriStateCheckboxType fields so HTML5 validation doesn't force users to check visibility/BOM/board checkboxes - Pre-populate form fields when all selected parts share the same EDA value, so users can see current state before editing --- src/Controller/BatchEdaController.php | 34 ++++++++++++++++++++++++++- src/Form/Part/EDA/BatchEdaType.php | 4 ++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/Controller/BatchEdaController.php b/src/Controller/BatchEdaController.php index 43f9b7f8..4a3ead7b 100644 --- a/src/Controller/BatchEdaController.php +++ b/src/Controller/BatchEdaController.php @@ -18,6 +18,36 @@ class BatchEdaController extends AbstractController { } + /** + * Compute shared EDA values across all parts. If all parts have the same value for a field, return it. + * @param Part[] $parts + * @return array + */ + private function getSharedEdaValues(array $parts): array + { + $fields = [ + 'reference_prefix' => static fn (Part $p) => $p->getEdaInfo()->getReferencePrefix(), + 'value' => static fn (Part $p) => $p->getEdaInfo()->getValue(), + 'kicad_symbol' => static fn (Part $p) => $p->getEdaInfo()->getKicadSymbol(), + 'kicad_footprint' => static fn (Part $p) => $p->getEdaInfo()->getKicadFootprint(), + 'visibility' => static fn (Part $p) => $p->getEdaInfo()->getVisibility(), + 'exclude_from_bom' => static fn (Part $p) => $p->getEdaInfo()->getExcludeFromBom(), + 'exclude_from_board' => static fn (Part $p) => $p->getEdaInfo()->getExcludeFromBoard(), + 'exclude_from_sim' => static fn (Part $p) => $p->getEdaInfo()->getExcludeFromSim(), + ]; + + $data = []; + foreach ($fields as $key => $getter) { + $values = array_map($getter, $parts); + $unique = array_unique($values, SORT_REGULAR); + if (count($unique) === 1) { + $data[$key] = $unique[array_key_first($unique)]; + } + } + + return $data; + } + #[Route('/tools/batch_eda_edit', name: 'batch_eda_edit')] public function batchEdaEdit(Request $request): Response { @@ -36,7 +66,9 @@ class BatchEdaController extends AbstractController return $redirectUrl !== '' ? $this->redirect($redirectUrl) : $this->redirectToRoute('parts_show_all'); } - $form = $this->createForm(BatchEdaType::class); + //Pre-populate form with shared values (when all parts have the same value) + $initialData = $this->getSharedEdaValues($parts); + $form = $this->createForm(BatchEdaType::class, $initialData); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { diff --git a/src/Form/Part/EDA/BatchEdaType.php b/src/Form/Part/EDA/BatchEdaType.php index c5c839f2..28fc4a41 100644 --- a/src/Form/Part/EDA/BatchEdaType.php +++ b/src/Form/Part/EDA/BatchEdaType.php @@ -67,6 +67,7 @@ class BatchEdaType extends AbstractType ]) ->add('visibility', TriStateCheckboxType::class, [ 'label' => 'eda_info.visibility', + 'required' => false, ]) ->add('apply_visibility', CheckboxType::class, [ 'label' => 'batch_eda.apply', @@ -75,6 +76,7 @@ class BatchEdaType extends AbstractType ]) ->add('exclude_from_bom', TriStateCheckboxType::class, [ 'label' => 'eda_info.exclude_from_bom', + 'required' => false, ]) ->add('apply_exclude_from_bom', CheckboxType::class, [ 'label' => 'batch_eda.apply', @@ -83,6 +85,7 @@ class BatchEdaType extends AbstractType ]) ->add('exclude_from_board', TriStateCheckboxType::class, [ 'label' => 'eda_info.exclude_from_board', + 'required' => false, ]) ->add('apply_exclude_from_board', CheckboxType::class, [ 'label' => 'batch_eda.apply', @@ -91,6 +94,7 @@ class BatchEdaType extends AbstractType ]) ->add('exclude_from_sim', TriStateCheckboxType::class, [ 'label' => 'eda_info.exclude_from_sim', + 'required' => false, ]) ->add('apply_exclude_from_sim', CheckboxType::class, [ 'label' => 'batch_eda.apply',