Added an form for merging two parts together

This commit is contained in:
Jan Böhmer 2023-11-22 20:11:38 +01:00
parent 50069c7611
commit b0f5d9b55f
5 changed files with 85 additions and 3 deletions

View file

@ -43,7 +43,8 @@ export default class extends Controller
const message = this.element.dataset.deleteMessage; const message = this.element.dataset.deleteMessage;
const title = this.element.dataset.deleteTitle; 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 submitter = event.submitter;
const that = this; const that = this;

View file

@ -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' => '.+'])] #[Route(path: '/{id}/from_info_provider/{providerKey}/{providerId}/update', requirements: ['providerId' => '.+'])]
public function updateFromInfoProvider(Part $part, Request $request, string $providerKey, string $providerId, public function updateFromInfoProvider(Part $part, Request $request, string $providerKey, string $providerId,
PartInfoRetriever $infoRetriever, PartMerger $partMerger): Response PartInfoRetriever $infoRetriever, PartMerger $partMerger): Response
@ -259,10 +275,10 @@ class PartController extends AbstractController
* @param array $form_options * @param array $form_options
* @return Response * @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 //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'); throw new \InvalidArgumentException('Invalid mode given');
} }
@ -295,6 +311,12 @@ class PartController extends AbstractController
$this->commentHelper->setMessage($form['log_comment']->getData()); $this->commentHelper->setMessage($form['log_comment']->getData());
$this->em->persist($new_part); $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(); $this->em->flush();
if ($mode === 'new') { if ($mode === 'new') {
$this->addFlash('success', 'part.created_flash'); $this->addFlash('success', 'part.created_flash');
@ -329,12 +351,16 @@ class PartController extends AbstractController
$template = 'parts/edit/new_part.html.twig'; $template = 'parts/edit/new_part.html.twig';
} else if ($mode === 'edit') { } else if ($mode === 'edit') {
$template = 'parts/edit/edit_part_info.html.twig'; $template = 'parts/edit/edit_part_info.html.twig';
} else if ($mode === 'merge') {
$template = 'parts/edit/merge_parts.html.twig';
} }
return $this->render($template, return $this->render($template,
[ [
'part' => $new_part, 'part' => $new_part,
'form' => $form, 'form' => $form,
'merge_old_name' => $merge_infos['tname_before'] ?? null,
'merge_other' => $merge_infos['other_part'] ?? null
]); ]);
} }

View file

@ -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 %}
<i class="fas fa-code-merge" aria-hidden="true"></i>
{% trans %}part.merge.title{% endtrans %}
<b><a class="text-bg-info" href="{{ entity_url(merge_other, 'info') }}">{{ merge_other.name }} (ID: {{ merge_other.iD }})</a></b>
{% trans %}part.merge.title.into{% endtrans %}
<b><a class="text-bg-info" href="{{ entity_url(part, 'info') }}">{{ merge_old_name }} (ID: {{ part.id }})</a></b>
{% endblock %}
{% block card_content %}
<div {{ stimulus_controller('elements/delete_btn') }} {{ stimulus_action('elements/delete_btn', "submit", "submit") }}
data-delete-title="{% trans with {'%target%': merge_old_name|escape, '%other%': merge_other.name }%}part.merge.confirm.title{% endtrans %}"
data-delete-message="{% trans with {'%other%': merge_other.name } %}part.merge.confirm.message{% endtrans %}">
{{ parent() }}
</div>
{% endblock %}

View file

@ -3,6 +3,10 @@
{% block card_border %}border-success{% endblock %} {% block card_border %}border-success{% endblock %}
{% block card_type %}bg-success text-white{% endblock %} {% block card_type %}bg-success text-white{% endblock %}
{% block title %}
{% trans %}part.new.card_title{% endtrans %}
{% endblock %}
{% block card_title %} {% block card_title %}
<i class="fas fa-edit fa-plus-square" aria-hidden="true"></i> <i class="fas fa-edit fa-plus-square" aria-hidden="true"></i>
{% trans %}part.new.card_title{% endtrans %} {% trans %}part.new.card_title{% endtrans %}

View file

@ -11969,5 +11969,29 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>This element was newly created and was not persisted to the database yet.</target> <target>This element was newly created and was not persisted to the database yet.</target>
</segment> </segment>
</unit> </unit>
<unit id="USUaBZ0" name="part.merge.title">
<segment>
<source>part.merge.title</source>
<target>Merge part</target>
</segment>
</unit>
<unit id="sCLZTwA" name="part.merge.title.into">
<segment>
<source>part.merge.title.into</source>
<target>into</target>
</segment>
</unit>
<unit id="nISUoQl" name="part.merge.confirm.title">
<segment>
<source>part.merge.confirm.title</source>
<target><![CDATA[Do you really want to merge <b>%other%</b> into <b>%target%</b>?]]></target>
</segment>
</unit>
<unit id="qxHNYfX" name="part.merge.confirm.message">
<segment>
<source>part.merge.confirm.message</source>
<target><![CDATA[<b>%other%</b> will be deleted, and the part will be saved with the shown information.]]></target>
</segment>
</unit>
</file> </file>
</xliff> </xliff>