]> BookStack Code Mirror - bookstack/commitdiff
Resolved conflicts
authorBharadwaja G <redacted>
Thu, 24 Aug 2017 06:51:43 +0000 (12:21 +0530)
committerBharadwaja G <redacted>
Thu, 24 Aug 2017 06:51:43 +0000 (12:21 +0530)
30 files changed:
app/Book.php
app/Http/Controllers/BookController.php
app/User.php
database/migrations/2017_07_05_102650_add_cover_image_display.php [new file with mode: 0644]
public/default.png [new file with mode: 0644]
resources/assets/js/global.js
resources/assets/sass/styles.scss
resources/lang/de/common.php
resources/lang/de/settings.php
resources/lang/en/common.php
resources/lang/en/settings.php
resources/lang/es/common.php
resources/lang/es/settings.php
resources/lang/fr/common.php
resources/lang/fr/settings.php
resources/lang/nl/common.php
resources/lang/nl/settings.php
resources/lang/pt_BR/common.php
resources/lang/pt_BR/settings.php
resources/lang/sk/common.php
resources/lang/sk/settings.php
resources/views/books/create.blade.php
resources/views/books/edit.blade.php
resources/views/books/form.blade.php
resources/views/books/grid-item.blade.php [new file with mode: 0644]
resources/views/books/index.blade.php
resources/views/components/image-picker.blade.php
resources/views/users/edit.blade.php
tests/Entity/EntityTest.php
tests/UserProfileTest.php

index 06c00945d43c4dbdea946c21769ffef7a626888f..538505266530272fd08a4f4d33fa2e8adc59be62 100644 (file)
@@ -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,30 @@ class Book extends Entity
         return baseUrl('/books/' . urlencode($this->slug));
     }
 
+    public function getBookCover()
+    {
+        $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 getHeadingExcerpt($length = 35)
+    {
+        $bookHeading = $this->name;
+        return strlen($bookHeading) > $length ? substr($bookHeading, 0, $length-3) . '...' : $bookHeading;
+    }
+    
+    public function cover()
+    {
+        return $this->belongsTo(Image::class, 'image');
+    }
     /*
      * Get the edit url for this book.
      * @return string
index 8996ae64aec248d3dc61a2d0307a982d4b496e10..eecb7839f378439519a57a2c526f845fab22d958 100644 (file)
@@ -36,11 +36,12 @@ class BookController extends Controller
      */
     public function index()
     {
-        $books = $this->entityRepo->getAllPaginated('book', 10);
+        $books = $this->entityRepo->getAllPaginated('book', 16);
         $recents = $this->signedIn ? $this->entityRepo->getRecentlyViewed('book', 4, 0) : false;
-        $popular = $this->entityRepo->getPopular('book', 4, 0);
+        $popular = $this->entityRepo->getPopular('book', 3, 0);
+        $books_display = $this->currentUser->books_display;
         $this->setPageTitle('Books');
-        return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular]);
+        return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular, 'books_display' => $books_display] );
     }
 
     /**
@@ -114,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());
     }
 
     /**
index 8033557e4cb9a0a048c1d7112c90f84dc4e4bf70..703322cbd269c5dfb80fcf164e5900f10be60d6d 100644 (file)
@@ -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 (file)
index 0000000..3961127
--- /dev/null
@@ -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 (file)
index 0000000..1147e23
Binary files /dev/null and b/public/default.png differ
index ee7cf3cc12913926a7dee6557ba33d18cf4ff959..966adb75d9f6b37b66e6df2bdc8315c3df33becd 100644 (file)
@@ -99,6 +99,85 @@ jQuery.expr[":"].contains = $.expr.createPseudo(function (arg) {
     };
 });
 
+// Global jQuery Elements
+let notifications = $('.notification');
+let successNotification = notifications.filter('.pos');
+let errorNotification = notifications.filter('.neg');
+let warningNotification = notifications.filter('.warning');
+// Notification Events
+window.Events.listen('success', function (text) {
+    successNotification.hide();
+    successNotification.find('span').text(text);
+    setTimeout(() => {
+        successNotification.show();
+    }, 1);
+});
+window.Events.listen('warning', function (text) {
+    warningNotification.find('span').text(text);
+    warningNotification.show();
+});
+window.Events.listen('error', function (text) {
+    errorNotification.find('span').text(text);
+    errorNotification.show();
+});
+
+// Notification hiding
+notifications.click(function () {
+    $(this).fadeOut(100);
+});
+
+// Chapter page list toggles
+$('.chapter-toggle').click(function (e) {
+    e.preventDefault();
+    $(this).toggleClass('open');
+    $(this).closest('.chapter').find('.inset-list').slideToggle(180);
+});
+
+// Back to top button
+$('#back-to-top').click(function() {
+     $('#header').smoothScrollTo();
+});
+let scrollTopShowing = false;
+let scrollTop = document.getElementById('back-to-top');
+let scrollTopBreakpoint = 1200;
+window.addEventListener('scroll', function() {
+    let scrollTopPos = document.documentElement.scrollTop || document.body.scrollTop || 0;
+    if (!scrollTopShowing && scrollTopPos > scrollTopBreakpoint) {
+        scrollTop.style.display = 'block';
+        scrollTopShowing = true;
+        setTimeout(() => {
+            scrollTop.style.opacity = 0.4;
+        }, 1);
+    } else if (scrollTopShowing && scrollTopPos < scrollTopBreakpoint) {
+        scrollTop.style.opacity = 0;
+        scrollTopShowing = false;
+        setTimeout(() => {
+            scrollTop.style.display = 'none';
+        }, 500);
+    }
+});
+
+// Common jQuery actions
+$('[data-action="expand-entity-list-details"]').click(function() {
+    $('.entity-list.compact').find('p').not('.empty-text').slideToggle(240);
+});
+
+// Toggle thumbnail::hide image and reduce grid size
+$(document).ready(function(){
+   $('[data-action="expand-thumbnail"]').click(function(){
+     $('.gallery-item').toggleClass("collapse").find('img').slideToggle(50);
+   });
+});
+
+// Popup close
+$('.popup-close').click(function() {
+    $(this).closest('.overlay').fadeOut(240);
+});
+$('.overlay').click(function(event) {
+    if (!$(event.target).hasClass('overlay')) return;
+    $(this).fadeOut(240);
+});
+
 // Detect IE for css
 if(navigator.userAgent.indexOf('MSIE')!==-1
     || navigator.appVersion.indexOf('Trident/') > 0
index b912bf7ee3fcc7f1ea4e7f2c07c616af584907f0..51e47ea7487f8fdc776b02abd5277cba230f5955 100644 (file)
@@ -237,3 +237,37 @@ $btt-size: 40px;
 
 
 
+.gallery-item {
+  margin-bottom: 32px;
+  height: 350px;
+  overflow: hidden;
+  border: 1px solid #ccc;
+  h4 {
+    font-size: 1.2em;
+    text-align: center;
+    height: 55px;
+    padding: 0px 12px;
+  }
+  p {
+    font-size: 0.8em;
+    text-align: center;
+    padding: 0px 12px;
+  }
+  &.collapse {
+    height: 150px;
+  }
+}
+
+.gallery-image {
+  margin-top: 5%;
+  text-align: center;
+  img {
+    border-radius: 3px;
+  }
+}
+
+.cover {
+    height: 192px;
+    width: 120px;
+    border-radius: 3px;
+  }
\ No newline at end of file
index 3c21a9d0802bab681efb927e572df83f6f9ae77c..af2793dfca52ec45ff05ae89696684e025b27f7e 100644 (file)
@@ -17,6 +17,8 @@ return [
     'name' => 'Name',
     'description' => 'Beschreibung',
     'role' => 'Rolle',
+    'cover_image' => 'Titelbild',
+    'cover_image_description' => 'Das Bild sollte in einem Verhältnis von Höhe zu Breite von 1.6: 1 sein.',
 
     /**
      * Actions
@@ -43,7 +45,7 @@ return [
     'no_items' => 'Keine Einträge gefunden.',
     'back_to_top' => 'nach oben',
     'toggle_details' => 'Details zeigen/verstecken',
-
+    'toggle_thumbnails' => 'Thumbnails zeigen/verstecken',
     /**
      * Header
      */
index 9435ec80853ecea267fdc04126acbe268f50181f..598f9f6631f08f406eadbfdfc9078dafe5cc1811 100644 (file)
@@ -96,6 +96,7 @@ return [
     'users_delete_warning' => 'Der Benutzer ":userName" wird aus dem System gelöscht.',
     'users_delete_confirm' => 'Sind Sie sicher, dass Sie diesen Benutzer löschen möchten?',
     'users_delete_success' => 'Benutzer erfolgreich gelöscht.',
+    'users_books_display_type' => 'Bevorzugtes Display-Layout für Bücher',
     'users_edit' => 'Benutzer bearbeiten',
     'users_edit_profile' => 'Profil bearbeiten',
     'users_edit_success' => 'Benutzer erfolgreich aktualisisert',
index e1d74c95e0e0718f0be435c5f40fdbb3da9f8e40..9f35ddac7ed50f9f1704b2230121bcda7882e17c 100644 (file)
@@ -17,7 +17,8 @@ return [
     'name' => 'Name',
     'description' => 'Description',
     'role' => 'Role',
-
+    'cover_image' => 'Cover image',
+    'cover_image_description' => 'The image should be in a height/width ratio of 1.6:1.',
     /**
      * 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
index 3eec7737f913c493b8cf60b45e08b4a4cb64fd8c..0a7547a584aa7002a1f936122a3ee44b78aaa0de 100644 (file)
@@ -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' => 'Preferred layout for books viewing',
     '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.',
index 3a62a21776fcc09817ad3d3990c7c68951bdc720..9514918ed6bb755ef4c13009130b24902deecd7c 100644 (file)
@@ -17,7 +17,8 @@ return [
     'name' => 'Nombre',
     'description' => 'Descripción',
     'role' => 'Rol',
-
+    'cover_image' => 'Imagen de portada',
+    'cover_image_description' => 'La imagen debe estar en una relación altura / anchura de 1.6: 1.',
     /**
      * Actions
      */
@@ -43,6 +44,7 @@ return [
     'no_items' => 'No hay items disponibles',
     'back_to_top' => 'Volver arriba',
     'toggle_details' => 'Alternar detalles',
+    'toggle_thumbnails' => 'Alternar miniaturas',
 
     /**
      * Header
index cd6a8b8d9b56eac1852dafbf88dcf620f4291445..4651247b9df46c3f188bb0112944e584d3b51e2e 100644 (file)
@@ -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' => 'Diseño de pantalla preferido para libros',
     'users_delete' => 'Borrar usuario',
     'users_delete_named' => 'Borrar usuario :userName',
     'users_delete_warning' => 'Se borrará completamente el usuario con el nombre \':userName\' del sistema.',
index 7a8ec55b605d90f53bc27559b6988b535b6231dd..74f174dca11f7c243e7cd7793ad1d284795b3fe3 100644 (file)
@@ -17,7 +17,8 @@ return [
     'name' => 'Nom',
     'description' => 'Description',
     'role' => 'Rôle',
-
+    'cover_image' => 'Image de couverture',
+    'cover_image_description' => 'L\'image devrait avoir un rapport d\'aspect 1.6: 1',
     /**
      * Actions
      */
@@ -43,6 +44,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
index 92e623795dcbc851cbf006e993859d135b2b624f..5516e66a4609942afd5c82564f85d898b3b4eb94 100644 (file)
@@ -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' => 'Disposition d\'affichage préférée pour les livres',
     'users_delete' => 'Supprimer un utilisateur',
     'users_delete_named' => 'Supprimer l\'utilisateur :userName',
     'users_delete_warning' => 'Ceci va supprimer \':userName\' du système.',
index bdde9eb957705753979e9b250d82f0662b99b55c..e26a4651a22d144ac3d94462c6a020bdbbc71aad 100644 (file)
@@ -17,7 +17,8 @@ return [
     'name' => 'Naam',
     'description' => 'Beschrijving',
     'role' => 'Rol',
-
+    'cover_image' => 'Omslagfoto',
+    'cover_image_description' => 'De afbeelding moet in een hoogte / breedte verhouding van 1.6: 1 zijn.',
     /**
      * Actions
      */
@@ -43,6 +44,7 @@ return [
     'no_items' => 'Geen items beschikbaar',
     'back_to_top' => 'Terug naar boven',
     'toggle_details' => 'Details Weergeven',
+    'toggle_thumbnails' => 'Thumbnails Weergeven',
 
     /**
      * Header
index 7408a2dc32c53ca5a6f62018bf1acf49d2576dd9..0323d87d4c6f82fc3306007ff23d8d37dd17ed04 100644 (file)
@@ -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' => 'Voorkeursuitleg voor het weergeven van boeken',
     'users_delete' => 'Verwijder gebruiker',
     'users_delete_named' => 'Verwijder gebruiker :userName',
     'users_delete_warning' => 'Dit zal de gebruiker \':userName\' volledig uit het systeem verwijderen.',
index 820ba219c4be6d3678005a5c9552a1e7805851b9..510271166b5fdd1be58de914e1cadecfb9ec77fa 100644 (file)
@@ -17,7 +17,8 @@ return [
     'name' => 'Nome',
     'description' => 'Descrição',
     'role' => 'Regra',
-
+    'cover_image' => 'Imagem de capa',
+    'cover_image_description' => 'A imagem deve estar em uma relação de aspecto 1.6: 1.',
     /**
      * Actions
      */
@@ -43,6 +44,7 @@ return [
     'no_items' => 'Nenhum item disponível',
     'back_to_top' => 'Voltar ao topo',
     'toggle_details' => 'Alternar Detalhes',
+    'toggle_thumbnails' => 'Alternar Miniaturas',
 
     /**
      * Header
index b8d062b5fdaa49b3223749c715de402a7d42e6b5..6c8ff3039ec9fc5aba8e9f714cdc4be35ac27977 100644 (file)
@@ -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' => 'Layout preferido para mostrar livros',
     '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.',
index 100981597374d714f49c4b284677772e7f16a7f1..28fdad0f185969387a410665b155884cf4974c05 100644 (file)
@@ -17,7 +17,8 @@ return [
     'name' => 'Meno',
     'description' => 'Popis',
     'role' => 'Rola',
-
+    'cover_image' => 'Obal knihy',
+    'cover_image_description' => 'Obraz by mal mať pomer strán 1.6: 1.',
     /**
      * Actions
      */
@@ -43,6 +44,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
index 643b4b8ffbde1d2d9e122080544a0711dcb7a6ee..8a8d93e59883af71b8f782e5b8e73d995afd6c69 100644 (file)
@@ -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' => 'Preferované rozloženie pre prezeranie kníh',
     '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.',
index 2c629e699622053940849dc207121cb4a201b21d..4d1edf78bf4cfa204bc19d73e92b2fa55011fbb5 100644 (file)
@@ -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
index 2419b68da807ab1a346293ee38ec694e67c1c25a..322f3d7001d54bf55e83ed1cf37ad9d817802f3a 100644 (file)
@@ -19,5 +19,5 @@
             @include('books/form', ['model' => $book])
         </form>
     </div>
-
+@include('components.image-manager', ['imageType' => 'cover'])
 @stop
\ No newline at end of file
index b1484d1296f3cf84ef6f2e59bf11d6af8a5c3c2d..e26edac4b8881da26ff2874e03dcbfb102101272 100644 (file)
@@ -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' => '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 (file)
index 0000000..3c0ec1e
--- /dev/null
@@ -0,0 +1,19 @@
+<div class="col-xs-6 col-sm-4 col-md-4 col-lg-3"  data-entity-type="book" data-entity-id="{{$book->id}}">
+    <div class="gallery-item">
+    <h4>
+        <a class="text-book entity-list-item-link" href="{{$book->getUrl()}}" title="{{$book->name}}"><i class="zmdi zmdi-book"></i><span class="entity-list-item-name">{{$book->getHeadingExcerpt()}}</span>
+        <br>
+        </a>
+    </h4>
+    <div class="gallery-image">
+        <a class="text-book entity-list-item-link" href="{{$book->getUrl()}}">
+        <img src="{{$book->getBookCover()}}" alt="{{$book->name}}">
+        </a>
+    </div>
+    @if(isset($book->searchSnippet))
+        <p class="text-muted">{!! $book->searchSnippet !!}</p>
+    @else
+        <p class="text-muted">{{ $book->getExcerpt(80) }}</p>
+    @endif
+</div>
+</div>
\ No newline at end of file
index c090a127e1dee9076020d9397ce46f7eaaf39804..be17457d1ca794fc6a864988df833fa8f24d8054 100644 (file)
@@ -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>
 
     <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')
+                      <div class="row">
+                        @foreach($books as $book)
+                            @include('books/grid-item', ['book' => $book])
+                        @endforeach
+                        <div class="col-xs-12">
+                            {!! $books->render() !!}
+                        </div>
+                      </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 +45,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>
index 228e8d230c6663009ed3431758d1007ab4a4ec38..2aa39d3d2639e18ed9150f5f811e12fbc235855c 100644 (file)
@@ -13,7 +13,7 @@
         <button class="text-button neg" data-action="remove-image" type="button">{{ trans('common.remove') }}</button>
     @endif
 
-    <input type="hidden" name="{{$name}}" id="{{$name}}" value="{{ isset($currentId) && ($currentId !== '' && $currentId !== false) ? $currentId : $currentImage}}">
+    <input type="hidden" name="{{$name}}" id="{{$name}}" value="{{ isset($currentId) && ($currentId !== 0 && $currentId !== false) ? $currentId : $currentImage}}">
 </div>
 
 <script>
index ff3475194bdfacd7705d74cf17e8d81061a8048b..c15e34974666346447ee533e5bfa60dc349ddffc 100644 (file)
                             @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">
index ef5ea3aee1dbea99f9421b7fbb677688112556b4..ccc02c4f06c85eb6875226e9d146f5374e12a6d7 100644 (file)
@@ -256,12 +256,4 @@ class EntityTest extends BrowserKitTest
             ->visit('/')
             ->seeInElement('#recently-updated-pages', $page->name);
     }
-
-    public function test_recently_created_pages_on_home()
-    {
-        $entityChain = $this->createEntityChainBelongingToUser($this->getEditor());
-        $this->asAdmin()->visit('/')
-            ->seeInElement('#recently-created-pages', $entityChain['page']->name);
-    }
-
 }
index 12f88483f6a6e6e2171fec1034c514ecfb8eda60..e0c87d992abdb6f6a301d55dabd69f55ab0226cb 100644 (file)
@@ -94,5 +94,27 @@ class UserProfileTest extends BrowserKitTest
             ->seePageIs('/settings/users/' . $guestUser->id)
             ->see('cannot delete the guest user');
     }
-    
+
+    public function test_books_display_is_list()
+    {
+        $editor = $this->getEditor([
+          'books_display' => 'list'
+        ]);
+
+        $this->actingAs($editor)
+            ->visit('/books')
+            ->pageNotHasElement('.gallery-item')
+            ->pageHasElement('.entity-list-item');
+    }
+
+    public function test_books_display_is_grid()
+    {
+        $editor = $this->getEditor([
+          'books_display' => 'grid'
+        ]);
+
+        $this->actingAs($editor)
+            ->visit('/books')
+            ->pageHasElement('.gallery-item');
+    }
 }