From 72b8d66d10015a356474c47d41fb4c95d82eaa07 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Christian=20E=C3=9Fl?= <indy.essl@gmail.com>
Date: Sat, 29 Feb 2020 16:08:15 +0100
Subject: [PATCH] [BUGFIX] Do not assign tab items if their content is empty

In a TabsContainer, if all the fields of a tab are hidden to the editor
(by disabling them in PageTS), the tab would still become assigned in
the 'items' fluid variable. The empty, but invisible, tab would then
still be considered for determining the active tab in the view. If the
first tab was disabled in this way, the editor would see no active tab
at all.
To prevent this from happening, the tab elements are now never assigned,
if their content is completely empty.

Resolves: #89094
Releases: master, 9.5
Change-Id: I3cbe98e7e25b7827fdc68583387343f5f0cb64ca
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/63512
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Benni Mack <benni@typo3.org>
Tested-by: Daniel Goerz <daniel.goerz@posteo.de>
Reviewed-by: Susanne Moog <look@susi.dev>
Reviewed-by: Benni Mack <benni@typo3.org>
Reviewed-by: Daniel Goerz <daniel.goerz@posteo.de>
---
 .../Form/Container/FlexFormTabsContainer.php   | 18 ++++++++++--------
 .../Classes/Form/Container/TabsContainer.php   | 12 +++++++-----
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/typo3/sysext/backend/Classes/Form/Container/FlexFormTabsContainer.php b/typo3/sysext/backend/Classes/Form/Container/FlexFormTabsContainer.php
index df27b14dc4ad..83f07f8b1d3d 100644
--- a/typo3/sysext/backend/Classes/Form/Container/FlexFormTabsContainer.php
+++ b/typo3/sysext/backend/Classes/Form/Container/FlexFormTabsContainer.php
@@ -96,14 +96,16 @@ class FlexFormTabsContainer extends AbstractContainer
             $options['renderType'] = 'flexFormElementContainer';
             $childReturn = $this->nodeFactory->create($options)->render();
 
-            $tabElements[] = [
-                'label' => !empty(trim($sheetDataStructure['ROOT']['sheetTitle'])) ? $languageService->sL(trim($sheetDataStructure['ROOT']['sheetTitle'])) : $sheetName,
-                'content' => $childReturn['html'],
-                'description' => trim($sheetDataStructure['ROOT']['sheetDescription']) ? $languageService->sL(trim($sheetDataStructure['ROOT']['sheetDescription'])) : '',
-                'linkTitle' => trim($sheetDataStructure['ROOT']['sheetShortDescr']) ? $languageService->sL(trim($sheetDataStructure['ROOT']['sheetShortDescr'])) : '',
-            ];
-
-            $resultArray = $this->mergeChildReturnIntoExistingResult($resultArray, $childReturn, false);
+            if ($childReturn['html'] !== '') {
+                $tabElements[] = [
+                    'label' => !empty(trim($sheetDataStructure['ROOT']['sheetTitle'])) ? $languageService->sL(trim($sheetDataStructure['ROOT']['sheetTitle'])) : $sheetName,
+                    'content' => $childReturn['html'],
+                    'description' => trim($sheetDataStructure['ROOT']['sheetDescription']) ? $languageService->sL(trim($sheetDataStructure['ROOT']['sheetDescription'])) : '',
+                    'linkTitle' => trim($sheetDataStructure['ROOT']['sheetShortDescr']) ? $languageService->sL(trim($sheetDataStructure['ROOT']['sheetShortDescr'])) : '',
+                ];
+
+                $resultArray = $this->mergeChildReturnIntoExistingResult($resultArray, $childReturn, false);
+            }
         }
 
         $fieldInformationResult = $this->renderFieldInformation();
diff --git a/typo3/sysext/backend/Classes/Form/Container/TabsContainer.php b/typo3/sysext/backend/Classes/Form/Container/TabsContainer.php
index 7ff9f1414801..d002c3ecb3bf 100644
--- a/typo3/sysext/backend/Classes/Form/Container/TabsContainer.php
+++ b/typo3/sysext/backend/Classes/Form/Container/TabsContainer.php
@@ -85,11 +85,13 @@ class TabsContainer extends AbstractContainer
             $options['renderType'] = 'paletteAndSingleContainer';
             $childArray = $this->nodeFactory->create($options)->render();
 
-            $tabElements[] = [
-                'label' => $tabWithLabelAndElements['label'],
-                'content' => $childArray['html'],
-            ];
-            $resultArray = $this->mergeChildReturnIntoExistingResult($resultArray, $childArray, false);
+            if ($childArray['html'] !== '') {
+                $tabElements[] = [
+                    'label' => $tabWithLabelAndElements['label'],
+                    'content' => $childArray['html'],
+                ];
+                $resultArray = $this->mergeChildReturnIntoExistingResult($resultArray, $childArray, false);
+            }
         }
 
         $resultArray['html'] = $this->renderTabMenu($tabElements, $domIdPrefix);
-- 
GitLab