From 58fa022a1b83d4c6646a7dc7ed055b5177b7a52a Mon Sep 17 00:00:00 2001
From: Georg Ringer <georg.ringer@gmail.com>
Date: Tue, 26 Sep 2017 07:41:52 +0200
Subject: [PATCH] [TASK] Simplify the Clear temp file section in Install Tool

Hide the button for cleaning a directory if the directory is
empty.

Resolves: #82561
Releases: master
Change-Id: I06e76f79b1d814aa5a04a68be544a4c102d7392a
Reviewed-on: https://review.typo3.org/54215
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
---
 .../Controller/MaintenanceController.php      | 16 ++++-
 .../Maintenance/ClearTypo3tempFiles.html      | 32 ++++++---
 .../JavaScript/Modules/ClearTypo3tempFiles.js | 68 +++++++++++++++++--
 3 files changed, 99 insertions(+), 17 deletions(-)

diff --git a/typo3/sysext/install/Classes/Controller/MaintenanceController.php b/typo3/sysext/install/Classes/Controller/MaintenanceController.php
index 5e23bc9cdc3f..c4ef8d5c78d0 100644
--- a/typo3/sysext/install/Classes/Controller/MaintenanceController.php
+++ b/typo3/sysext/install/Classes/Controller/MaintenanceController.php
@@ -53,7 +53,6 @@ class MaintenanceController extends AbstractController
         $view->assignMultiple([
             'clearAllCacheOpcodeCaches' => (new OpcodeCacheService())->getAllActive(),
             'clearTablesClearToken' => $formProtection->generateToken('installTool', 'clearTablesClear'),
-            'clearTypo3tempFilesStats' => (new Typo3tempFileService())->getDirectoryStatistics(),
             'clearTypo3tempFilesToken' => $formProtection->generateToken('installTool', 'clearTypo3tempFiles'),
             'createAdminToken' => $formProtection->generateToken('installTool', 'createAdmin'),
             'databaseAnalyzerExecuteToken' => $formProtection->generateToken('installTool', 'databaseAnalyzerExecute'),
@@ -82,6 +81,21 @@ class MaintenanceController extends AbstractController
         ]);
     }
 
+    /**
+     * Clear typo3temp files statistics action
+     *
+     * @return ResponseInterface
+     */
+    public function clearTypo3tempFilesStatsAction(): ResponseInterface
+    {
+        return new JsonResponse(
+            [
+                'success' => true,
+                'stats' => (new Typo3tempFileService())->getDirectoryStatistics(),
+            ]
+        );
+    }
+
     /**
      * Clear Processed Files
      *
diff --git a/typo3/sysext/install/Resources/Private/Partials/Maintenance/ClearTypo3tempFiles.html b/typo3/sysext/install/Resources/Private/Partials/Maintenance/ClearTypo3tempFiles.html
index c6154626b2f9..3056c5bcc3f1 100644
--- a/typo3/sysext/install/Resources/Private/Partials/Maintenance/ClearTypo3tempFiles.html
+++ b/typo3/sysext/install/Resources/Private/Partials/Maintenance/ClearTypo3tempFiles.html
@@ -14,20 +14,30 @@
 		you can use this tool to remove the "_processed_" ones.
 	</p>
 
+	<div class="t3js-clearTypo3temp-output"></div>
 
-<div id="t3js-clearTypo3temp-delete-token" style="display:none;">{clearTypo3tempFilesToken}</div>
+	<button
+			class="btn btn-default t3js-clearTypo3temp-stats"
+			type="button"
+	>
+		Scan again
+	</button>
+	<hr>
+
+<div class="form-group">
+	<div class="t3js-clearTypo3temp-stat-container"></div>
+</div>
 
-<f:for each="{clearTypo3tempFilesStats}" as="folderStats" iteration="iterator">
-	<div class="t3js-clearTypo3temp-container t3js-clearTypo3temp-container-{folderStats.directory}">
-		<div class="t3js-clearTypo3temp-output"></div>
+<div style="display:none;">
+	<div id="t3js-clearTypo3temp-delete-token" style="display:none;">{clearTypo3tempFilesToken}</div>
+	<div class="t3js-clearTypo3temp-stat-template">
 		<button
-			class="btn btn-warning t3js-clearTypo3temp-delete" data-folder="{folderStats.directory}"
-			type="button"
+				class="btn btn-warning t3js-clearTypo3temp-delete"
+				type="button"
 		>
-			Delete {folderStats.numberOfFiles} in typo3temp/assets/{folderStats.directory}
+			Delete <span class="t3js-clearTypo3temp-stat-numberOfFiles"></span> files in
+			typo3temp/assets/<span class="t3js-clearTypo3temp-stat-directory"></span>
 		</button>
-		<f:if condition="!{iterator.isLast}">
-			<hr />
-		</f:if>
+		<hr class="t3js-clearTypo3temp-stat-lastRuler">
 	</div>
-</f:for>
+</div>
diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTypo3tempFiles.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTypo3tempFiles.js
index 8e684747b567..93386c2b0e18 100644
--- a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTypo3tempFiles.js
+++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ClearTypo3tempFiles.js
@@ -25,27 +25,84 @@ define([
 	'use strict';
 
 	return {
+		selectorGridderOpener: 't3js-clearTypo3temp-open',
 		selectorDeleteToken: '#t3js-clearTypo3temp-delete-token',
 		selectorDeleteTrigger: '.t3js-clearTypo3temp-delete',
 		selectorOutputContainer: '.t3js-clearTypo3temp-output',
+		selectorStatContainer: 't3js-clearTypo3temp-stat-container',
+		selectorStatsTrigger: '.t3js-clearTypo3temp-stats',
+		selectorStatTemplate: '.t3js-clearTypo3temp-stat-template',
+		selectorStatDescription: '.t3js-clearTypo3temp-stat-description',
+		selectorStatNumberOfFiles: '.t3js-clearTypo3temp-stat-numberOfFiles',
+		selectorStatDirectory: '.t3js-clearTypo3temp-stat-directory',
+		selectorStatName: '.t3js-clearTypo3temp-stat-name',
+		selectorStatLastRuler: '.t3js-clearTypo3temp-stat-lastRuler',
+
 
 		initialize: function() {
 			var self = this;
-			$(document).on('click', this.selectorDeleteTrigger, function(e) {
+			// Load stats on first open
+			$(document).on('cardlayout:card-opened', function () {
+				self.getStats();
+			});
+
+			$(document).on('click', this.selectorStatsTrigger, function (e) {
+				e.preventDefault();
+				$(self.selectorOutputContainer).empty();
+				self.getStats();
+			});
+			$(document).on('click', this.selectorDeleteTrigger, function (e) {
 				var folder = $(e.target).data('folder');
 				e.preventDefault();
 				self.delete(folder);
 			});
 		},
 
+		getStats: function () {
+			var self = this;
+			var $outputContainer = $(this.selectorOutputContainer);
+			var $statContainer = $('.' + this.selectorStatContainer);
+			$statContainer.empty();
+			var $statTemplate = $(this.selectorStatTemplate);
+			var message = ProgressBar.render(Severity.loading, 'Loading...', '');
+			$outputContainer.append(message);
+			$.ajax({
+				url: Router.getUrl('clearTypo3tempFilesStats'),
+				cache: false,
+				success: function (data) {
+					if (data.success === true) {
+						$outputContainer.find('.alert-loading').remove();
+						if (Array.isArray(data.stats) && data.stats.length > 0) {
+							data.stats.forEach(function (element) {
+								if (element.numberOfFiles > 0) {
+									var $aStat = $statTemplate.clone();
+									$aStat.find(self.selectorStatNumberOfFiles).text(element.numberOfFiles);
+									$aStat.find(self.selectorStatDirectory).text(element.directory);
+									$aStat.find(self.selectorDeleteTrigger).data('folder', element.directory);
+									$statContainer.append($aStat);
+								}
+							});
+							$statContainer.find(self.selectorStatLastRuler + ':last').remove();
+						}
+					} else {
+						var message = FlashMessage.render(Severity.error, 'Something went wrong', '');
+						$outputContainer.append(message);
+					}
+				},
+				error: function (xhr) {
+					Router.handleAjaxError(xhr);
+				}
+			});
+		},
+
 		delete: function(folder) {
-			var $container = $('.t3js-clearTypo3temp-container-' + folder);
-			var message = ProgressBar.render(Severity.loading, '', '');
-			var $outputContainer = $container.find(this.selectorOutputContainer);
-			$outputContainer.empty().html(message);
+			var $outputContainer = $(this.selectorOutputContainer);
+			var message = ProgressBar.render(Severity.loading, 'Loading...', '');
+			$outputContainer.empty().append(message);
 			$.ajax({
 				method: 'POST',
 				url: Router.getUrl(),
+				context: this,
 				data: {
 					'install': {
 						'action': 'clearTypo3tempFiles',
@@ -61,6 +118,7 @@ define([
 							var message = InfoBox.render(element.severity, element.title, element.message);
 							$outputContainer.html(message);
 						});
+						this.getStats();
 					} else {
 						var message = FlashMessage.render(Severity.error, 'Something went wrong', '');
 						$outputContainer.empty().html(message);
-- 
GitLab