From 844976c85bd9816b5427090b732eda5d32227c47 Mon Sep 17 00:00:00 2001
From: Abijeet <AbijeetP@users.noreply.github.com>
Date: Wed, 12 Jul 2017 11:40:50 +0530
Subject: [PATCH] Revert "Revert "Bookstack grid view.""

---
 app/Book.php                                  |  20 ++++++++-
 app/Http/Controllers/BookController.php       |  10 ++---
 app/User.php                                  |   2 +-
 ...7_07_05_102650_add_cover_image_display.php |  40 ++++++++++++++++++
 public/default.png                            | Bin 0 -> 3338 bytes
 resources/assets/js/global.js                 |   7 +++
 resources/assets/sass/styles.scss             |  29 ++++++++++++-
 resources/lang/de/common.php                  |   3 +-
 resources/lang/de/settings.php                |   1 +
 resources/lang/en/common.php                  |   2 +
 resources/lang/en/settings.php                |   1 +
 resources/lang/es/common.php                  |   3 +-
 resources/lang/es/settings.php                |   1 +
 resources/lang/fr/common.php                  |   3 +-
 resources/lang/fr/settings.php                |   1 +
 resources/lang/nl/common.php                  |   3 +-
 resources/lang/nl/settings.php                |   1 +
 resources/lang/pt_BR/common.php               |   3 +-
 resources/lang/pt_BR/settings.php             |   1 +
 resources/lang/sk/common.php                  |   3 +-
 resources/lang/sk/settings.php                |   1 +
 resources/views/books/create.blade.php        |   5 ++-
 resources/views/books/edit.blade.php          |   2 +-
 resources/views/books/form.blade.php          |  14 ++++++
 resources/views/books/grid-item.blade.php     |  15 +++++++
 resources/views/books/index.blade.php         |  30 ++++++++-----
 resources/views/users/edit.blade.php          |   7 +++
 27 files changed, 179 insertions(+), 29 deletions(-)
 create mode 100644 database/migrations/2017_07_05_102650_add_cover_image_display.php
 create mode 100644 public/default.png
 create mode 100644 resources/views/books/grid-item.blade.php

diff --git a/app/Book.php b/app/Book.php
index 06c00945d..b4cafd65b 100644
--- a/app/Book.php
+++ b/app/Book.php
@@ -3,7 +3,7 @@
 class Book extends Entity
 {
 
-    protected $fillable = ['name', 'description'];
+    protected $fillable = ['name', 'description', 'image'];
 
     /**
      * Get the url for this book.
@@ -18,6 +18,24 @@ class Book extends Entity
         return baseUrl('/books/' . urlencode($this->slug));
     }
 
+    public function getBookCover($size = 120)
+    {
+        $default = baseUrl('/default.png');
+        $image = $this->image;
+        if ($image === 0 || $image === '0' || $image === null) 
+            return $default;
+        try {
+            $cover = $this->cover ? baseUrl($this->cover->getThumb(120, 192, false)) : $default;
+        } catch (\Exception $err) {
+            $cover = $default;
+        }
+        return $cover;
+    }
+
+    public function cover()
+    {
+        return $this->belongsTo(Image::class, 'image');
+    }
     /*
      * Get the edit url for this book.
      * @return string
diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php
index 4313a4e20..eecb7839f 100644
--- a/app/Http/Controllers/BookController.php
+++ b/app/Http/Controllers/BookController.php
@@ -39,9 +39,9 @@ class BookController extends Controller
         $books = $this->entityRepo->getAllPaginated('book', 16);
         $recents = $this->signedIn ? $this->entityRepo->getRecentlyViewed('book', 4, 0) : false;
         $popular = $this->entityRepo->getPopular('book', 3, 0);
-        $display = $this->currentUser->display;
+        $books_display = $this->currentUser->books_display;
         $this->setPageTitle('Books');
-        return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular, 'display' => $display]); //added displaly to access user display
+        return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular, 'books_display' => $books_display] );
     }
 
     /**
@@ -115,9 +115,9 @@ class BookController extends Controller
             'name' => 'required|string|max:255',
             'description' => 'string|max:1000'
         ]);
-        $book = $this->entityRepo->updateFromInput('book', $book, $request->all());
-        Activity::add($book, 'book_update', $book->id);
-        return redirect($book->getUrl());
+         $book = $this->entityRepo->updateFromInput('book', $book, $request->all());
+         Activity::add($book, 'book_update', $book->id);
+         return redirect($book->getUrl());
     }
 
     /**
diff --git a/app/User.php b/app/User.php
index 8033557e4..703322cbd 100644
--- a/app/User.php
+++ b/app/User.php
@@ -22,7 +22,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
      * The attributes that are mass assignable.
      * @var array
      */
-    protected $fillable = ['name', 'email', 'image_id'];
+    protected $fillable = ['name', 'email', 'image_id', 'books_display' ];
 
     /**
      * The attributes excluded from the model's JSON form.
diff --git a/database/migrations/2017_07_05_102650_add_cover_image_display.php b/database/migrations/2017_07_05_102650_add_cover_image_display.php
new file mode 100644
index 000000000..396112744
--- /dev/null
+++ b/database/migrations/2017_07_05_102650_add_cover_image_display.php
@@ -0,0 +1,40 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class AddCoverImageDisplay extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->string('books_display',10)->default('grid');
+        });
+
+        Schema::table('books', function (Blueprint $table) {
+            $table->integer('image');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->dropColumn('books_display');
+        });
+
+        Schema::table('books', function (Blueprint $table) {
+            $table->dropColumn('image');
+        });
+    }
+}
diff --git a/public/default.png b/public/default.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d7b737e7da36a919d9d389cbd980938cfae2435
GIT binary patch
literal 3338
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
OE#z=`VAB_;zWFz_;LFee

literal 0
HcmV?d00001

diff --git a/resources/assets/js/global.js b/resources/assets/js/global.js
index 2ef062a5b..bd55777e8 100644
--- a/resources/assets/js/global.js
+++ b/resources/assets/js/global.js
@@ -154,6 +154,13 @@ $('[data-action="expand-entity-list-details"]').click(function() {
     $('.entity-list.compact').find('p').not('.empty-text').slideToggle(240);
 });
 
+// Toggle thumbnails
+$(document).ready(function(){
+   $('[data-action="expand-thumbnail"]').click(function(){
+     $('.galleryItem').toggleClass("collapse").find('img').slideToggle(50);
+   });
+});
+
 // Popup close
 $('.popup-close').click(function() {
     $(this).closest('.overlay').fadeOut(240);
diff --git a/resources/assets/sass/styles.scss b/resources/assets/sass/styles.scss
index afb9d531b..aa3ac1069 100644
--- a/resources/assets/sass/styles.scss
+++ b/resources/assets/sass/styles.scss
@@ -63,6 +63,11 @@ body.dragging, body.dragging * {
   &.square {
     border-radius: 3px;
   }
+  &.cover {
+    height: 192px;
+    width: 120px;
+    border-radius: 3px;
+  }
 }
 
 // System wide notifications
@@ -274,5 +279,25 @@ $btt-size: 40px;
   }
 }
 
-
-
+.galleryItem {
+  margin-bottom: 32px;
+  height: 330px;
+  overflow: hidden;
+  border: 1px solid #9e9e9e;
+  h3 {
+    font-size: 1.2em;
+    text-align: center;
+  }
+  p {
+    font-size: 0.8em;
+    text-align: center;
+  }
+  img {
+    height: 192px;
+    width: 120px;
+    margin-top: 5%;
+  }
+  &.collapse {
+    height: 130px;
+  }
+}
diff --git a/resources/lang/de/common.php b/resources/lang/de/common.php
index 7ad1743a0..c3ee51abb 100644
--- a/resources/lang/de/common.php
+++ b/resources/lang/de/common.php
@@ -17,6 +17,7 @@ return [
     'name' => 'Name',
     'description' => 'Beschreibung',
     'role' => 'Rolle',
+    'cover_image' => 'Titelbild',
 
     /**
      * Actions
@@ -43,7 +44,7 @@ return [
     'no_items' => 'Keine Eintr&auml;ge gefunden.',
     'back_to_top' => 'nach oben',
     'toggle_details' => 'Details zeigen/verstecken',
-
+    'toggle_thumbnails' => 'Thumbnails zeigen/verstecken',
     /**
      * Header
      */
diff --git a/resources/lang/de/settings.php b/resources/lang/de/settings.php
index 668eecf33..21d65321f 100644
--- a/resources/lang/de/settings.php
+++ b/resources/lang/de/settings.php
@@ -91,6 +91,7 @@ return [
     'users_external_auth_id' => 'Externe Authentifizierungs-ID',
     'users_password_warning' => 'F&uuml;llen Sie die folgenden Felder nur aus, wenn Sie Ihr Passwort &auml;ndern m&ouml;chten:',
     'users_system_public' => 'Dieser Benutzer repr&auml;sentiert alle Gast-Benutzer, die diese Seite betrachten. Er kann nicht zum Anmelden benutzt werden, sondern wird automatisch zugeordnet.',
+    'users_books_display_type' => 'Wählen Sie die Art der Ansicht aus',
     'users_delete' => 'Benutzer l&ouml;schen',
     'users_delete_named' => 'Benutzer :userName l&ouml;schen',
     'users_delete_warning' => 'Sie m&ouml;chten den Benutzer \':userName\' g&auml;nzlich aus dem System l&ouml;schen.',
diff --git a/resources/lang/en/common.php b/resources/lang/en/common.php
index e1d74c95e..c05cfa56c 100644
--- a/resources/lang/en/common.php
+++ b/resources/lang/en/common.php
@@ -17,6 +17,7 @@ return [
     'name' => 'Name',
     'description' => 'Description',
     'role' => 'Role',
+    'cover_image' => 'Cover image',
 
     /**
      * Actions
@@ -44,6 +45,7 @@ return [
     'no_items' => 'No items available',
     'back_to_top' => 'Back to top',
     'toggle_details' => 'Toggle Details',
+    'toggle_thumbnails' => 'Toggle Thumbnails',
 
     /**
      * Header
diff --git a/resources/lang/en/settings.php b/resources/lang/en/settings.php
index 4529b1978..732b64c42 100644
--- a/resources/lang/en/settings.php
+++ b/resources/lang/en/settings.php
@@ -91,6 +91,7 @@ return [
     'users_external_auth_id' => 'External Authentication ID',
     'users_password_warning' => 'Only fill the below if you would like to change your password:',
     'users_system_public' => 'This user represents any guest users that visit your instance. It cannot be used to log in but is assigned automatically.',
+    'users_books_display_type' => 'Select the type of view',
     'users_delete' => 'Delete User',
     'users_delete_named' => 'Delete user :userName',
     'users_delete_warning' => 'This will fully delete this user with the name \':userName\' from the system.',
diff --git a/resources/lang/es/common.php b/resources/lang/es/common.php
index 3a62a2177..9a8fafc95 100644
--- a/resources/lang/es/common.php
+++ b/resources/lang/es/common.php
@@ -17,7 +17,7 @@ return [
     'name' => 'Nombre',
     'description' => 'Descripción',
     'role' => 'Rol',
-
+    'cover_image' => 'Imagen de portada',
     /**
      * Actions
      */
@@ -43,6 +43,7 @@ return [
     'no_items' => 'No hay items disponibles',
     'back_to_top' => 'Volver arriba',
     'toggle_details' => 'Alternar detalles',
+    'toggle_thumbnails' => 'Alternar miniaturas',
 
     /**
      * Header
diff --git a/resources/lang/es/settings.php b/resources/lang/es/settings.php
index cd6a8b8d9..90bb0db2c 100644
--- a/resources/lang/es/settings.php
+++ b/resources/lang/es/settings.php
@@ -91,6 +91,7 @@ return [
     'users_external_auth_id' => 'ID externo de autenticación',
     'users_password_warning' => 'Solo rellene a continuación si desea cambiar su password:',
     'users_system_public' => 'Este usuario representa cualquier usuario invitado que visita la aplicación. No puede utilizarse para hacer login sio que es asignado automáticamente.',
+    'users_books_display_type' => 'Seleccione el tipo de vista',
     'users_delete' => 'Borrar usuario',
     'users_delete_named' => 'Borrar usuario :userName',
     'users_delete_warning' => 'Se borrará completamente el usuario con el nombre \':userName\' del sistema.',
diff --git a/resources/lang/fr/common.php b/resources/lang/fr/common.php
index 5eb4b8fa8..fe8bb761a 100644
--- a/resources/lang/fr/common.php
+++ b/resources/lang/fr/common.php
@@ -17,7 +17,7 @@ return [
     'name' => 'Nom',
     'description' => 'Description',
     'role' => 'Rôle',
-
+    'cover_image' => 'Image de couverture',
     /**
      * Actions
      */
@@ -43,6 +43,7 @@ return [
     'no_items' => 'Aucun élément',
     'back_to_top' => 'Retour en haut',
     'toggle_details' => 'Afficher les détails',
+    'toggle_thumbnails' => 'Afficher les vignettes',
 
     /**
      * Header
diff --git a/resources/lang/fr/settings.php b/resources/lang/fr/settings.php
index 8a3756527..288c56d5a 100644
--- a/resources/lang/fr/settings.php
+++ b/resources/lang/fr/settings.php
@@ -91,6 +91,7 @@ return [
     'users_external_auth_id' => 'Identifiant d\'authentification externe',
     'users_password_warning' => 'Remplissez ce fomulaire uniquement si vous souhaitez changer de mot de passe:',
     'users_system_public' => 'Cet utilisateur représente les invités visitant votre instance. Il est assigné automatiquement aux invités.',
+    'users_books_display_type' => 'Sélectionnez le type de vue',
     'users_delete' => 'Supprimer un utilisateur',
     'users_delete_named' => 'Supprimer l\'utilisateur :userName',
     'users_delete_warning' => 'Ceci va supprimer \':userName\' du système.',
diff --git a/resources/lang/nl/common.php b/resources/lang/nl/common.php
index bdde9eb95..a096c1d22 100644
--- a/resources/lang/nl/common.php
+++ b/resources/lang/nl/common.php
@@ -17,7 +17,7 @@ return [
     'name' => 'Naam',
     'description' => 'Beschrijving',
     'role' => 'Rol',
-
+    'cover_image' => 'Omslagfoto',
     /**
      * Actions
      */
@@ -43,6 +43,7 @@ return [
     'no_items' => 'Geen items beschikbaar',
     'back_to_top' => 'Terug naar boven',
     'toggle_details' => 'Details Weergeven',
+    'toggle_thumbnails' => 'Thumbnails Weergeven',
 
     /**
      * Header
diff --git a/resources/lang/nl/settings.php b/resources/lang/nl/settings.php
index 7408a2dc3..7b2f94530 100644
--- a/resources/lang/nl/settings.php
+++ b/resources/lang/nl/settings.php
@@ -91,6 +91,7 @@ return [
     'users_external_auth_id' => 'External Authentication ID',
     'users_password_warning' => 'Vul onderstaande formulier alleen in als je het wachtwoord wilt aanpassen:',
     'users_system_public' => 'De eigenschappen van deze gebruiker worden voor elke gastbezoeker gebruikt. Er kan niet mee ingelogd worden en wordt automatisch toegewezen.',
+    'users_books_display_type' => 'Selecteer het type weergave',
     'users_delete' => 'Verwijder gebruiker',
     'users_delete_named' => 'Verwijder gebruiker :userName',
     'users_delete_warning' => 'Dit zal de gebruiker \':userName\' volledig uit het systeem verwijderen.',
diff --git a/resources/lang/pt_BR/common.php b/resources/lang/pt_BR/common.php
index 820ba219c..eba301929 100644
--- a/resources/lang/pt_BR/common.php
+++ b/resources/lang/pt_BR/common.php
@@ -17,7 +17,7 @@ return [
     'name' => 'Nome',
     'description' => 'Descrição',
     'role' => 'Regra',
-
+    'cover_image' => 'Imagem de capa',
     /**
      * Actions
      */
@@ -43,6 +43,7 @@ return [
     'no_items' => 'Nenhum item disponível',
     'back_to_top' => 'Voltar ao topo',
     'toggle_details' => 'Alternar Detalhes',
+    'toggle_thumbnails' => 'Alternar Miniaturas',
 
     /**
      * Header
diff --git a/resources/lang/pt_BR/settings.php b/resources/lang/pt_BR/settings.php
index b8d062b5f..b46eda8df 100644
--- a/resources/lang/pt_BR/settings.php
+++ b/resources/lang/pt_BR/settings.php
@@ -91,6 +91,7 @@ return [
     'users_external_auth_id' => 'ID de Autenticação Externa',
     'users_password_warning' => 'Preencha os dados abaixo caso queira modificar a sua senha:',
     'users_system_public' => 'Esse usuário representa quaisquer convidados que visitam o aplicativo. Ele não pode ser usado para login.',
+    'users_books_display_type' => 'Selecione o tipo de exibição',
     'users_delete' => 'Excluir Usuário',
     'users_delete_named' => 'Excluir :userName',
     'users_delete_warning' => 'A ação vai excluir completamente o usuário de nome \':userName\' do sistema.',
diff --git a/resources/lang/sk/common.php b/resources/lang/sk/common.php
index 100981597..19ba665b5 100644
--- a/resources/lang/sk/common.php
+++ b/resources/lang/sk/common.php
@@ -17,7 +17,7 @@ return [
     'name' => 'Meno',
     'description' => 'Popis',
     'role' => 'Rola',
-
+    'cover_image' => 'Obal knihy',
     /**
      * Actions
      */
@@ -43,6 +43,7 @@ return [
     'no_items' => 'Žiadne položky nie sú dostupné',
     'back_to_top' => 'Späť nahor',
     'toggle_details' => 'Prepnúť detaily',
+    'toggle_thumbnails' => 'Prepnúť náhľady',
 
     /**
      * Header
diff --git a/resources/lang/sk/settings.php b/resources/lang/sk/settings.php
index 643b4b8ff..1c745fcf8 100644
--- a/resources/lang/sk/settings.php
+++ b/resources/lang/sk/settings.php
@@ -91,6 +91,7 @@ return [
     'users_external_auth_id' => 'Externé autentifikačné ID',
     'users_password_warning' => 'Pole nižšie vyplňte iba ak chcete zmeniť heslo:',
     'users_system_public' => 'Tento účet reprezentuje každého hosťovského používateľa, ktorý navštívi Vašu inštanciu. Nedá sa pomocou neho prihlásiť a je priradený automaticky.',
+    'users_books_display_type' => 'Vyberte typ zobrazenia',
     'users_delete' => 'Zmazať používateľa',
     'users_delete_named' => 'Zmazať používateľa :userName',
     'users_delete_warning' => ' Toto úplne odstráni používateľa menom \':userName\' zo systému.',
diff --git a/resources/views/books/create.blade.php b/resources/views/books/create.blade.php
index 2c629e699..4d1edf78b 100644
--- a/resources/views/books/create.blade.php
+++ b/resources/views/books/create.blade.php
@@ -4,9 +4,10 @@
 
 <div class="container small" ng-non-bindable>
     <h1>{{ trans('entities.books_create') }}</h1>
-    <form action="{{ baseUrl("/books") }}" method="POST">
+    <form action="{{ baseUrl("/books") }}" method="POST" enctype="multipart/form-data">
         @include('books/form')
     </form>
 </div>
-
+<p class="margin-top large"><br></p>
+    @include('components.image-manager', ['imageType' => 'cover'])
 @stop
\ No newline at end of file
diff --git a/resources/views/books/edit.blade.php b/resources/views/books/edit.blade.php
index 2419b68da..322f3d700 100644
--- a/resources/views/books/edit.blade.php
+++ b/resources/views/books/edit.blade.php
@@ -19,5 +19,5 @@
             @include('books/form', ['model' => $book])
         </form>
     </div>
-
+@include('components.image-manager', ['imageType' => 'cover'])
 @stop
\ No newline at end of file
diff --git a/resources/views/books/form.blade.php b/resources/views/books/form.blade.php
index b1484d129..34f5fd842 100644
--- a/resources/views/books/form.blade.php
+++ b/resources/views/books/form.blade.php
@@ -9,7 +9,21 @@
     <label for="description">{{ trans('common.description') }}</label>
     @include('form/textarea', ['name' => 'description'])
 </div>
+<div class="form-group" id="logo-control">
+        <label for="user-avatar">{{ trans('common.cover_image') }}</label>
+        <p class="small">{{ trans('common.cover_image_description') }}</p>
 
+        @include('components.image-picker', [
+            'resizeHeight' => '192',
+            'resizeWidth' => '120',
+            'showRemove' => true,
+            'defaultImage' => baseUrl('/default.png'),
+            'currentImage' => @isset($model) ? $model->getBookCover(80) : baseUrl('/default.png') ,
+            'currentId' => @isset($model) ? $model->image : 0,
+            'name' => 'image',
+            'imageClass' => 'avatar cover'
+        ])
+</div>
 <div class="form-group">
     <a href="{{ isset($book) ? $book->getUrl() : baseUrl('/books') }}" class="button muted">{{ trans('common.cancel') }}</a>
     <button type="submit" class="button pos">{{ trans('entities.books_save') }}</button>
diff --git a/resources/views/books/grid-item.blade.php b/resources/views/books/grid-item.blade.php
new file mode 100644
index 000000000..d11a66eac
--- /dev/null
+++ b/resources/views/books/grid-item.blade.php
@@ -0,0 +1,15 @@
+<div class="col-xs-12 col-sm-6 col-md-4 col-lg-3"  data-entity-type="book" data-entity-id="{{$book->id}}">
+    <div class="galleryItem">
+    <h3>
+        <a class="text-book entity-list-item-link" href="{{$book->getUrl()}}"><i class="zmdi zmdi-book"></i><span class="entity-list-item-name">{{$book->name}}</span>
+        <br>
+        <img src="{{$book->getBookCover(192)}}" alt="{{$book->name}}">
+        </a>
+    </h3>
+    @if(isset($book->searchSnippet))
+        <p class="text-muted">{!! $book->searchSnippet !!}</p>
+    @else
+        <p class="text-muted">{{ $book->getExcerpt() }}</p>
+    @endif
+</div>
+</div>
\ No newline at end of file
diff --git a/resources/views/books/index.blade.php b/resources/views/books/index.blade.php
index c090a127e..c5dd38a87 100644
--- a/resources/views/books/index.blade.php
+++ b/resources/views/books/index.blade.php
@@ -5,13 +5,13 @@
     <div class="faded-small toolbar">
         <div class="container">
             <div class="row">
-                <div class="col-xs-1"></div>
-                <div class="col-xs-11 faded">
-                    <div class="action-buttons">
+                <div class="col-xs-12 faded">
+                    <div class="action-buttons text-left">
+                    <a data-action="expand-thumbnail" class="text-primary text-button"><i class="zmdi zmdi-wrap-text"></i>{{ trans('common.toggle_thumbnails') }}</a>
                         @if($currentUser->can('book-create-all'))
                             <a href="{{ baseUrl("/books/create") }}" class="text-pos text-button"><i class="zmdi zmdi-plus"></i>{{ trans('entities.books_create') }}</a>
                         @endif
-                    </div>
+                        </div>
                 </div>
             </div>
         </div>
@@ -20,14 +20,22 @@
 
     <div class="container" ng-non-bindable>
         <div class="row">
-            <div class="col-sm-7">
+            <div class="col-xs-12 col-sm-12 col-md-9">
                 <h1>{{ trans('entities.books') }}</h1>
                 @if(count($books) > 0)
-                    @foreach($books as $book)
-                        @include('books/list-item', ['book' => $book])
-                        <hr>
-                    @endforeach
-                    {!! $books->render() !!}
+                    @if($books_display=='grid')
+                        @foreach($books as $book)
+                            @include('books/grid-item', ['book' => $book])
+                        @endforeach
+                        <div class="col-xs-12">
+                            {!! $books->render() !!}
+                        </div>
+                    @else
+                        @foreach($books as $book)
+                            @include('books/list-item', ['book' => $book])
+                        @endforeach
+                        {!! $books->render() !!}
+                    @endif
                 @else
                     <p class="text-muted">{{ trans('entities.books_empty') }}</p>
                     @if(userCan('books-create-all'))
@@ -35,7 +43,7 @@
                     @endif
                 @endif
             </div>
-            <div class="col-sm-4 col-sm-offset-1">
+            <div class="col-xs-12 col-sm-12 col-md-3">
                 <div id="recents">
                     @if($recents)
                         <div class="margin-top">&nbsp;</div>
diff --git a/resources/views/users/edit.blade.php b/resources/views/users/edit.blade.php
index ff3475194..c15e34974 100644
--- a/resources/views/users/edit.blade.php
+++ b/resources/views/users/edit.blade.php
@@ -49,6 +49,13 @@
                             @endforeach
                         </select>
                     </div>
+                    <div class="form-group">
+                        <label for="books_display">{{ trans('settings.users_books_display_type') }}</label>
+                        <select name="books_display" id="books_display">
+                            <option @if($user->books_display === 'grid') selected @endif value="grid">Grid</option>
+                            <option @if($user->books_display === 'list') selected @endif value="list">List</option>
+                        </select>
+                    </div>
                 </div>
             </div>
             <div class="form-group">