diff --git a/assets/controllers/elements/delete_btn_controller.js b/assets/controllers/elements/delete_btn_controller.js index 1b28de13..9ab15f7d 100644 --- a/assets/controllers/elements/delete_btn_controller.js +++ b/assets/controllers/elements/delete_btn_controller.js @@ -43,7 +43,8 @@ export default class extends Controller const message = this.element.dataset.deleteMessage; const title = this.element.dataset.deleteTitle; - const form = this.element; + //Use event target, to find the form, where the submit button was clicked + const form = event.target; const submitter = event.submitter; const that = this; diff --git a/src/Controller/PartController.php b/src/Controller/PartController.php index 4567cdb8..7090d083 100644 --- a/src/Controller/PartController.php +++ b/src/Controller/PartController.php @@ -234,6 +234,22 @@ class PartController extends AbstractController ]); } + #[Route('/{target}/merge/{other}', name: 'part_merge')] + public function merge(Request $request, Part $target, Part $other, PartMerger $partMerger): Response + { + $this->denyAccessUnlessGranted('edit', $target); + $this->denyAccessUnlessGranted('delete', $other); + + //Save the old name of the target part for the template + $target_name = $target->getName(); + + $merged = $partMerger->merge($target, $other); + return $this->renderPartForm('merge', $request, $merged, [], [ + 'tname_before' => $target_name, + 'other_part' => $other, + ]); + } + #[Route(path: '/{id}/from_info_provider/{providerKey}/{providerId}/update', requirements: ['providerId' => '.+'])] public function updateFromInfoProvider(Part $part, Request $request, string $providerKey, string $providerId, PartInfoRetriever $infoRetriever, PartMerger $partMerger): Response @@ -259,10 +275,10 @@ class PartController extends AbstractController * @param array $form_options * @return Response */ - private function renderPartForm(string $mode, Request $request, Part $data, array $form_options = []): Response + private function renderPartForm(string $mode, Request $request, Part $data, array $form_options = [], array $merge_infos = []): Response { //Ensure that mode is either 'new' or 'edit - if (!in_array($mode, ['new', 'edit'], true)) { + if (!in_array($mode, ['new', 'edit', 'merge'], true)) { throw new \InvalidArgumentException('Invalid mode given'); } @@ -295,6 +311,12 @@ class PartController extends AbstractController $this->commentHelper->setMessage($form['log_comment']->getData()); $this->em->persist($new_part); + + //When we are in merge mode, we have to remove the other part + if ($mode === 'merge') { + $this->em->remove($merge_infos['other_part']); + } + $this->em->flush(); if ($mode === 'new') { $this->addFlash('success', 'part.created_flash'); @@ -329,12 +351,16 @@ class PartController extends AbstractController $template = 'parts/edit/new_part.html.twig'; } else if ($mode === 'edit') { $template = 'parts/edit/edit_part_info.html.twig'; + } else if ($mode === 'merge') { + $template = 'parts/edit/merge_parts.html.twig'; } return $this->render($template, [ 'part' => $new_part, 'form' => $form, + 'merge_old_name' => $merge_infos['tname_before'] ?? null, + 'merge_other' => $merge_infos['other_part'] ?? null ]); } diff --git a/templates/parts/edit/merge_parts.html.twig b/templates/parts/edit/merge_parts.html.twig new file mode 100644 index 00000000..a91b6423 --- /dev/null +++ b/templates/parts/edit/merge_parts.html.twig @@ -0,0 +1,27 @@ +{% extends "parts/edit/edit_part_info.html.twig" %} + +{# @var merge_other \App\Entity\Parts\Part #} + +{% block card_border %}border-info{% endblock %} +{% block card_type %}bg-info text-bg-info{% endblock %} + +{% block title %} + {% trans %}part.merge.title{% endtrans %} {{ merge_other.name }} {% trans %}part.merge.title.into{% endtrans %} {{ merge_old_name }} +{% endblock %} + +{% block card_title %} + + {% trans %}part.merge.title{% endtrans %} + {{ merge_other.name }} (ID: {{ merge_other.iD }}) + {% trans %}part.merge.title.into{% endtrans %} + {{ merge_old_name }} (ID: {{ part.id }}) +{% endblock %} + +{% block card_content %} +
+ {{ parent() }} +
+ +{% endblock %} \ No newline at end of file diff --git a/templates/parts/edit/new_part.html.twig b/templates/parts/edit/new_part.html.twig index 278c57c3..2c11c7a0 100644 --- a/templates/parts/edit/new_part.html.twig +++ b/templates/parts/edit/new_part.html.twig @@ -3,6 +3,10 @@ {% block card_border %}border-success{% endblock %} {% block card_type %}bg-success text-white{% endblock %} +{% block title %} + {% trans %}part.new.card_title{% endtrans %} +{% endblock %} + {% block card_title %} {% trans %}part.new.card_title{% endtrans %} diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 8873d5c4..d694f22a 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -11969,5 +11969,29 @@ Please note, that you can not impersonate a disabled user. If you try you will g This element was newly created and was not persisted to the database yet. + + + part.merge.title + Merge part + + + + + part.merge.title.into + into + + + + + part.merge.confirm.title + %other% into %target%?]]> + + + + + part.merge.confirm.message + %other% will be deleted, and the part will be saved with the shown information.]]> + +