diff --git a/typo3/sysext/install/Classes/Controller/MaintenanceController.php b/typo3/sysext/install/Classes/Controller/MaintenanceController.php index 5e23bc9cdc3f33ebe042ee2e6ae79a54e35ed5f0..c4ef8d5c78d05b33026bc9b2d7ee755b57907273 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 c6154626b2f9d3579b6cba975f64d3e1904b3c2c..3056c5bcc3f16faf672143263ee3e7edec9512a9 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 8e684747b56738483a3e465c3b1e04d4b0b12d33..93386c2b0e181e5f7229d5c7ae7654ee74f3f9bd 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);