From b3908e99ef40d88aa868185f3430f7d1db9f4fbd Mon Sep 17 00:00:00 2001
From: Mathias Schreiber <mathias.schreiber@wmdb.de>
Date: Mon, 5 Oct 2015 12:10:19 +0200
Subject: [PATCH] [TASK] Use ModuleTemplate API for EXT:viewpage

Releases: master
Resolves: #70365
Change-Id: I95315d1b713d28df0ec5f6fdde61eb2abc10a182
Reviewed-on: http://review.typo3.org/43812
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Frans Saris <franssaris@gmail.com>
Tested-by: Frans Saris <franssaris@gmail.com>
---
 .../Controller/ViewModuleController.php       | 66 ++++++++++++++++++-
 .../Resources/Private/Layouts/DocHeader.html  | 57 +++++-----------
 .../Resources/Public/JavaScript/Main.js       | 15 ++++-
 3 files changed, 96 insertions(+), 42 deletions(-)

diff --git a/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php b/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php
index 56a2de230f9e..f3ae3c246719 100644
--- a/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php
+++ b/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php
@@ -14,14 +14,73 @@ namespace TYPO3\CMS\Viewpage\Controller;
  * The TYPO3 project - inspiring people to share!
  */
 
+use TYPO3\CMS\Backend\Template\Components\ButtonBar;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Backend\View\BackendTemplateView;
+use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Page\PageRenderer;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
+use TYPO3\CMS\Extbase\Mvc\View\ViewInterface;
 
 /**
  * Controller for viewing the frontend
  */
-class ViewModuleController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
+class ViewModuleController extends ActionController {
+
+	/**
+	 * @var string
+	 */
+	protected $defaultViewObjectName = BackendTemplateView::class;
+
+	/**
+	 * @var BackendTemplateView
+	 */
+	protected $view;
+
+	/**
+	 * Set up the doc header properly here
+	 *
+	 * @param ViewInterface $view
+	 */
+	protected function initializeView(ViewInterface $view) {
+		/** @var BackendTemplateView $view */
+		parent::initializeView($view);
+		$this->registerButtons();
+	}
+
+	/**
+	 * Registers the docheader buttons
+	 */
+	protected function registerButtons() {
+		$iconFactory = $this->view->getModuleTemplate()->getIconFactory();
+		$buttonBar = $this->view->getModuleTemplate()->getDocHeaderComponent()->getButtonBar();
+		$showButton = $buttonBar->makeLinkButton()
+			->setHref($this->getTargetUrl())
+			->setOnClick('window.open(this.href, \'newTYPO3frontendWindow\').focus();return false;')
+			->setTitle($this->getLanguageService()->sL('LLL:EXT:lang/locallang_core.xlf:labels.showPage', TRUE))
+			->setIcon($iconFactory->getIcon('actions-document-view', Icon::SIZE_SMALL));
+		$buttonBar->addButton($showButton);
+
+		$refreshButton = $buttonBar->makeLinkButton()
+			->setHref('javascript:document.getElementById(\'tx_viewpage_iframe\').contentWindow.location.reload(true);')
+			->setTitle($this->getLanguageService()->sL('LLL:EXT:viewpage/Resources/Private/Language/locallang.xlf:refreshPage'))
+			->setIcon($iconFactory->getIcon('actions-refresh', Icon::SIZE_SMALL));
+		$buttonBar->addButton($refreshButton, ButtonBar::BUTTON_POSITION_RIGHT, 1);
+
+		$currentRequest = $this->request;
+		$moduleName = $currentRequest->getPluginName();
+		$getVars = $this->request->getArguments();
+		$extensionName = $currentRequest->getControllerExtensionName();
+		if (count($getVars) === 0) {
+			$modulePrefix = strtolower('tx_' . $extensionName . '_' . $moduleName);
+			$getVars = array('id', 'M', $modulePrefix);
+		}
+		$getList = implode(',', $getVars);
+		$shortcutButton = $buttonBar->makeFullyRenderedButton()
+			->setHtmlSource($this->view->getModuleTemplate()->makeShortcutIcon($getList, '', $moduleName));
+		$buttonBar->addButton($shortcutButton, ButtonBar::BUTTON_POSITION_RIGHT, 2);
+	}
 
 	/**
 	 * Gets called before each action
@@ -52,6 +111,11 @@ class ViewModuleController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionContr
 	 */
 	protected function getTargetUrl() {
 		$pageIdToShow = (int)GeneralUtility::_GP('id');
+
+		$permissionClause = $this->getBackendUser()->getPagePermsClause(1);
+		$pageRecord = BackendUtility::readPageAccess($pageIdToShow, $permissionClause);
+		$this->view->getModuleTemplate()->getDocHeaderComponent()->setMetaInformation($pageRecord);
+
 		$adminCommand = $this->getAdminCommand($pageIdToShow);
 		$domainName = $this->getDomainName($pageIdToShow);
 		$languageParameter = $this->getLanguageParameter();
diff --git a/typo3/sysext/viewpage/Resources/Private/Layouts/DocHeader.html b/typo3/sysext/viewpage/Resources/Private/Layouts/DocHeader.html
index aea8c80a2248..e06e27b0afe3 100644
--- a/typo3/sysext/viewpage/Resources/Private/Layouts/DocHeader.html
+++ b/typo3/sysext/viewpage/Resources/Private/Layouts/DocHeader.html
@@ -1,47 +1,24 @@
 {namespace core=TYPO3\CMS\Core\ViewHelpers}
-<f:be.container
+<f:be.pageRenderer
 	includeCssFiles="{
 		0:'{f:uri.resource(path:\'Css/ui-lightness/jquery-ui-1.10.3.custom.min.css\')}',
 		1:'{f:uri.resource(path:\'Css/main.css\')}'
 	}"
 	includeRequireJsModules="{
 		0:'TYPO3/CMS/Viewpage/Main'
-	}">
-	<div class="typo3-fullDoc">
-		<div id="typo3-docheader">
-			<div class="typo3-docheader-functions">
-				<form>
-					<label for="width">
-						<f:translate key="width" />
-					</label>
-					<f:form.select options="{widths}" id="width" name="width" />
-					<f:if condition="{languages -> f:count()} > 1">
-						<label for="language">
-							<f:translate key="language" />
-						</label>
-						<f:form.select options="{languages}" id="language" name="language" />
-					</f:if>
-				</form>
-			</div>
-			<div class="typo3-docheader-buttons">
-				<div class="left">
-					<a href="{url}" onclick="window.open(this.href, 'newTYPO3frontendWindow').focus();return false;" title="{f:translate(key: 'LLL:EXT:lang/locallang_core.xlf:labels.showPage')}">
-						<core:icon identifier="actions-document-view" />
-					</a>
-				</div>
-				<div class="right">
-					<a href="javascript:document.getElementById('tx_viewpage_iframe').contentWindow.location.reload(true);" title="{f:translate(key: 'refreshPage')}">
-						<core:icon identifier="actions-refresh" />
-					</a>
-					<f:be.buttons.shortcut/>
-				</div>
-			</div>
-		</div>
-
-		<div id="typo3-docbody">
-			<div id="typo3-inner-docbody" class="tx_viewpage">
-				<f:render section="Content" />
-			</div>
-		</div>
-	</div>
-</f:be.container>
+	}" />
+<div class="tx_viewpage">
+	<form>
+		<label for="width">
+			<f:translate key="width" />
+		</label>
+		<f:form.select options="{widths}" id="width" name="width" />
+		<f:if condition="{languages -> f:count()} > 1">
+			<label for="language">
+				<f:translate key="language" />
+			</label>
+			<f:form.select options="{languages}" id="language" name="language" />
+		</f:if>
+	</form>
+	<f:render section="Content" />
+</div>
\ No newline at end of file
diff --git a/typo3/sysext/viewpage/Resources/Public/JavaScript/Main.js b/typo3/sysext/viewpage/Resources/Public/JavaScript/Main.js
index 4f940e20c22d..1dec38919484 100644
--- a/typo3/sysext/viewpage/Resources/Public/JavaScript/Main.js
+++ b/typo3/sysext/viewpage/Resources/Public/JavaScript/Main.js
@@ -37,9 +37,13 @@ define(['jquery', 'jquery-ui/resizable'], function($) {
 			var value = me.$widthSelector.val();
 			if (value) {
 				value = value.split('|');
+				var height = value[1] || '100%';
+				if (height === '100%') {
+					height = ViewPage.calculateContainerMaxHeight();
+				}
 				me.$resizableContainer.animate({
 					width:  value[0],
-					height: value[1] || '100%'
+					height: height
 				});
 				Storage.Persistent.set(me.storagePrefix + 'widthSelectorValue', value[0] + '|' + (value[1] || '100%'));
 			}
@@ -118,6 +122,15 @@ define(['jquery', 'jquery-ui/resizable'], function($) {
 		});
 	};
 
+	ViewPage.calculateContainerMaxHeight = function() {
+		ViewPage.$resizableContainer.hide();
+		var padding = $('.t3js-module-body').outerHeight() - $('.t3js-module-body').height(),
+			controlsHeight = ViewPage.$widthSelector.parents('form:first').height(),
+			documentHeight = $(document).height();
+		ViewPage.$resizableContainer.show();
+		return documentHeight - (controlsHeight + padding);
+	};
+
 	ViewPage.addCustomWidthOption = function(value) {
 		ViewPage.$widthSelector.prepend('<option id="customOption" value="' + value + '">' + ViewPage.getOptionLabel(value) + '</option>');
 	};
-- 
GitLab