diff --git a/assets/controllers/bo/form_collection_controller.js b/assets/controllers/bo/form_collection_controller.js index cd5742b..131b25f 100644 --- a/assets/controllers/bo/form_collection_controller.js +++ b/assets/controllers/bo/form_collection_controller.js @@ -45,6 +45,7 @@ export default class extends Controller { removeItem(event) { event.target.closest('[data-collection-item]').remove(); + this._notifyChange(); } sortAlphabetically() { @@ -56,6 +57,7 @@ export default class extends Controller { }); items.forEach(item => this.collectionTarget.appendChild(item)); this._syncOrdering(); + this._notifyChange(); } randomize() { @@ -66,6 +68,11 @@ export default class extends Controller { } items.forEach(item => this.collectionTarget.appendChild(item)); this._syncOrdering(); + this._notifyChange(); + } + + _notifyChange() { + this.element.dispatchEvent(new Event('change', {bubbles: true})); } // — drag-and-drop — @@ -115,6 +122,7 @@ export default class extends Controller { const isBottom = e.clientY > rect.top + rect.height / 2; this.collectionTarget.insertBefore(this._dragging, isBottom ? el.nextSibling : el); this._syncOrdering(); + this._notifyChange(); }); } diff --git a/assets/controllers/bo/modal_form_controller.js b/assets/controllers/bo/modal_form_controller.js index a99b5ee..f7d9a87 100644 --- a/assets/controllers/bo/modal_form_controller.js +++ b/assets/controllers/bo/modal_form_controller.js @@ -23,9 +23,29 @@ export default class extends Controller { const res = await fetch(url, {headers: {'X-Modal-Request': '1'}}); this.modalBodyTarget.innerHTML = await res.text(); this._moveFooter(); + this._bindDirty(); this._bindForm(url); } + _bindDirty() { + const modal = Modal.getOrCreateInstance(this.modalTarget); + modal._config.backdrop = true; + modal._config.keyboard = true; + + const markDirty = () => { + modal._config.backdrop = 'static'; + modal._config.keyboard = false; + }; + + this.modalBodyTarget.addEventListener('input', markDirty, {once: true}); + this.modalBodyTarget.addEventListener('change', markDirty, {once: true}); + + this.modalTarget.addEventListener('hidden.bs.modal', () => { + modal._config.backdrop = true; + modal._config.keyboard = true; + }, {once: true}); + } + _moveFooter() { if (!this.hasModalFooterTarget) return; const template = this.modalBodyTarget.querySelector('template[data-modal-footer]'); diff --git a/src/Controller/Backoffice/QuestionBankController.php b/src/Controller/Backoffice/QuestionBankController.php index 4cb26c2..1aedc6d 100644 --- a/src/Controller/Backoffice/QuestionBankController.php +++ b/src/Controller/Backoffice/QuestionBankController.php @@ -88,6 +88,8 @@ class QuestionBankController extends AbstractController { $bankQuestion = new BankQuestion(); + $isModalRequest = $request->headers->has('X-Modal-Request'); + $form = $this->createForm(BankQuestionFormType::class, $bankQuestion, ['season' => $season]); $form->handleRequest($request); @@ -99,14 +101,29 @@ class QuestionBankController extends AbstractController $this->addFlash(FlashType::Success, $this->translator->trans('Question added to the question bank')); + if ($isModalRequest) { + return new Response('', Response::HTTP_NO_CONTENT); + } + return $this->redirectToRoute('tvdt_backoffice_question_bank', ['seasonCode' => $season->seasonCode]); } - return $this->render('backoffice/question_bank/form.html.twig', [ + $template = $isModalRequest + ? 'backoffice/question_bank/_form_body.html.twig' + : 'backoffice/question_bank/form.html.twig'; + + $response = $this->render($template, [ 'season' => $season, 'form' => $form, 'bankQuestion' => null, + 'isModal' => $isModalRequest, ]); + + if ($form->isSubmitted()) { + $response->setStatusCode(Response::HTTP_UNPROCESSABLE_ENTITY); + } + + return $response; } #[IsGranted(SeasonVoter::EDIT, subject: 'season')] diff --git a/templates/backoffice/season/tab_question_bank.html.twig b/templates/backoffice/season/tab_question_bank.html.twig index f4eca6b..c278c97 100644 --- a/templates/backoffice/season/tab_question_bank.html.twig +++ b/templates/backoffice/season/tab_question_bank.html.twig @@ -1,7 +1,12 @@
- {{ 'Add question'|trans }} +