Also cleaned up/moved new CSS and removed redundant new book methods.
/**
* Returns book cover image, if book cover not exists return default cover image.
* @param int $height - Height of the image
- * @param type $width - Width of the image
- * @return type string
+ * @param int $width - Width of the image
+ * @return string
*/
public function getBookCover($height = 170, $width = 300)
{
$default = baseUrl('/book_default_cover.png');
- $image = $this->image_id;
- if ($image === 0 || $image === '0' || $image === null)
- return $default;
+ if (!$this->image_id) return $default;
+
try {
$cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default;
} catch (\Exception $err) {
return $cover;
}
- /**
- * Get an excerpt of this book's name to the specified length or less.
- * @param int $length
- * @return string
- */
- public function getHeadingExcerpt($length = 35)
- {
- $bookHeading = $this->name;
- return strlen($bookHeading) > $length ? substr($bookHeading, 0, $length-3) . '...' : $bookHeading;
- }
-
/**
* Get the cover image of the book
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
{
return "'BookStack\\\\Book' as entity_type, id, id as entity_id, slug, name, {$this->textField} as text,'' as html, '0' as book_id, '0' as priority, '0' as chapter_id, '0' as draft, created_by, updated_by, updated_at, created_at";
}
-
- /**
- * Get the user that created the page revision
- * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
- */
- public function createdBy()
- {
- return $this->belongsTo(User::class, 'created_by');
- }
}
$recents = $this->signedIn ? $this->entityRepo->getRecentlyViewed('book', 4, 0) : false;
$popular = $this->entityRepo->getPopular('book', 4, 0);
$new = $this->entityRepo->getRecentlyCreated('book', 4, 0);
- $booksViewType = $this->currentUser->books_view_type;
- $this->setPageTitle('Books');
+ $booksViewType = setting()->getUser($this->currentUser, 'books_view_type', 'list');
+ $this->setPageTitle(trans('entities.books'));
return view('books/index', [
'books' => $books,
'recents' => $recents,
* The attributes that are mass assignable.
* @var array
*/
- protected $fillable = ['name', 'email', 'image_id', 'books_view_type' ];
+ protected $fillable = ['name', 'email', 'image_id'];
/**
* The attributes excluded from the model's JSON form.
*/
public function up()
{
- Schema::table('users', function (Blueprint $table) {
- $table->string('books_view_type',10)->default('grid');
- });
-
Schema::table('books', function (Blueprint $table) {
- $table->integer('image_id');
+ $table->integer('image_id')->nullable()->default(null);
});
}
*/
public function down()
{
- Schema::table('users', function (Blueprint $table) {
- $table->dropColumn('books_view_type');
- });
-
Schema::table('books', function (Blueprint $table) {
$table->dropColumn('image_id');
});
};
});
-// 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);
- });
-});
-
-
// Detect IE for css
if(navigator.userAgent.indexOf('MSIE')!==-1
|| navigator.appVersion.indexOf('Trident/') > 0
display: inline-block;
}
+@include larger-than(991px) {
+ .row.auto-clear .col-md-4:nth-child(3n+1){clear:left;}
+}
+
+@include smaller-than(992px) {
+ .row.auto-clear .col-xs-6:nth-child(2n+1){clear:left;}
+}
+
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
position: relative;
min-height: 1px;
border-bottom: 1px solid #DDD;
}
}
+
+// Books grid view
+.featured-image-container {
+ position: relative;
+ overflow: hidden;
+ background: #F2F2F2;
+ border: 1px solid #ddd;
+ border-bottom: 0;
+ img {
+ display: block;
+ max-width: 100%;
+ height: auto;
+ transition: all .5s ease;
+ }
+ img:hover {
+ transform: scale(1.15);
+ opacity: .5;
+ }
+}
+
+.book-grid-content {
+ padding: 30px;
+ border: 1px solid #ddd;
+ border-top: 0;
+ border-bottom-width: 2px;
+ h2 {
+ font-size: 1.5em;
+ margin: 0 0 10px;
+ }
+ h2 a {
+ display: block;
+ line-height: 1.2;
+ color: #009688;;
+ text-decoration: none;
+ }
+ p {
+ font-size: .85em;
+ margin: 0 0 10px;
+ line-height: 1.6em;
+ }
+ p.small {
+ font-size: .8em;
+ }
+}
+
+.book-grid-item {
+ margin-bottom : 20px;
+}
input {
width: 100%;
}
-}
-
-// styles for Books grid view
-.cover {
- width: 290px;
- border-radius: 3px;
- }
-
-.featured-image-container {
- position: relative;
- overflow: hidden;
- background: #F2F2F2;
- border: 1px solid #ddd;
- border-bottom: 0px;
-}
-
-.featured-image-container img {
- display: block;
- max-width: 100%;
- height: auto;
- -webkit-transition: all .5s ease;
- -moz-transition: all .5s ease;
- -ms-transition: all .5s ease;
- -o-transition: all .5s ease;
- transition: all .5s ease;
-}
-
-.book-content {
- padding: 30px;
- border: 1px solid #ddd;
- border-top: 0px;
- border-bottom-width: 2px;
-}
-.book-content h2 {
- font-size: 1.5em;
- line-height: 1.2;
- margin: 0 0 10px;
-}
-
-.book-content h2 a {
- display: block;
- color: #009688;;
- text-decoration: none;
-}
-
-.book-content p {
- font-size: .85em;
- margin: 0 0 10px;
- line-height: 1.6em;
-}
-
-.featured-image-container img:hover {
- -webkit-transform: scale(1.15);
- -moz-transform: scale(1.15);
- -ms-transform: scale(1.15);
- -o-transform: scale(1.15);
- transform: scale(1.15);
- opacity: .5;
-}
-.books-grid-div {
- margin-bottom : 20px;
-}
-
-@media (min-width:992px){
- .row.auto-clear .col-md-4:nth-child(3n+1){clear:left;}
-}
-@media (min-width:992px){
- .row.auto-clear .col-md-4:nth-child(3n+1){clear:left;}
-}
-@media (max-width:991px){
- .row.auto-clear .col-xs-6:nth-child(2n+1){clear:left;}
}
\ No newline at end of file
-<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 books-grid-div" data-entity-type="book" data-entity-id="{{$book->id}}">
+<div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 book-grid-item" data-entity-type="book" data-entity-id="{{$book->id}}">
<div class="featured-image-container">
<a href="{{$book->getUrl()}}" title="{{$book->name}}">
<img width="1600" height="900" src="{{$book->getBookCover()}}" alt="{{$book->name}}">
</a>
</div>
- <div class="book-content">
- <h2><a href="{{$book->getUrl()}}" title="{{$book->name}}" > {{$book->getHeadingExcerpt()}} </a></h2>
+ <div class="book-grid-content">
+ <h2><a href="{{$book->getUrl()}}" title="{{$book->name}}" > {{$book->getShortName(35)}} </a></h2>
@if(isset($book->searchSnippet))
- <p >{{!! $book->searchSnippet !!}}</p>
+ <p >{!! $book->searchSnippet !!}</p>
@else
<p >{{ $book->getExcerpt(130) }}</p>
@endif
</div>
<div class="form-group">
<label for="books-view-type">{{ trans('settings.users_books_view_type') }}</label>
- <select name="books_view_type" id="books-view-type">
- <option @if($user->books_view_type === 'grid') selected @endif value="grid">Grid</option>
- <option @if($user->books_view_type === 'list') selected @endif value="list">List</option>
+ <select name="setting[books_view_type]" id="books-view-type">
+ <option @if(setting()->getUser($user, 'books_view_type', 'list') === 'list') selected @endif value="list">List</option>
+ <option @if(setting()->getUser($user, 'books_view_type', 'list') === 'grid') selected @endif value="grid">Grid</option>
</select>
</div>
</div>
public function test_books_view_is_list()
{
- $editor = $this->getEditor([
- 'books_view_type' => 'list'
- ]);
+ $editor = $this->getEditor();
+ setting()->putUser($editor, 'books_view_type', 'list');
$this->actingAs($editor)
->visit('/books')
public function test_books_view_is_grid()
{
- $editor = $this->getEditor([
- 'books_view_type' => 'grid'
- ]);
+ $editor = $this->getEditor();
+ setting()->putUser($editor, 'books_view_type', 'grid');
$this->actingAs($editor)
->visit('/books')