From a0b2d92ba2795077016a75bc82a3673f5de7042c Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Wed, 20 Aug 2025 12:50:49 +0200 Subject: [PATCH] Fix the selection modal for acpw for merging functionality --- .../Resources/views/Form/fields.html.twig | 23 +++++++- ...ompanyingPeriodWorkDuplicateController.php | 8 +++ .../Form/FindAccompanyingPeriodWorkType.php | 1 + .../PickLinkedAccompanyingPeriodWorkType.php | 5 ++ .../AccompanyingPeriodWorkSelector.js | 12 ----- .../AccompanyingPeriodWorkSelector.ts | 52 +++++++++++++++++++ .../AccompanyingPeriodWorkList.vue | 13 ++++- .../AccompanyingPeriodWorkSelectorModal.vue | 26 ++++++++-- .../assign_acpw_duplicate.html.twig | 15 +++++- .../ChillPersonBundle/chill.webpack.config.js | 2 +- 10 files changed, 134 insertions(+), 23 deletions(-) delete mode 100644 src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js create mode 100644 src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.ts diff --git a/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig index 649f9ea5c..5e3edca10 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig @@ -266,10 +266,29 @@ data-label="{{ form.vars['label']|trans|escape('html_attr') }}"> {% endblock %} +{% block pick_linked_entities_row %} +
+
+ {{ form_label(form) }} + {{ form_help(form) }} +
+
+
+
+ {{ form_widget(form) }} +
+
+{% endblock %} + {% block pick_linked_entities_widget %} - -
+
{% endblock %} diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php index 968de3eb6..56d53be92 100644 --- a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php +++ b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php @@ -19,7 +19,9 @@ use Chill\PersonBundle\Service\AccompanyingPeriodWork\AccompanyingPeriodWorkMerg use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Translation\TranslatableMessage; use Symfony\Contracts\Translation\TranslatorInterface; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; @@ -92,6 +94,12 @@ class AccompanyingPeriodWorkDuplicateController extends AbstractController $this->accompanyingPeriodWorkMergeService->merge($acpw1, $acpw2); + $session = $request->getSession(); + if ($session instanceof Session) { + $session->getFlashBag()->add('success', new TranslatableMessage('acpw_duplicate.Successfully merged')); + } + + return $this->redirectToRoute('chill_person_accompanying_period_work_show', ['id' => $acpw1->getId()]); } diff --git a/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php b/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php index 1f862353e..9b3acf156 100644 --- a/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php +++ b/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php @@ -26,6 +26,7 @@ class FindAccompanyingPeriodWorkType extends AbstractType ->add('acpw', PickLinkedAccompanyingPeriodWorkType::class, [ 'label' => 'Accompanying period work', 'multiple' => false, + 'accompanyingPeriod' => $options['accompanyingPeriod'], ]) ->add('direction', HiddenType::class, [ 'data' => 'starting', diff --git a/src/Bundle/ChillPersonBundle/Form/Type/PickLinkedAccompanyingPeriodWorkType.php b/src/Bundle/ChillPersonBundle/Form/Type/PickLinkedAccompanyingPeriodWorkType.php index ad199f882..6f8fc7665 100644 --- a/src/Bundle/ChillPersonBundle/Form/Type/PickLinkedAccompanyingPeriodWorkType.php +++ b/src/Bundle/ChillPersonBundle/Form/Type/PickLinkedAccompanyingPeriodWorkType.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Chill\PersonBundle\Form\Type; +use Chill\PersonBundle\Entity\AccompanyingPeriod; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; @@ -29,6 +30,8 @@ class PickLinkedAccompanyingPeriodWorkType extends AbstractType $view->vars['suggested'] = []; $view->vars['as_id'] = true === $options['as_id'] ? '1' : '0'; $view->vars['submit_on_adding_new_entity'] = false; + $view->vars['pick-entities-type'] = 'acpw'; + $view->vars['attr']['data-accompanying-period-id'] = $options['accompanyingPeriod']->getId(); foreach ($options['suggested'] as $suggestion) { $view->vars['suggested'][] = $this->normalizer->normalize($suggestion, 'json', ['groups' => 'read']); @@ -38,6 +41,8 @@ class PickLinkedAccompanyingPeriodWorkType extends AbstractType public function configureOptions(OptionsResolver $resolver) { $resolver + ->setRequired('accompanyingPeriod') + ->setAllowedTypes('accompanyingPeriod', [AccompanyingPeriod::class]) ->setDefault('multiple', false) ->setAllowedTypes('multiple', ['bool']) ->setDefault('compound', false) diff --git a/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js b/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js deleted file mode 100644 index 1c7a5023b..000000000 --- a/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js +++ /dev/null @@ -1,12 +0,0 @@ -import { createApp } from "vue"; -import AccompanyingPeriodWorkSelectorModal from "../../vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkSelectorModal.vue"; - -document.addEventListener("DOMContentLoaded", () => { - const el = document.getElementById("linked-acpw-selector"); - if (el) { - const accompanyingPeriodId = el.dataset.accompanyingPeriod; - createApp(AccompanyingPeriodWorkSelectorModal, { - accompanyingPeriodId, - }).mount(el); - } -}); diff --git a/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.ts b/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.ts new file mode 100644 index 000000000..eb9a612f1 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.ts @@ -0,0 +1,52 @@ +import { createApp } from "vue"; +import AccompanyingPeriodWorkSelectorModal from "../../vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkSelectorModal.vue"; +import { AccompanyingPeriodWork } from "../../types"; + +document.addEventListener("DOMContentLoaded", () => { + const elements = document.querySelectorAll( + 'div[data-pick-entities-type="acpw"]', + ); + elements.forEach((el) => { + const uniqid = el.dataset.inputUniqid; + + if (undefined === uniqid) { + throw "Uniqid not found on this element"; + } + + const input = document.querySelector( + `input[data-input-uniqid="${uniqid}"]`, + ); + + if (null === input) { + throw "Element with uniqid not found: " + uniqid; + } + + const accompanyingPeriodIdAsString = input.dataset.accompanyingPeriodId; + + if (undefined === accompanyingPeriodIdAsString) { + throw "accompanying period id not found"; + } + + const accompanyingPeriodId = Number.parseInt( + accompanyingPeriodIdAsString, + ); + + const app = createApp({ + template: + '', + components: { AccompanyingPeriodWorkSelectorModal }, + data() { + return { accompanyingPeriodId }; + }, + methods: { + pickWork: function (payload: { work: AccompanyingPeriodWork }) { + console.log("payload", payload); + + input.value = payload.work.id?.toString() ?? ''; + }, + }, + }); + + app.mount(el); + }); +}); diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue index c3615c959..77b801c7c 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue @@ -29,15 +29,24 @@ import { defineProps, ref, watch } from "vue"; // eslint-disable-next-line @typescript-eslint/no-unused-vars const props = defineProps<{ accompanyingPeriodWorks: AccompanyingPeriodWork[]; + selectedAcpw?: AccompanyingPeriodWork | null; }>(); -const selectedAcpw = ref(null); +const selectedAcpw = ref(props.selectedAcpw ?? null); // eslint-disable-next-line vue/valid-define-emits -const emit = defineEmits(); +const emit = defineEmits<{ + 'update:selectedAcpw': [value: AccompanyingPeriodWork | null]; +}>(); + +watch(() => props.selectedAcpw, (val) => { + selectedAcpw.value = val ?? null; +}); watch(selectedAcpw, (newValue) => { emit("update:selectedAcpw", newValue); }); + +