From 5d9d09602842bf98f56d274b720d5090f2e8acf0 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 16 Aug 2015 18:59:23 +0100 Subject: [PATCH] Added activity history to to all entities. Fixes #12 --- .gitignore | 3 +- app/Activity.php | 38 ++ app/Book.php | 11 + app/Entity.php | 21 + app/Http/Controllers/BookController.php | 5 + app/Http/Controllers/ChapterController.php | 5 + app/Http/Controllers/PageController.php | 7 +- app/Providers/CustomFacadeProvider.php | 31 + app/Services/ActivityService.php | 57 ++ app/Services/Facades/Activity.php | 14 + composer.json | 3 +- composer.lock | 542 +++++++++++------- config/app.php | 9 + ...5_08_16_142133_create_activities_table.php | 36 ++ resources/assets/sass/styles.scss | 6 + resources/lang/en/activities.php | 26 + resources/views/books/show.blade.php | 82 +-- .../views/partials/activity-item.blade.php | 16 + .../views/partials/activity-list.blade.php | 12 + 19 files changed, 673 insertions(+), 251 deletions(-) create mode 100644 app/Activity.php create mode 100644 app/Providers/CustomFacadeProvider.php create mode 100644 app/Services/ActivityService.php create mode 100644 app/Services/Facades/Activity.php create mode 100644 database/migrations/2015_08_16_142133_create_activities_table.php create mode 100644 resources/lang/en/activities.php create mode 100644 resources/views/partials/activity-item.blade.php create mode 100644 resources/views/partials/activity-list.blade.php diff --git a/.gitignore b/.gitignore index 26d89655c..694193b4d 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ Homestead.yaml /public/js /public/uploads /public/bower -/storage/images \ No newline at end of file +/storage/images +_ide_helper.php \ No newline at end of file diff --git a/app/Activity.php b/app/Activity.php new file mode 100644 index 000000000..64dd23518 --- /dev/null +++ b/app/Activity.php @@ -0,0 +1,38 @@ +entity_id) { + return $this->morphTo('entity')->first(); + } else { + return false; + } + } + + public function user() + { + return $this->belongsTo('Oxbow\User'); + } + + /** + * Returns text from the language files, Looks up by using the + * activity key. + */ + public function getText() + { + return trans('activities.' . $this->key); + } + +} diff --git a/app/Book.php b/app/Book.php index 8a4be213f..c4e691431 100644 --- a/app/Book.php +++ b/app/Book.php @@ -37,4 +37,15 @@ class Book extends Entity return $pages->sortBy('priority'); } + /** + * Gets only the most recent activity for this book + * @param int $limit + * @param int $page + * @return mixed + */ + public function recentActivity($limit = 20, $page=0) + { + return $this->hasMany('Oxbow\Activity')->orderBy('created_at', 'desc')->skip($limit*$page)->take($limit)->get(); + } + } diff --git a/app/Entity.php b/app/Entity.php index 2d81ccd48..a09ba2e45 100644 --- a/app/Entity.php +++ b/app/Entity.php @@ -34,4 +34,25 @@ class Entity extends Model { return [get_class($this), $this->id] === [get_class($entity), $entity->id]; } + + /** + * Gets the activity for this entity. + * @return \Illuminate\Database\Eloquent\Relations\MorphMany + */ + public function activity() + { + return $this->morphMany('Oxbow\Activity', 'entity')->orderBy('created_at', 'desc'); + } + + /** + * Gets only the most recent activity + * @param int $limit + * @param int $page + * @return mixed + */ + public function recentActivity($limit = 20, $page=0) + { + return $this->activity()->skip($limit*$page)->take($limit)->get(); + } + } diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php index 97c401028..69052b748 100644 --- a/app/Http/Controllers/BookController.php +++ b/app/Http/Controllers/BookController.php @@ -2,6 +2,7 @@ namespace Oxbow\Http\Controllers; +use Activity; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -65,6 +66,7 @@ class BookController extends Controller $book->created_by = Auth::user()->id; $book->updated_by = Auth::user()->id; $book->save(); + Activity::add($book, 'book_create', $book->id); return redirect('/books'); } @@ -110,6 +112,7 @@ class BookController extends Controller $book->slug = $this->bookRepo->findSuitableSlug($book->name, $book->id); $book->updated_by = Auth::user()->id; $book->save(); + Activity::add($book, 'book_update', $book->id); return redirect($book->getUrl()); } @@ -132,7 +135,9 @@ class BookController extends Controller */ public function destroy($bookSlug) { + $bookName = $this->bookRepo->getBySlug($bookSlug)->name; $this->bookRepo->destroyBySlug($bookSlug); + Activity::addMessage('book_delete', 0, $bookName); return redirect('/books'); } } diff --git a/app/Http/Controllers/ChapterController.php b/app/Http/Controllers/ChapterController.php index eec5971a9..0d7d09c64 100644 --- a/app/Http/Controllers/ChapterController.php +++ b/app/Http/Controllers/ChapterController.php @@ -2,6 +2,7 @@ namespace Oxbow\Http\Controllers; +use Activity; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -60,6 +61,7 @@ class ChapterController extends Controller $chapter->created_by = Auth::user()->id; $chapter->updated_by = Auth::user()->id; $book->chapters()->save($chapter); + Activity::add($chapter, 'chapter_create', $book->id); return redirect($book->getUrl()); } @@ -107,6 +109,7 @@ class ChapterController extends Controller $chapter->slug = $this->chapterRepo->findSuitableSlug($chapter->name, $book->id, $chapter->id); $chapter->updated_by = Auth::user()->id; $chapter->save(); + Activity::add($chapter, 'chapter_update', $book->id); return redirect($chapter->getUrl()); } @@ -134,6 +137,7 @@ class ChapterController extends Controller { $book = $this->bookRepo->getBySlug($bookSlug); $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id); + $chapterName = $chapter->name; if(count($chapter->pages) > 0) { foreach($chapter->pages as $page) { $page->chapter_id = 0; @@ -141,6 +145,7 @@ class ChapterController extends Controller } } $chapter->delete(); + Activity::addMessage('chapter_delete', $book->id, $chapterName); return redirect($book->getUrl()); } } diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index a41db39ef..e26af8d4a 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -2,10 +2,10 @@ namespace Oxbow\Http\Controllers; +use Activity; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Str; use Oxbow\Http\Requests; use Oxbow\Repos\BookRepo; use Oxbow\Repos\ChapterRepo; @@ -76,6 +76,7 @@ class PageController extends Controller $page->updated_by = Auth::user()->id; $page->save(); $this->pageRepo->saveRevision($page); + Activity::add($page, 'page_create', $book->id); return redirect($page->getUrl()); } @@ -120,6 +121,7 @@ class PageController extends Controller $book = $this->bookRepo->getBySlug($bookSlug); $page = $this->pageRepo->getBySlug($pageSlug, $book->id); $this->pageRepo->updatePage($page, $book->id, $request->all()); + Activity::add($page, 'page_update', $book->id); return redirect($page->getUrl()); } @@ -187,6 +189,7 @@ class PageController extends Controller } $model->save(); } + Activity::add($book, 'book_sort', $book->id); return redirect($book->getUrl()); } @@ -215,6 +218,7 @@ class PageController extends Controller { $book = $this->bookRepo->getBySlug($bookSlug); $page = $this->pageRepo->getBySlug($pageSlug, $book->id); + Activity::addMessage('page_delete', $book->id, $page->name); $page->delete(); return redirect($book->getUrl()); } @@ -254,6 +258,7 @@ class PageController extends Controller $page = $this->pageRepo->getBySlug($pageSlug, $book->id); $revision = $this->pageRepo->getRevisionById($revisionId); $page = $this->pageRepo->updatePage($page, $book->id, $revision->toArray()); + Activity::add($page, 'page_restore', $book->id); return redirect($page->getUrl()); } } diff --git a/app/Providers/CustomFacadeProvider.php b/app/Providers/CustomFacadeProvider.php new file mode 100644 index 000000000..bb4520c18 --- /dev/null +++ b/app/Providers/CustomFacadeProvider.php @@ -0,0 +1,31 @@ +app->bind('activity', function() { + return new ActivityService($this->app->make('Oxbow\Activity')); + }); + } +} diff --git a/app/Services/ActivityService.php b/app/Services/ActivityService.php new file mode 100644 index 000000000..651723018 --- /dev/null +++ b/app/Services/ActivityService.php @@ -0,0 +1,57 @@ +activity = $activity; + $this->user = Auth::user(); + } + + + /** + * Add activity data to database. + * @para Entity $entity + * @param $activityKey + * @param int $bookId + */ + public function add(Entity $entity, $activityKey, $bookId = 0, $extra = false) + { + $this->activity->user_id = $this->user->id; + $this->activity->book_id = $bookId; + $this->activity->key = strtolower($activityKey); + if($extra !== false) { + $this->activity->extra = $extra; + } + $entity->activity()->save($this->activity); + } + + /** + * Adds a activity history with a message & without binding to a entitiy. + * @param $activityKey + * @param int $bookId + * @param bool|false $extra + */ + public function addMessage($activityKey, $bookId = 0, $extra = false) + { + $this->activity->user_id = $this->user->id; + $this->activity->book_id = $bookId; + $this->activity->key = strtolower($activityKey); + if($extra !== false) { + $this->activity->extra = $extra; + } + $this->activity->save(); + } + +} \ No newline at end of file diff --git a/app/Services/Facades/Activity.php b/app/Services/Facades/Activity.php new file mode 100644 index 000000000..0a52a76e2 --- /dev/null +++ b/app/Services/Facades/Activity.php @@ -0,0 +1,14 @@ +=5.5.9", "laravel/framework": "5.1.*", - "intervention/image": "^2.3" + "intervention/image": "^2.3", + "barryvdh/laravel-ide-helper": "^2.1" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/composer.lock b/composer.lock index 79eb195ed..ec5ebc543 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,71 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "f1c04613ce972bfab5c142cb0b588385", + "hash": "16de3a44150d9425a501c9873cb28eaf", "packages": [ + { + "name": "barryvdh/laravel-ide-helper", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-ide-helper.git", + "reference": "83999f8467374adcb8893f566c9171c9d9691f50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/83999f8467374adcb8893f566c9171c9d9691f50", + "reference": "83999f8467374adcb8893f566c9171c9d9691f50", + "shasum": "" + }, + "require": { + "illuminate/console": "5.0.x|5.1.x", + "illuminate/filesystem": "5.0.x|5.1.x", + "illuminate/support": "5.0.x|5.1.x", + "php": ">=5.4.0", + "phpdocumentor/reflection-docblock": "2.0.4", + "symfony/class-loader": "~2.3" + }, + "require-dev": { + "doctrine/dbal": "~2.3" + }, + "suggest": { + "doctrine/dbal": "Load information from the database about models for phpdocs (~2.3)" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\LaravelIdeHelper\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Laravel IDE Helper, generates correct PHPDocs for all Facade classes, to improve auto-completion.", + "keywords": [ + "autocomplete", + "codeintel", + "helper", + "ide", + "laravel", + "netbeans", + "phpdoc", + "phpstorm", + "sublime" + ], + "time": "2015-08-13 11:40:00" + }, { "name": "classpreloader/classpreloader", "version": "2.0.0", @@ -62,16 +125,16 @@ }, { "name": "danielstjules/stringy", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/danielstjules/Stringy.git", - "reference": "3cf18e9e424a6dedc38b7eb7ef580edb0929461b" + "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/3cf18e9e424a6dedc38b7eb7ef580edb0929461b", - "reference": "3cf18e9e424a6dedc38b7eb7ef580edb0929461b", + "url": "https://api.github.com/repos/danielstjules/Stringy/zipball/4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", + "reference": "4749c205db47ee5b32e8d1adf6d9aff8db6caf3b", "shasum": "" }, "require": { @@ -114,7 +177,7 @@ "utility", "utils" ], - "time": "2015-02-10 06:19:18" + "time": "2015-07-23 00:54:12" }, { "name": "dnoegel/php-xdg-base-dir", @@ -218,16 +281,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "af0e1758de355eb113917ad79c3c0e3604bce4bd" + "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/af0e1758de355eb113917ad79c3c0e3604bce4bd", - "reference": "af0e1758de355eb113917ad79c3c0e3604bce4bd", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/4ef919b0cf3b1989523138b60163bbcb7ba1ff7e", + "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e", "shasum": "" }, "require": { @@ -251,7 +314,7 @@ "GuzzleHttp\\Psr7\\": "src/" }, "files": [ - "src/functions.php" + "src/functions_include.php" ] }, "notification-url": "https://packagist.org/downloads/", @@ -272,7 +335,7 @@ "stream", "uri" ], - "time": "2015-06-24 19:55:15" + "time": "2015-08-15 19:32:36" }, { "name": "intervention/image", @@ -483,16 +546,16 @@ }, { "name": "laravel/framework", - "version": "v5.1.7", + "version": "v5.1.10", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "5e942882319845f71c681ce6e85831129bf66426" + "reference": "d47ccc8de10ccb6f328cc90f901ca5e47e077c93" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/5e942882319845f71c681ce6e85831129bf66426", - "reference": "5e942882319845f71c681ce6e85831129bf66426", + "url": "https://api.github.com/repos/laravel/framework/zipball/d47ccc8de10ccb6f328cc90f901ca5e47e077c93", + "reference": "d47ccc8de10ccb6f328cc90f901ca5e47e077c93", "shasum": "" }, "require": { @@ -607,20 +670,20 @@ "framework", "laravel" ], - "time": "2015-07-12 02:27:36" + "time": "2015-08-12 18:16:08" }, { "name": "league/flysystem", - "version": "1.0.7", + "version": "1.0.11", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "b58431785768abbb4f00c10e66a065095a0693ef" + "reference": "c16222fdc02467eaa12cb6d6d0e65527741f6040" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/b58431785768abbb4f00c10e66a065095a0693ef", - "reference": "b58431785768abbb4f00c10e66a065095a0693ef", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c16222fdc02467eaa12cb6d6d0e65527741f6040", + "reference": "c16222fdc02467eaa12cb6d6d0e65527741f6040", "shasum": "" }, "require": { @@ -688,20 +751,20 @@ "sftp", "storage" ], - "time": "2015-07-11 14:58:06" + "time": "2015-07-28 20:41:58" }, { "name": "monolog/monolog", - "version": "1.14.0", + "version": "1.16.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "b287fbbe1ca27847064beff2bad7fb6920bf08cc" + "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b287fbbe1ca27847064beff2bad7fb6920bf08cc", - "reference": "b287fbbe1ca27847064beff2bad7fb6920bf08cc", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c0c0b4bee3aabce7182876b0d912ef2595563db7", + "reference": "c0c0b4bee3aabce7182876b0d912ef2595563db7", "shasum": "" }, "require": { @@ -738,7 +801,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14.x-dev" + "dev-master": "1.16.x-dev" } }, "autoload": { @@ -764,7 +827,7 @@ "logging", "psr-3" ], - "time": "2015-06-19 13:29:54" + "time": "2015-08-09 17:44:44" }, { "name": "mtdowling/cron-expression", @@ -859,16 +922,16 @@ }, { "name": "nikic/php-parser", - "version": "v1.3.0", + "version": "v1.4.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dff239267fd1befa1cd40430c9ed12591aa720ca" + "reference": "196f177cfefa0f1f7166c0a05d8255889be12418" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dff239267fd1befa1cd40430c9ed12591aa720ca", - "reference": "dff239267fd1befa1cd40430c9ed12591aa720ca", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/196f177cfefa0f1f7166c0a05d8255889be12418", + "reference": "196f177cfefa0f1f7166c0a05d8255889be12418", "shasum": "" }, "require": { @@ -878,7 +941,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.4-dev" } }, "autoload": { @@ -900,7 +963,56 @@ "parser", "php" ], - "time": "2015-05-02 15:40:40" + "time": "2015-07-14 17:31:05" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", + "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "suggest": { + "dflydev/markdown": "~1.0", + "erusev/parsedown": "~1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ], + "time": "2015-02-03 12:10:50" }, { "name": "psr/http-message", @@ -991,16 +1103,16 @@ }, { "name": "psy/psysh", - "version": "v0.5.1", + "version": "v0.5.2", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "e5a46a767928e85f1f47dda654beda8c680ddd94" + "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/e5a46a767928e85f1f47dda654beda8c680ddd94", - "reference": "e5a46a767928e85f1f47dda654beda8c680ddd94", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/aaf8772ade08b5f0f6830774a5d5c2f800415975", + "reference": "aaf8772ade08b5f0f6830774a5d5c2f800415975", "shasum": "" }, "require": { @@ -1059,7 +1171,7 @@ "interactive", "shell" ], - "time": "2015-07-03 16:48:00" + "time": "2015-07-16 15:26:57" }, { "name": "swiftmailer/swiftmailer", @@ -1115,17 +1227,67 @@ "time": "2015-06-06 14:19:39" }, { - "name": "symfony/console", - "version": "v2.7.1", + "name": "symfony/class-loader", + "version": "v2.7.3", "source": { "type": "git", - "url": "https://github.com/symfony/Console.git", - "reference": "564398bc1f33faf92fc2ec86859983d30eb81806" + "url": "https://github.com/symfony/ClassLoader.git", + "reference": "2fccbc544997340808801a7410cdcb96dd12edc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/564398bc1f33faf92fc2ec86859983d30eb81806", - "reference": "564398bc1f33faf92fc2ec86859983d30eb81806", + "url": "https://api.github.com/repos/symfony/ClassLoader/zipball/2fccbc544997340808801a7410cdcb96dd12edc4", + "reference": "2fccbc544997340808801a7410cdcb96dd12edc4", + "shasum": "" + }, + "require": { + "php": ">=5.3.9" + }, + "require-dev": { + "symfony/finder": "~2.0,>=2.0.5", + "symfony/phpunit-bridge": "~2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\ClassLoader\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony ClassLoader Component", + "homepage": "https://symfony.com", + "time": "2015-06-25 12:52:11" + }, + { + "name": "symfony/console", + "version": "v2.7.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/Console.git", + "reference": "d6cf02fe73634c96677e428f840704bfbcaec29e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/Console/zipball/d6cf02fe73634c96677e428f840704bfbcaec29e", + "reference": "d6cf02fe73634c96677e428f840704bfbcaec29e", "shasum": "" }, "require": { @@ -1169,11 +1331,11 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2015-06-10 15:30:22" + "time": "2015-07-28 15:18:12" }, { "name": "symfony/css-selector", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/CssSelector.git", @@ -1226,16 +1388,16 @@ }, { "name": "symfony/debug", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/Debug.git", - "reference": "075070230c5bbc65abde8241191655bbce0716e2" + "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Debug/zipball/075070230c5bbc65abde8241191655bbce0716e2", - "reference": "075070230c5bbc65abde8241191655bbce0716e2", + "url": "https://api.github.com/repos/symfony/Debug/zipball/9daa1bf9f7e615fa2fba30357e479a90141222e3", + "reference": "9daa1bf9f7e615fa2fba30357e479a90141222e3", "shasum": "" }, "require": { @@ -1282,20 +1444,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2015-06-08 09:37:21" + "time": "2015-07-09 16:07:40" }, { "name": "symfony/dom-crawler", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/DomCrawler.git", - "reference": "11d8eb8ccc1533f4c2d89a025f674894fda520b3" + "reference": "9dabece63182e95c42b06967a0d929a5df78bc35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/11d8eb8ccc1533f4c2d89a025f674894fda520b3", - "reference": "11d8eb8ccc1533f4c2d89a025f674894fda520b3", + "url": "https://api.github.com/repos/symfony/DomCrawler/zipball/9dabece63182e95c42b06967a0d929a5df78bc35", + "reference": "9dabece63182e95c42b06967a0d929a5df78bc35", "shasum": "" }, "require": { @@ -1335,20 +1497,20 @@ ], "description": "Symfony DomCrawler Component", "homepage": "https://symfony.com", - "time": "2015-05-22 14:54:25" + "time": "2015-07-09 16:07:40" }, { "name": "symfony/event-dispatcher", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "be3c5ff8d503c46768aeb78ce6333051aa6f26d9" + "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/be3c5ff8d503c46768aeb78ce6333051aa6f26d9", - "reference": "be3c5ff8d503c46768aeb78ce6333051aa6f26d9", + "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", + "reference": "9310b5f9a87ec2ea75d20fec0b0017c77c66dac3", "shasum": "" }, "require": { @@ -1393,20 +1555,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2015-06-08 09:37:21" + "time": "2015-06-18 19:21:56" }, { "name": "symfony/finder", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/Finder.git", - "reference": "c13a40d638aeede1e8400f8c956c7f9246c05f75" + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/c13a40d638aeede1e8400f8c956c7f9246c05f75", - "reference": "c13a40d638aeede1e8400f8c956c7f9246c05f75", + "url": "https://api.github.com/repos/symfony/Finder/zipball/ae0f363277485094edc04c9f3cbe595b183b78e4", + "reference": "ae0f363277485094edc04c9f3cbe595b183b78e4", "shasum": "" }, "require": { @@ -1442,20 +1604,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2015-06-04 20:11:48" + "time": "2015-07-09 16:07:40" }, { "name": "symfony/http-foundation", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/HttpFoundation.git", - "reference": "4f363c426b0ced57e3d14460022feb63937980ff" + "reference": "863af6898081b34c65d42100c370b9f3c51b70ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/4f363c426b0ced57e3d14460022feb63937980ff", - "reference": "4f363c426b0ced57e3d14460022feb63937980ff", + "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/863af6898081b34c65d42100c370b9f3c51b70ca", + "reference": "863af6898081b34c65d42100c370b9f3c51b70ca", "shasum": "" }, "require": { @@ -1495,27 +1657,27 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2015-06-10 15:30:22" + "time": "2015-07-22 10:11:00" }, { "name": "symfony/http-kernel", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/HttpKernel.git", - "reference": "208101c7a11e31933183bd2a380486e528c74302" + "reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/208101c7a11e31933183bd2a380486e528c74302", - "reference": "208101c7a11e31933183bd2a380486e528c74302", + "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/405d3e7a59ff7a28ec469441326a0ac79065ea98", + "reference": "405d3e7a59ff7a28ec469441326a0ac79065ea98", "shasum": "" }, "require": { "php": ">=5.3.9", "psr/log": "~1.0", "symfony/debug": "~2.6,>=2.6.2", - "symfony/event-dispatcher": "~2.5.9|~2.6,>=2.6.2", + "symfony/event-dispatcher": "~2.6,>=2.6.7", "symfony/http-foundation": "~2.5,>=2.5.4" }, "conflict": { @@ -1575,20 +1737,20 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2015-06-11 21:15:28" + "time": "2015-07-31 13:24:45" }, { "name": "symfony/process", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/Process.git", - "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1" + "reference": "48aeb0e48600321c272955132d7606ab0a49adb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Process/zipball/552d8efdc80980cbcca50b28d626ac8e36e3cdd1", - "reference": "552d8efdc80980cbcca50b28d626ac8e36e3cdd1", + "url": "https://api.github.com/repos/symfony/Process/zipball/48aeb0e48600321c272955132d7606ab0a49adb3", + "reference": "48aeb0e48600321c272955132d7606ab0a49adb3", "shasum": "" }, "require": { @@ -1624,20 +1786,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2015-06-08 09:37:21" + "time": "2015-07-01 11:25:50" }, { "name": "symfony/routing", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/Routing.git", - "reference": "5581be29185b8fb802398904555f70da62f6d50d" + "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Routing/zipball/5581be29185b8fb802398904555f70da62f6d50d", - "reference": "5581be29185b8fb802398904555f70da62f6d50d", + "url": "https://api.github.com/repos/symfony/Routing/zipball/ea9134f277162b02e5f80ac058b75a77637b0d26", + "reference": "ea9134f277162b02e5f80ac058b75a77637b0d26", "shasum": "" }, "require": { @@ -1695,20 +1857,20 @@ "uri", "url" ], - "time": "2015-06-11 17:20:40" + "time": "2015-07-09 16:07:40" }, { "name": "symfony/translation", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/Translation.git", - "reference": "8349a2b0d11bd0311df9e8914408080912983a0b" + "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Translation/zipball/8349a2b0d11bd0311df9e8914408080912983a0b", - "reference": "8349a2b0d11bd0311df9e8914408080912983a0b", + "url": "https://api.github.com/repos/symfony/Translation/zipball/c8dc34cc936152c609cdd722af317e4239d10dd6", + "reference": "c8dc34cc936152c609cdd722af317e4239d10dd6", "shasum": "" }, "require": { @@ -1756,20 +1918,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2015-06-11 17:26:34" + "time": "2015-07-09 16:07:40" }, { "name": "symfony/var-dumper", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "c509921f260353bf07b257f84017777c8b0aa4bc" + "reference": "e8903ebba5eb019f5886ffce739ea9e3b7519579" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c509921f260353bf07b257f84017777c8b0aa4bc", - "reference": "c509921f260353bf07b257f84017777c8b0aa4bc", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/e8903ebba5eb019f5886ffce739ea9e3b7519579", + "reference": "e8903ebba5eb019f5886ffce739ea9e3b7519579", "shasum": "" }, "require": { @@ -1815,7 +1977,7 @@ "debug", "dump" ], - "time": "2015-06-08 09:37:21" + "time": "2015-07-28 15:18:12" }, { "name": "vlucas/phpdotenv", @@ -2081,55 +2243,6 @@ ], "time": "2015-04-02 19:54:00" }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8", - "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "time": "2015-02-03 12:10:50" - }, { "name": "phpspec/php-diff", "version": "v1.0.2", @@ -2244,16 +2357,16 @@ }, { "name": "phpspec/prophecy", - "version": "v1.4.1", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373" + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", - "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", + "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", "shasum": "" }, "require": { @@ -2300,20 +2413,20 @@ "spy", "stub" ], - "time": "2015-04-27 22:15:08" + "time": "2015-08-13 10:07:40" }, { "name": "phpunit/php-code-coverage", - "version": "2.1.7", + "version": "2.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "07e27765596d72c378a6103e80da5d84e802f1e4" + "reference": "2d7c03c0e4e080901b8f33b2897b0577be18a13c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/07e27765596d72c378a6103e80da5d84e802f1e4", - "reference": "07e27765596d72c378a6103e80da5d84e802f1e4", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2d7c03c0e4e080901b8f33b2897b0577be18a13c", + "reference": "2d7c03c0e4e080901b8f33b2897b0577be18a13c", "shasum": "" }, "require": { @@ -2321,7 +2434,7 @@ "phpunit/php-file-iterator": "~1.3", "phpunit/php-text-template": "~1.2", "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "~1.0", + "sebastian/environment": "^1.3.2", "sebastian/version": "~1.0" }, "require-dev": { @@ -2336,7 +2449,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "2.2.x-dev" } }, "autoload": { @@ -2362,20 +2475,20 @@ "testing", "xunit" ], - "time": "2015-06-30 06:52:35" + "time": "2015-08-04 03:42:39" }, { "name": "phpunit/php-file-iterator", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb" + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb", - "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0", + "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0", "shasum": "" }, "require": { @@ -2409,7 +2522,7 @@ "filesystem", "iterator" ], - "time": "2015-04-02 05:19:05" + "time": "2015-06-21 13:08:43" }, { "name": "phpunit/php-text-template", @@ -2454,16 +2567,16 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.6", + "version": "1.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d" + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d", - "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b", + "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b", "shasum": "" }, "require": { @@ -2491,20 +2604,20 @@ "keywords": [ "timer" ], - "time": "2015-06-13 07:35:30" + "time": "2015-06-21 08:01:12" }, { "name": "phpunit/php-token-stream", - "version": "1.4.3", + "version": "1.4.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9" + "reference": "3ab72c62e550370a6cd5dc873e1a04ab57562f5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9", - "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3ab72c62e550370a6cd5dc873e1a04ab57562f5b", + "reference": "3ab72c62e550370a6cd5dc873e1a04ab57562f5b", "shasum": "" }, "require": { @@ -2540,20 +2653,20 @@ "keywords": [ "tokenizer" ], - "time": "2015-06-19 03:43:16" + "time": "2015-08-16 08:51:00" }, { "name": "phpunit/phpunit", - "version": "4.7.6", + "version": "4.8.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "0ebabb4cda7d066be8391dfdbaf57fe70ac9a99b" + "reference": "55bf1d6092b0e13a1f26bd5eaffeef3d8ad85ea7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0ebabb4cda7d066be8391dfdbaf57fe70ac9a99b", - "reference": "0ebabb4cda7d066be8391dfdbaf57fe70ac9a99b", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/55bf1d6092b0e13a1f26bd5eaffeef3d8ad85ea7", + "reference": "55bf1d6092b0e13a1f26bd5eaffeef3d8ad85ea7", "shasum": "" }, "require": { @@ -2563,7 +2676,7 @@ "ext-reflection": "*", "ext-spl": "*", "php": ">=5.3.3", - "phpspec/prophecy": "~1.3,>=1.3.1", + "phpspec/prophecy": "^1.3.1", "phpunit/php-code-coverage": "~2.1", "phpunit/php-file-iterator": "~1.4", "phpunit/php-text-template": "~1.2", @@ -2571,7 +2684,7 @@ "phpunit/phpunit-mock-objects": "~2.3", "sebastian/comparator": "~1.1", "sebastian/diff": "~1.2", - "sebastian/environment": "~1.2", + "sebastian/environment": "~1.3", "sebastian/exporter": "~1.2", "sebastian/global-state": "~1.0", "sebastian/version": "~1.0", @@ -2586,7 +2699,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.7.x-dev" + "dev-master": "4.8.x-dev" } }, "autoload": { @@ -2612,26 +2725,27 @@ "testing", "xunit" ], - "time": "2015-06-30 06:53:57" + "time": "2015-08-15 04:21:23" }, { "name": "phpunit/phpunit-mock-objects", - "version": "2.3.5", + "version": "2.3.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "1c330b1b6e1ea8fd15f2fbea46770576e366855c" + "reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/1c330b1b6e1ea8fd15f2fbea46770576e366855c", - "reference": "1c330b1b6e1ea8fd15f2fbea46770576e366855c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/18dfbcb81d05e2296c0bcddd4db96cade75e6f42", + "reference": "18dfbcb81d05e2296c0bcddd4db96cade75e6f42", "shasum": "" }, "require": { "doctrine/instantiator": "~1.0,>=1.0.2", "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2" + "phpunit/php-text-template": "~1.2", + "sebastian/exporter": "~1.2" }, "require-dev": { "phpunit/phpunit": "~4.4" @@ -2667,20 +2781,20 @@ "mock", "xunit" ], - "time": "2015-07-04 05:41:32" + "time": "2015-07-10 06:54:24" }, { "name": "sebastian/comparator", - "version": "1.1.1", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1dd8869519a225f7f2b9eb663e225298fade819e" + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e", - "reference": "1dd8869519a225f7f2b9eb663e225298fade819e", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22", + "reference": "937efb279bd37a375bcadf584dec0726f84dbf22", "shasum": "" }, "require": { @@ -2694,7 +2808,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -2731,7 +2845,7 @@ "compare", "equality" ], - "time": "2015-01-29 16:28:08" + "time": "2015-07-26 15:48:44" }, { "name": "sebastian/diff", @@ -2787,16 +2901,16 @@ }, { "name": "sebastian/environment", - "version": "1.2.2", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e" + "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e", - "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44", + "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44", "shasum": "" }, "require": { @@ -2833,20 +2947,20 @@ "environment", "hhvm" ], - "time": "2015-01-01 10:01:08" + "time": "2015-08-03 06:14:51" }, { "name": "sebastian/exporter", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "84839970d05254c73cde183a721c7af13aede943" + "reference": "7ae5513327cb536431847bcc0c10edba2701064e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943", - "reference": "84839970d05254c73cde183a721c7af13aede943", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e", + "reference": "7ae5513327cb536431847bcc0c10edba2701064e", "shasum": "" }, "require": { @@ -2899,7 +3013,7 @@ "export", "exporter" ], - "time": "2015-01-27 07:23:06" + "time": "2015-06-21 07:55:53" }, { "name": "sebastian/global-state", @@ -2954,16 +3068,16 @@ }, { "name": "sebastian/recursion-context", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "3989662bbb30a29d20d9faa04a846af79b276252" + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252", - "reference": "3989662bbb30a29d20d9faa04a846af79b276252", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba", + "reference": "994d4a811bafe801fb06dccbee797863ba2792ba", "shasum": "" }, "require": { @@ -3003,7 +3117,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2015-01-24 09:48:32" + "time": "2015-06-21 08:04:50" }, { "name": "sebastian/version", @@ -3042,16 +3156,16 @@ }, { "name": "symfony/yaml", - "version": "v2.7.1", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/Yaml.git", - "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160" + "reference": "71340e996171474a53f3d29111d046be4ad8a0ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160", - "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/71340e996171474a53f3d29111d046be4ad8a0ff", + "reference": "71340e996171474a53f3d29111d046be4ad8a0ff", "shasum": "" }, "require": { @@ -3087,7 +3201,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2015-06-10 15:30:22" + "time": "2015-07-28 14:07:07" } ], "aliases": [], diff --git a/config/app.php b/config/app.php index 4667c23f3..5c76c5958 100644 --- a/config/app.php +++ b/config/app.php @@ -141,6 +141,8 @@ return [ * Third Party */ Intervention\Image\ImageServiceProvider::class, + Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, + /* * Application Service Providers... @@ -148,6 +150,7 @@ return [ Oxbow\Providers\AppServiceProvider::class, Oxbow\Providers\EventServiceProvider::class, Oxbow\Providers\RouteServiceProvider::class, + Oxbow\Providers\CustomFacadeProvider::class, ], @@ -203,6 +206,12 @@ return [ 'ImageTool' => Intervention\Image\Facades\Image::class, + /** + * Custom + */ + + 'Activity' => Oxbow\Services\Facades\Activity::class, + ], ]; diff --git a/database/migrations/2015_08_16_142133_create_activities_table.php b/database/migrations/2015_08_16_142133_create_activities_table.php new file mode 100644 index 000000000..a0e177ddb --- /dev/null +++ b/database/migrations/2015_08_16_142133_create_activities_table.php @@ -0,0 +1,36 @@ +increments('id'); + $table->string('key'); + $table->text('extra'); + $table->integer('book_id')->indexed(); + $table->integer('user_id'); + $table->integer('entity_id'); + $table->string('entity_type'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('activities'); + } +} diff --git a/resources/assets/sass/styles.scss b/resources/assets/sass/styles.scss index c3ebc450b..b967ed94c 100644 --- a/resources/assets/sass/styles.scss +++ b/resources/assets/sass/styles.scss @@ -423,4 +423,10 @@ body.dragging, body.dragging * { background-color: transparent; color: #EEE; } +} + +.activity-list-item { + padding: $-s 0; + color: #888; + border-bottom: 1px solid #EEE; } \ No newline at end of file diff --git a/resources/lang/en/activities.php b/resources/lang/en/activities.php new file mode 100644 index 000000000..b733eb11b --- /dev/null +++ b/resources/lang/en/activities.php @@ -0,0 +1,26 @@ + 'created page', + 'page_update' => 'updated page', + 'page_delete' => 'deleted page', + 'page_restore' => 'restored page', + + // Chapters + 'chapter_create' => 'created chapter', + 'chapter_update' => 'updated chapter', + 'chapter_delete' => 'deleted chapter', + + // Books + 'book_create' => 'created book', + 'book_update' => 'updated book', + 'book_delete' => 'deleted book', + +]; \ No newline at end of file diff --git a/resources/views/books/show.blade.php b/resources/views/books/show.blade.php index 8c03d74ce..06aa37ce9 100644 --- a/resources/views/books/show.blade.php +++ b/resources/views/books/show.blade.php @@ -15,49 +15,63 @@ -
-

{{$book->name}}

-

{{$book->description}}

+
+
-
-
- @foreach($book->children() as $childElement) -
-

- - @if(is_a($childElement, 'Oxbow\Chapter')) - - @else - +
+

{{$book->name}}

+

{{$book->description}}

+ +
+
+ @foreach($book->children() as $childElement) +
+

+ + @if(is_a($childElement, 'Oxbow\Chapter')) + + @else + + @endif + {{ $childElement->name }} + +

+

+ {{$childElement->getExcerpt()}} +

+ + @if(is_a($childElement, 'Oxbow\Chapter') && count($childElement->pages) > 0) +
+ @foreach($childElement->pages as $page) +

{{$page->name}}

+ @endforeach +
@endif - {{ $childElement->name }} - -

-

- {{$childElement->getExcerpt()}} -

- - @if(is_a($childElement, 'Oxbow\Chapter') && count($childElement->pages) > 0) -
- @foreach($childElement->pages as $page) -

{{$page->name}}

- @endforeach
- @endif +
+ @endforeach
-
- @endforeach + +

+ Created {{$book->created_at->diffForHumans()}} @if($book->createdBy) by {{$book->createdBy->name}} @endif +
+ Last Updated {{$book->updated_at->diffForHumans()}} @if($book->createdBy) by {{$book->updatedBy->name}} @endif +

+ +
+
-

- Created {{$book->created_at->diffForHumans()}} @if($book->createdBy) by {{$book->createdBy->name}} @endif -
- Last Updated {{$book->updated_at->diffForHumans()}} @if($book->createdBy) by {{$book->updatedBy->name}} @endif -

- +
+

+

Recent Activity

+ @include('partials/activity-list', ['entity' => $book]) +
+ +