From df0fb93219ce24a11b44ddf7256e4c2886362bf7 Mon Sep 17 00:00:00 2001
From: Oliver Bartsch <bo@cedev.de>
Date: Tue, 6 Feb 2024 17:12:34 +0100
Subject: [PATCH] [BUGFIX] Fix list view functionality in FileList

This fixes several bugs in FileList:

1. Properly initializing the `searchTerm` ensures
   it is kept while sorting.
2. Sorting for "filesize" is now working properly,
   using corresponding collator attribute.
3. Pagination is properly reset on searching.
4. Correct search term is kept on paginating.

Resolves: #103053
Releases: main, 12.4
Change-Id: Ibf7dd278d13aed6142286d7408b9380588485801
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/82850
Tested-by: core-ci <typo3@b13.com>
Tested-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
---
 typo3/sysext/filelist/Classes/FileList.php                 | 7 +++++++
 .../filelist/Resources/Private/Templates/File/List.html    | 2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/typo3/sysext/filelist/Classes/FileList.php b/typo3/sysext/filelist/Classes/FileList.php
index b36c705878d5..aacd49d887ce 100644
--- a/typo3/sysext/filelist/Classes/FileList.php
+++ b/typo3/sysext/filelist/Classes/FileList.php
@@ -291,6 +291,7 @@ class FileList
         }
 
         if ($searchDemand !== null) {
+            $this->searchDemand = $searchDemand;
             if ($searchDemand->getSearchTerm() && $searchDemand->getSearchTerm() !== '') {
                 $folders = [];
                 // Add special "Path" field for the search result
@@ -1429,6 +1430,9 @@ class FileList
         parse_str($uri->getQuery(), $queryParameters);
         unset($queryParameters['contentOnly']);
         $queryParameters = array_merge($queryParameters, ['currentPage' => $targetPage]);
+        if ($this->searchDemand) {
+            $queryParameters['searchTerm'] = $this->searchDemand->getSearchTerm() ?? '';
+        }
         $uri = $uri->withQuery(HttpUtility::buildQueryString($queryParameters, '&'));
 
         return new PaginationLink(
@@ -1556,6 +1560,9 @@ class FileList
     protected function sortResources(array $resources, string $sortField): array
     {
         $collator = new \Collator((string)($this->getLanguageService()->getLocale() ?? 'en'));
+        if ($sortField === 'size') {
+            $collator->setAttribute(\Collator::NUMERIC_COLLATION, \Collator::ON);
+        }
         uksort($resources, function (int $index1, int $index2) use ($sortField, $resources, $collator) {
             $resource1 = $resources[$index1];
             $resource2 = $resources[$index2];
diff --git a/typo3/sysext/filelist/Resources/Private/Templates/File/List.html b/typo3/sysext/filelist/Resources/Private/Templates/File/List.html
index 4372580730f1..a8f4948480cc 100644
--- a/typo3/sysext/filelist/Resources/Private/Templates/File/List.html
+++ b/typo3/sysext/filelist/Resources/Private/Templates/File/List.html
@@ -50,7 +50,7 @@
                         <label for="filelist-searchterm" class="visually-hidden">
                             <f:translate id="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.label.searchString"/>
                         </label>
-                        <input type="hidden" name="pointer" value="0" />
+                        <input type="hidden" name="currentPage" value="0" />
                         <button type="submit" class="btn btn-default" name="search"><core:icon identifier="actions-search" /></button>
                     </div>
                 </div>
-- 
GitLab