From 9ae17efce9b3fce4d8636d14afdb005a4d795534 Mon Sep 17 00:00:00 2001
From: Dan Brown <ssddanbrown@googlemail.com>
Date: Fri, 23 Jun 2023 16:42:40 +0100
Subject: [PATCH] Shelf view: Updated books to be database sorted

Fixes issue where sorting would not match other database-sorted parts of
app due to case sensitivity differences.
Added test to cover.

For #4341
---
 .../Controllers/BookshelfController.php       |  7 +++---
 tests/Entity/BookShelfTest.php                | 25 +++++++++++++++++++
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/app/Entities/Controllers/BookshelfController.php b/app/Entities/Controllers/BookshelfController.php
index d1b752dc2..fcfd37538 100644
--- a/app/Entities/Controllers/BookshelfController.php
+++ b/app/Entities/Controllers/BookshelfController.php
@@ -30,7 +30,7 @@ class BookshelfController extends Controller
     }
 
     /**
-     * Display a listing of the book.
+     * Display a listing of bookshelves.
      */
     public function index(Request $request)
     {
@@ -111,8 +111,9 @@ class BookshelfController extends Controller
         ]);
 
         $sort = $listOptions->getSort();
-        $sortedVisibleShelfBooks = $shelf->visibleBooks()->get()
-            ->sortBy($sort === 'default' ? 'pivot.order' : $sort, SORT_REGULAR, $listOptions->getOrder() === 'desc')
+        $sortedVisibleShelfBooks = $shelf->visibleBooks()
+            ->reorder($sort === 'default' ? 'order' : $sort, $listOptions->getOrder())
+            ->get()
             ->values()
             ->all();
 
diff --git a/tests/Entity/BookShelfTest.php b/tests/Entity/BookShelfTest.php
index a10a56e9e..c1842c175 100644
--- a/tests/Entity/BookShelfTest.php
+++ b/tests/Entity/BookShelfTest.php
@@ -196,6 +196,31 @@ class BookShelfTest extends TestCase
         $this->withHtml($resp)->assertElementContains('.book-content a.grid-card:nth-child(3)', 'adsfsdfsdfsd');
     }
 
+    public function test_shelf_view_sorts_by_name_case_insensitively()
+    {
+        $shelf = Bookshelf::query()->whereHas('books')->with('books')->first();
+        $books = Book::query()->take(3)->get(['id', 'name']);
+        $books[0]->fill(['name' => 'Book Ab'])->save();
+        $books[1]->fill(['name' => 'Book ac'])->save();
+        $books[2]->fill(['name' => 'Book AD'])->save();
+
+        // Set book ordering
+        $this->asAdmin()->put($shelf->getUrl(), [
+            'books' => $books->implode('id', ','),
+            'tags'  => [], 'description' => 'abc', 'name' => 'abc',
+        ]);
+        $this->assertEquals(3, $shelf->books()->count());
+        $shelf->refresh();
+
+        setting()->putUser($this->users->editor(), 'shelf_books_sort', 'name');
+        setting()->putUser($this->users->editor(), 'shelf_books_sort_order', 'asc');
+        $html = $this->withHtml($this->asEditor()->get($shelf->getUrl()));
+
+        $html->assertElementContains('.book-content a.grid-card:nth-child(1)', 'Book Ab');
+        $html->assertElementContains('.book-content a.grid-card:nth-child(2)', 'Book ac');
+        $html->assertElementContains('.book-content a.grid-card:nth-child(3)', 'Book AD');
+    }
+
     public function test_shelf_edit()
     {
         $shelf = $this->entities->shelf();