use Illuminate\Support\Facades\Auth;
use Oxbow\Activity;
use Oxbow\Entity;
+use Session;
class ActivityService
{
$this->activity->extra = $extra;
}
$entity->activity()->save($this->activity);
+ $this->setNotification($activityKey);
}
/**
$this->activity->extra = $extra;
}
$this->activity->save();
+ $this->setNotification($activityKey);
}
+
/**
* Removes the entity attachment from each of its activities
* and instead uses the 'extra' field with the entities name.
->skip($count*$page)->take($count)->get();
}
+ /**
+ * Flashes a notification message to the session if an appropriate message is available.
+ * @param $activityKey
+ */
+ protected function setNotification($activityKey)
+ {
+ $notificationTextKey = 'activities.' . $activityKey . '_notification';
+ if (trans()->has($notificationTextKey)) {
+ $message = trans($notificationTextKey);
+ Session::flash('success', $message);
+ }
+ }
+
}
\ No newline at end of file
100% {
opacity: 1;
}
+}
+
+.anim.notification {
+ transform: translate3d(580px, 0, 0);
+ animation-name: notification;
+ animation-duration: 3s;
+ animation-timing-function: ease-in-out;
+ animation-fill-mode: forwards;
+}
+
+@keyframes notification {
+ 0% {
+ transform: translate3d(580px, 0, 0);
+ }
+ 10% {
+ transform: translate3d(0, 0, 0);
+ }
+ 90% {
+ transform: translate3d(0, 0, 0);
+ }
+ 100% {
+ transform: translate3d(580px, 0, 0);
+ }
}
\ No newline at end of file
.avatar {
border-radius: 100%;
+}
+
+.notification {
+ position: fixed;
+ top: 0;
+ right: 0;
+ margin: $-xl*2 $-xl;
+ padding: $-l $-xl;
+ background-color: #EEE;
+ border-radius: 3px;
+ box-shadow: $bs-med;
+ z-index: 99999999;
+ display: table;
+ cursor: pointer;
+ max-width: 480px;
+ i, span {
+ display: table-cell;
+ }
+ i {
+ font-size: 2em;
+ padding-right: $-l;
+ }
+ span {
+ vertical-align: middle;
+ }
+ &.pos {
+ background-color: $positive;
+ color: #EEE;
+ }
+ &.neg {
+ background-color: $negative;
+ color: #EEE;
+ }
}
\ No newline at end of file
// Pages
'page_create' => 'created page',
+ 'page_create_notification' => 'Page Successfully Created',
'page_update' => 'updated page',
+ 'page_update_notification' => 'Page Successfully Updated',
'page_delete' => 'deleted page',
+ 'page_delete_notification' => 'Page Successfully Created',
'page_restore' => 'restored page',
+ 'page_restore_notification' => 'Page Successfully Restored',
// Chapters
'chapter_create' => 'created chapter',
+ 'chapter_create_notification' => 'Chapter Successfully Created',
'chapter_update' => 'updated chapter',
+ 'chapter_update_notification' => 'Chapter Successfully Updated',
'chapter_delete' => 'deleted chapter',
+ 'chapter_delete_notification' => 'Chapter Successfully Deleted',
// Books
'book_create' => 'created book',
+ 'book_create_notification' => 'Book Successfully Created',
'book_update' => 'updated book',
+ 'book_update_notification' => 'Book Successfully Updated',
'book_delete' => 'deleted book',
+ 'book_delete_notification' => 'Book Successfully Deleted',
'book_sort' => 'sorted book',
+ 'book_sort_notification' => 'Book Successfully Re-sorted',
];
\ No newline at end of file
<html>
<head>
<title>BookStack</title>
+
+ <!-- Meta-->
<meta name="viewport" content="width=device-width">
<meta name="token" content="{{ csrf_token() }}">
+
+ <!-- Styles and Fonts -->
<link rel="stylesheet" href="/css/app.css">
<link href='//fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,300italic,100,300' rel='stylesheet' type='text/css'>
- {{--<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">--}}
<link rel="stylesheet" href="/bower/material-design-iconic-font/dist/css/material-design-iconic-font.min.css">
+
+ <!-- Scripts -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="/bower/bootstrap/dist/js/bootstrap.js"></script>
<script src="/bower/jquery-sortable/source/js/jquery-sortable.js"></script>
};
});
</script>
+
@yield('head')
</head>
<body>
+ @if(Session::has('success'))
+ <div class="notification anim pos">
+ <i class="zmdi zmdi-mood"></i> <span>{{ Session::get('success') }}</span>
+ </div>
+ @endif
+
+ @if(Session::has('error'))
+ <div class="notification anim neg">
+ <i class="zmdi zmdi-alert-circle"></i> <span>{{ Session::get('error') }}</span>
+ </div>
+ @endif
+
<section id="sidebar">
<div class="sidebar-bg"><div class="overlay"></div></div>
<header>
</section>
@yield('bottom')
+ <script>
+ $('.notification').click(function() {
+ $(this).fadeOut(100);
+ });
+ </script>
</body>
</html>
<div class="col-md-6"></div>
<div class="col-md-6 faded">
<div class="action-buttons">
- <a href="/books/create" class="text-pos"><i class="zmdi zmdi-plus"></i>Add new book</a>
+ @if($currentUser->can('book-create'))
+ <a href="/books/create" class="text-pos"><i class="zmdi zmdi-plus"></i>Add new book</a>
+ @endif
</div>
</div>
</div>
<div class="col-md-6"></div>
<div class="col-md-6">
<div class="action-buttons faded">
- <a href="{{$book->getUrl() . '/page/create'}}" class="text-pos"><i class="zmdi zmdi-plus"></i> New Page</a>
- <a href="{{$book->getUrl() . '/chapter/create'}}" class="text-pos"><i class="zmdi zmdi-plus"></i> New Chapter</a>
- <a href="{{$book->getEditUrl()}}" class="text-primary"><i class="zmdi zmdi-edit"></i>Edit</a>
- <a href="{{ $book->getUrl() }}/sort" class="text-primary"><i class="zmdi zmdi-sort"></i>Sort</a>
- <a href="{{ $book->getUrl() }}/delete" class="text-neg"><i class="zmdi zmdi-delete"></i>Delete</a>
+ @if($currentUser->can('page-create'))
+ <a href="{{$book->getUrl() . '/page/create'}}" class="text-pos"><i class="zmdi zmdi-plus"></i> New Page</a>
+ @endif
+ @if($currentUser->can('chapter-create'))
+ <a href="{{$book->getUrl() . '/chapter/create'}}" class="text-pos"><i class="zmdi zmdi-plus"></i> New Chapter</a>
+ @endif
+ @if($currentUser->can('book-update'))
+ <a href="{{$book->getEditUrl()}}" class="text-primary"><i class="zmdi zmdi-edit"></i>Edit</a>
+ <a href="{{ $book->getUrl() }}/sort" class="text-primary"><i class="zmdi zmdi-sort"></i>Sort</a>
+ @endif
+ @if($currentUser->can('book-delete'))
+ <a href="{{ $book->getUrl() }}/delete" class="text-neg"><i class="zmdi zmdi-delete"></i>Delete</a>
+ @endif
</div>
</div>
</div>
</div>
<div class="col-md-6 faded">
<div class="action-buttons">
- <a href="{{$chapter->getUrl() . '/create-page'}}" class="text-pos"><i class="zmdi zmdi-plus"></i>New Page</a>
- <a href="{{$chapter->getUrl() . '/edit'}}" class="text-primary"><i class="zmdi zmdi-edit"></i>Edit</a>
- <a href="{{$chapter->getUrl() . '/delete'}}" class="text-neg"><i class="zmdi zmdi-delete"></i>Delete</a>
+ @if($currentUser->can('chapter-create'))
+ <a href="{{$chapter->getUrl() . '/create-page'}}" class="text-pos"><i class="zmdi zmdi-plus"></i>New Page</a>
+ @endif
+ @if($currentUser->can('chapter-update'))
+ <a href="{{$chapter->getUrl() . '/edit'}}" class="text-primary"><i class="zmdi zmdi-edit"></i>Edit</a>
+ @endif
+ @if($currentUser->can('chapter-delete'))
+ <a href="{{$chapter->getUrl() . '/delete'}}" class="text-neg"><i class="zmdi zmdi-delete"></i>Delete</a>
+ @endif
</div>
</div>
</div>
</a>
</h3>
<p class="text-muted">
- {{$page->getExcerpt()}}
+ {{$page->getExcerpt(180)}}
</p>
</div>
<hr>
</div>
<div class="col-md-6 faded">
<div class="action-buttons">
- <a href="{{$page->getUrl() . '/revisions'}}" class="text-primary"><i class="zmdi zmdi-replay"></i>Revisions</a>
- <a href="{{$page->getUrl() . '/edit'}}" class="text-primary" ><i class="zmdi zmdi-edit"></i>Edit</a>
- <a href="{{$page->getUrl() . '/delete'}}" class="text-neg"><i class="zmdi zmdi-delete"></i>Delete</a>
+ @if($currentUser->can('page-update'))
+ <a href="{{$page->getUrl() . '/revisions'}}" class="text-primary"><i class="zmdi zmdi-replay"></i>Revisions</a>
+ <a href="{{$page->getUrl() . '/edit'}}" class="text-primary" ><i class="zmdi zmdi-edit"></i>Edit</a>
+ @endif
+ @if($currentUser->can('page-delete'))
+ <a href="{{$page->getUrl() . '/delete'}}" class="text-neg"><i class="zmdi zmdi-delete"></i>Delete</a>
+ @endif
</div>
</div>
</div>