From 5323030386a48945ba8716f195e440112013a663 Mon Sep 17 00:00:00 2001
From: Andreas Fernandez <a.fernandez@scripting-base.de>
Date: Wed, 27 Sep 2023 12:11:19 +0200
Subject: [PATCH] [BUGFIX] Toggle preview state in Form Editor
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

When the form is in "Preview" mode and an integrator either saves or
switches to the form settings, the stage itself is updated to be in
"Edit" mode again, but the internal state remains in "Preview" mode,
causing glitches in the UI.

This patch now disables the preview state in the form model everytime
the "stage area", containing the editing interface, is rendered.

Resolves: #102031
Releases: main, 12.4, 11.5
Change-Id: I84b0817bb99201527dbd4b950e560631e7b1d94f
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/81262
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Tested-by: core-ci <typo3@b13.com>
---
 .../Public/JavaScript/Backend/FormEditor/Mediator.js        | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/typo3/sysext/form/Resources/Public/JavaScript/Backend/FormEditor/Mediator.js b/typo3/sysext/form/Resources/Public/JavaScript/Backend/FormEditor/Mediator.js
index d30c0d40b29f..6107e0805f09 100644
--- a/typo3/sysext/form/Resources/Public/JavaScript/Backend/FormEditor/Mediator.js
+++ b/typo3/sysext/form/Resources/Public/JavaScript/Backend/FormEditor/Mediator.js
@@ -206,6 +206,7 @@ define(['jquery',
        */
       getPublisherSubscriber().subscribe('core/ajax/saveFormDefinition/success', function(topic, args) {
         getFormEditorApp().setUnsavedContent(false);
+        getViewModel().setPreviewMode(false);
         getViewModel().showSaveSuccessMessage();
         getViewModel().showSaveButtonSaveIcon();
 
@@ -297,6 +298,7 @@ define(['jquery',
        * @subscribe view/header/formSettings/clicked
        */
       getPublisherSubscriber().subscribe('view/header/formSettings/clicked', function(topic, args) {
+        getViewModel().setPreviewMode(false);
         getViewModel().addStructureRootElementSelection();
         getFormEditorApp().setCurrentlySelectedFormElement(getRootFormElement());
         getViewModel().renderAbstractStageArea();
@@ -466,6 +468,7 @@ define(['jquery',
       getPublisherSubscriber().subscribe('view/stage/abstract/dnd/stop', function(topic, args) {
         getFormEditorApp().setCurrentlySelectedFormElement(args[0]);
         getViewModel().renewStructure();
+        getViewModel().setPreviewMode(false);
         getViewModel().renderAbstractStageArea(false, false);
         getViewModel().refreshSelectedElementItemsBatch();
         getViewModel().addAbstractViewValidationResults();
@@ -609,6 +612,7 @@ define(['jquery',
         if (getCurrentlySelectedFormElement().get('__identifierPath') !== args[0]) {
           oldPageIndex = getFormEditorApp().getCurrentlySelectedPageIndex();
           getFormEditorApp().setCurrentlySelectedFormElement(args[0]);
+          getViewModel().setPreviewMode(false);
           if (oldPageIndex !== getFormEditorApp().getCurrentlySelectedPageIndex()) {
             getViewModel().renderAbstractStageArea();
           } else {
@@ -650,6 +654,7 @@ define(['jquery',
         if (!getFormEditorApp().isRootFormElementSelected()) {
           getViewModel().addStructureRootElementSelection();
           getFormEditorApp().setCurrentlySelectedFormElement(getRootFormElement());
+          getViewModel().setPreviewMode(false);
           getViewModel().renderAbstractStageArea();
           getViewModel().renewStructure();
           getViewModel().renderPagination();
@@ -686,6 +691,7 @@ define(['jquery',
         getFormEditorApp().setCurrentlySelectedFormElement(args[0]);
         getViewModel().renewStructure();
         getViewModel().renderPagination();
+        getViewModel().setPreviewMode(false);
         getViewModel().renderAbstractStageArea();
         getViewModel().renderInspectorEditors();
       });
-- 
GitLab