diff --git a/.gitignore b/.gitignore
index 6a3f5855..29f36a71 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+/public/uploads/*
+!/public/uploads/.gitkeep
/resources/views/vendor
!/resources/views/vendor/.gitkeep
/.env
@@ -6,4 +8,3 @@
/node_modules
Homestead.yaml
Homestead.json
-.env
diff --git a/app/Events/EditFile.php b/app/Events/EditFile.php
new file mode 100644
index 00000000..c32b1ac6
--- /dev/null
+++ b/app/Events/EditFile.php
@@ -0,0 +1,38 @@
+file = $file;
+ }
+
+ /**
+ * Get the channels the event should be broadcast on.
+ *
+ * @return array
+ */
+ public function broadcastOn()
+ {
+ return [];
+ }
+}
diff --git a/app/Events/UploadFile.php b/app/Events/UploadFile.php
new file mode 100644
index 00000000..a414602b
--- /dev/null
+++ b/app/Events/UploadFile.php
@@ -0,0 +1,42 @@
+uploadedFile = $uploadedFile;
+ $this->id = $id;
+ }
+
+ /**
+ * Get the channels the event should be broadcast on.
+ *
+ * @return array
+ */
+ public function broadcastOn()
+ {
+ return [];
+ }
+}
diff --git a/app/Helpers/FileManager.php b/app/Helpers/FileManager.php
new file mode 100644
index 00000000..7aa20b1d
--- /dev/null
+++ b/app/Helpers/FileManager.php
@@ -0,0 +1,140 @@
+mime_type);
+
+ switch ($type) {
+ case 'image':
+
+ // try to check if file have thumbnail
+ if (file_exists(config('app.thumbnail_url') . '/' . $file->filename)) {
+ $url = config('app.thumbnail_url') . '/' . $file->filename;
+ } else {
+ $url = config('app.upload_url') . '/' . $file->filename;
+ }
+
+ return '';
+ break;
+ case 'text':
+ return '';
+ break;
+ case 'application':
+ switch ($subtype) {
+ case 'pdf':
+ return '';
+ break;
+ default:
+ return '';
+ break;
+ }
+ break;
+ default:
+ return '';
+ break;
+ }
+ }
+
+ /**
+ *
+ *
+ * @param File $file
+ *
+ * @return string
+ */
+ public static function getFormattedSize(File $file)
+ {
+ $bytes = $file->file_size;
+
+ $label = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
+ for ($i = 0; $bytes >= 1024 && $i < (count($label) - 1); $bytes /= 1024, $i++) {
+ ;
+ }
+
+ return (round($bytes, 2) . " " . $label[$i]);
+ }
+
+ /**
+ * Get preview for file detail
+ *
+ * @param File $file
+ *
+ * @return \Illuminate\Contracts\Routing\UrlGenerator|string
+ */
+ public static function getLargePreview(File $file)
+ {
+ list($type, $subtype) = explode('/', $file->mime_type);
+
+ $url = config('app.upload_url') . '/' . $file->filename;
+ $path = config('app.upload_path') . DIRECTORY_SEPARATOR . $file->filename;
+
+ switch ($type) {
+ case 'image':
+ return '
';
+ break;
+ case 'text':
+
+ $string = '
';
+ $string .= htmlspecialchars(file_get_contents($path));
+ $string .= '';
+
+ return $string;
+ break;
+ case 'application':
+ switch ($subtype) {
+ case 'pdf':
+ return '';
+ break;
+ default:
+ return '';
+ break;
+ }
+ break;
+ default:
+ return self::getPreview($file);
+ break;
+ }
+ }
+
+ /**
+ * @param File $file
+ *
+ * @return array
+ */
+ public static function getAdditionalInfo(File $file)
+ {
+ list($type, $subtype) = explode('/', $file->mime_type);
+
+ $path = config('app.upload_path') . DIRECTORY_SEPARATOR . $file->filename;
+
+ switch ($type) {
+ case 'text':
+
+ return [
+ trans('admin/fileManager.encoding') => mb_detect_encoding(file_get_contents($path))
+ ];
+ break;
+
+ case 'image':
+ list ($width, $height) = getimagesize($path);
+
+ return [
+ trans('admin/fileManager.resolution') => $height . ' x ' . $width,
+ ];
+
+ break;
+ }
+
+ return [];
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/Admin/EditUploadedFile.php b/app/Http/Controllers/Admin/EditUploadedFile.php
new file mode 100644
index 00000000..99443df7
--- /dev/null
+++ b/app/Http/Controllers/Admin/EditUploadedFile.php
@@ -0,0 +1,102 @@
+fileNotFound();
+ }
+
+ return view('admin.fileManager.edit', [
+ 'file' => $file,
+ 'extraInfo' => FileManager::getAdditionalInfo($file)
+ ]);
+ }
+
+ /**
+ * Updates file
+ *
+ * User can change only keywords, original filename and description. Mime type, hash and other fields remain
+ * unchanged
+ *
+ * @param EditUploadedFileRequest $request
+ * @param $id
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postEdit(EditUploadedFileRequest $request, $id)
+ {
+ try {
+ $file = File::findOrFail($id);
+ } catch (NotFoundHttpException $e) {
+ return $this->fileNotFound();
+ }
+
+ // set values from form
+ $file->keywords = $request->keywords;
+ $file->description = $request->description;
+ $file->save();
+
+ // fire action
+ Event::fire(new EditFile($file));
+
+ // update successfull
+ return redirect()
+ ->route('upload.detail', ['id' => $id])
+ ->with('success', trans('admin/fileManager.successfullyChanged'));
+ }
+
+ /**
+ * Deletes file
+ *
+ * @param $id
+ */
+ public function deleteFile($id)
+ {
+ try {
+ $file = File::findOrFail($id);
+ } catch (NotFoundHttpException $e) {
+ return $this->fileNotFound();
+ }
+
+ $file->delete();
+
+ return redirect()
+ ->route('upload.overview')
+ ->with('success', trans('admin/fileManager.fileDeleted'));
+ }
+
+ /**
+ * Redirects user to files overview
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ private function fileNotFound()
+ {
+ return redirect()
+ ->route('upload.overview')
+ ->with('error', trans('admin/fileManager.fileNotFound'));
+ }
+}
diff --git a/app/Http/Controllers/Admin/UploadFile.php b/app/Http/Controllers/Admin/UploadFile.php
new file mode 100644
index 00000000..6dfc54f7
--- /dev/null
+++ b/app/Http/Controllers/Admin/UploadFile.php
@@ -0,0 +1,97 @@
+file = $file;
+ }
+
+ public function getFile()
+ {
+ return view('admin/fileManager.newFile');
+ }
+
+ public function getImage()
+ {
+ }
+
+ /**
+ * Uploads any file
+ *
+ * @param UploadFileRequest $request
+ *
+ * @return \Illuminate\Http\RedirectResponse
+ */
+ public function postFile(UploadFileRequest $request)
+ {
+ if (!$request->hasFile('file')) {
+ return $this->invalidUpload('noFileSpecified');
+ }
+
+ try {
+ $uploadedFile = $this->file->upload($request->file('file'), $request);
+
+ // we do not want to redirect
+ if ($request->ajax()) {
+ return $this->jsonResponse($uploadedFile);
+ }
+
+ // upload was not performed via ajax, redirect user
+ return redirect()
+ ->route('upload.file')
+ ->with('success', trans('admin/fileManager.uploadSuccessfull'));
+ } catch (FileException $e) {
+ return $this->invalidUpload('invalidFile');
+ }
+ }
+
+ protected function invalidUpload($message)
+ {
+ return redirect()
+ ->route('upload.file')
+ ->with('error', trans('admin/fileManager.' . $message));
+ }
+
+ /**
+ * Uploads only images
+ *
+ * @param UploadImageRequest $request
+ */
+ public function postImage(UploadImageRequest $request)
+ {
+ }
+
+ /**
+ * Send response about uploaded file as JSON
+ *
+ * @param $uploadedFile
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ private function jsonResponse($uploadedFile)
+ {
+ $filename = $uploadedFile['file']->getFilename();
+ $url = config('app.upload_path') . DIRECTORY_SEPARATOR . $filename;
+
+ $data = [
+ 'filename' => $filename,
+ 'url' => $url,
+ 'id' => $uploadedFile['id']
+ ];
+
+ return response()->json($data);
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/Admin/UploadedFilesOverview.php b/app/Http/Controllers/Admin/UploadedFilesOverview.php
new file mode 100644
index 00000000..93721771
--- /dev/null
+++ b/app/Http/Controllers/Admin/UploadedFilesOverview.php
@@ -0,0 +1,33 @@
+where('mime_type', 'LIKE', $type.'%');
+ else {
+ $files = $files->where('mime_type', $type.'/'.$subtype);
+ }
+ }
+
+ $files = $files->paginate(18);
+
+ return view('admin.fileManager.overview', [
+ 'direcories' => $directories,
+ 'files' => $files
+ ]);
+ }
+}
diff --git a/app/Http/Requests/EditUploadedFileRequest.php b/app/Http/Requests/EditUploadedFileRequest.php
new file mode 100644
index 00000000..78aab6ce
--- /dev/null
+++ b/app/Http/Requests/EditUploadedFileRequest.php
@@ -0,0 +1,18 @@
+ 'max:255'
+ ];
+ }
+}
diff --git a/app/Http/Requests/UploadFileRequest.php b/app/Http/Requests/UploadFileRequest.php
new file mode 100644
index 00000000..bdb863d1
--- /dev/null
+++ b/app/Http/Requests/UploadFileRequest.php
@@ -0,0 +1,14 @@
+rules = ['file' => 'required'];
+ }
+}
diff --git a/app/Http/Requests/UploadImageRequest.php b/app/Http/Requests/UploadImageRequest.php
new file mode 100644
index 00000000..4b9eb0d1
--- /dev/null
+++ b/app/Http/Requests/UploadImageRequest.php
@@ -0,0 +1,11 @@
+rules = ['image' => 'required|image'];
+ }
+}
diff --git a/app/Http/Requests/UploadRequest.php b/app/Http/Requests/UploadRequest.php
new file mode 100644
index 00000000..7d05410e
--- /dev/null
+++ b/app/Http/Requests/UploadRequest.php
@@ -0,0 +1,32 @@
+ 'max:255'
+ ];
+
+ // setup additional rules
+ $this->setRules();
+
+ foreach ($this->rules as $field => $rule) {
+ $rules[$field] = $rule;
+ }
+
+ return $rules;
+ }
+}
diff --git a/app/Http/routes.php b/app/Http/routes.php
index b783ff42..5689f06e 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -89,6 +89,32 @@ Route::group([
Route::get('history/{revision}/{id}', 'History@getDiff')
->name('history.diff');
+ // uploader methods
+ Route::get('upload/file', 'UploadFile@getFile')
+ ->name('upload.file');
+
+ Route::get('upload/detail/{id}', 'EditUploadedFile@getDetail')
+ ->name('upload.detail');
+
+ Route::post('upload/detail/{id}', 'EditUploadedFile@postEdit')
+ ->name('upload.postEdit');
+
+ Route::get('upload/delete/{id}', 'EditUploadedFile@deleteFile')
+ ->name('upload.delete');
+
+ Route::get('upload/image', 'UploadFile@getImage')
+ ->name('upload.image');
+
+ Route::get('upload/overview/{type?}/{subtype?}', 'UploadedFilesOverview@getOverview')
+ ->name('upload.overview');
+
+ // uploader methods
+ Route::post('upload/file', 'UploadFile@postFile')
+ ->name('upload.postFile');
+
+ Route::post('upload/image', 'UploadFile@postImage')
+ ->name('upload.postImage');
+
// custom fields
// ------------------------------
diff --git a/app/Listeners/LogEditFile.php b/app/Listeners/LogEditFile.php
new file mode 100644
index 00000000..754f887f
--- /dev/null
+++ b/app/Listeners/LogEditFile.php
@@ -0,0 +1,31 @@
+getClientOriginalExtension();
+ }
+
+ /**
+ * Saves file into FS and creates new record in database
+ *
+ * @param UploadedFile $file
+ * @param UploadRequest $request
+ *
+ * @return array associative array - key 'file' is type of SymphonyFile and contains info about real file, key 'id'
+ * is ID of row in files table
+ */
+ public function upload(UploadedFile $file, UploadRequest $request)
+ {
+ $destination = config('app.upload_path');
+ $filename = $this->getFilename($file);
+
+ // save file into physical location (local FS)
+ $uploadedFile = $file->move($destination, $filename);
+
+ // insert record into database
+ $id = $this->saveIntoDatabase($uploadedFile, $request, $file->getClientOriginalName());
+
+ // fire event about new file
+ Event::fire(new UploadFile($uploadedFile, $id));
+
+ return [
+ 'file' => $file,
+ 'id' => $id
+ ];
+ }
+
+ /**
+ * Save file into database
+ *
+ * This file saves new record into database. It also calculates hash of given file, obtains MIME type etc.
+ *
+ * @param SymphonyFile $file
+ * @param UploadRequest $request
+ * @param $originalFilename
+ *
+ * @return mixed
+ */
+ protected function saveIntoDatabase(SymphonyFile $file, UploadRequest $request, $originalFilename)
+ {
+ // get path and hash of uploaded file
+ $path = config('app.upload_path') . DIRECTORY_SEPARATOR . $file->getFilename();
+ $hash = hash_file(self::HASH_ALGORITHM, $path);
+
+ // define mandatory fields
+ $newFile = new File();
+ $newFile->user_id = Auth::user()->id;
+ $newFile->filename = $file->getFilename();
+ $newFile->original_filename = $originalFilename;
+ $newFile->file_hash = $hash;
+ $newFile->hash_algorithm = self::HASH_ALGORITHM;
+ $newFile->mime_type = $file->getMimeType();
+ $newFile->file_size = $file->getSize();
+
+ // save optional fields
+ $optionalFields = ['description', 'keywords', 'directory'];
+ foreach ($optionalFields as $field) {
+ if ($request->has($field)) {
+ $newFile->$field = $request->$field;
+ }
+ }
+
+ // create new database row
+ $newFile->save();
+
+ return $newFile->id;
+ }
}
\ No newline at end of file
diff --git a/app/Providers/AdminMenusProvider.php b/app/Providers/AdminMenusProvider.php
index 6328db93..c3773b43 100644
--- a/app/Providers/AdminMenusProvider.php
+++ b/app/Providers/AdminMenusProvider.php
@@ -32,6 +32,11 @@ class AdminMenusProvider extends ServiceProvider
$sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-users']);
}, 20, ['icon' => 'fa fa-users']);
+ $menu->dropdown(trans('admin/mainMenu.fileManager'), function ($sub) {
+ $sub->route('upload.file', trans('admin/mainMenu.uploadFile'), [], 10, ['icon' => 'fa fa-file']);
+ $sub->route('upload.image', trans('admin/mainMenu.uploadImage'), [], 50, ['icon' => 'fa fa-image']);
+ $sub->route('upload.overview', trans('admin/mainMenu.uploadedFiles'), [], 150, ['icon' => 'fa fa-files-o']);
+ }, 25, ['icon' => 'fa fa-film']);
$menu->dropdown(trans('admin/mainMenu.customFields'), function ($sub) {
$sub->route('customfields.new', trans('admin/mainMenu.customFieldsNew'), [], 10, ['icon' => 'fa fa-code']);
$sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-code-fork']);
diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
index 24f304ae..510ebc0f 100644
--- a/app/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -31,6 +31,12 @@ class EventServiceProvider extends ServiceProvider
'App\Events\ChangeSettings' => [
'App\Listeners\LogChangeSettings',
],
+ 'App\Events\UploadFile' => [
+ 'App\Listeners\LogUploadFile'
+ ],
+ 'App\Events\EditFile' => [
+ 'App\Listeners\LogEditFile'
+ ],
// internal Laravel events - should work as auth.login and auth.logout, however it doesn't...
'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogLogin'
@@ -43,13 +49,13 @@ class EventServiceProvider extends ServiceProvider
/**
* Register any other events for your application.
*
- * @param \Illuminate\Contracts\Events\Dispatcher $events
+ * @param \Illuminate\Contracts\Events\Dispatcher $events
+ *
* @return void
*/
public function boot(DispatcherContract $events)
{
parent::boot($events);
-
//
}
}
diff --git a/composer.json b/composer.json
index dcaf4e17..67ab3f66 100644
--- a/composer.json
+++ b/composer.json
@@ -9,11 +9,8 @@
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.2.*",
- "phpmailer/phpmailer": "^5.2",
"pingpong/modules": "~2.0",
- "league/flysystem": "^1.0",
- "pingpong/menus": "^2.2",
- "barryvdh/laravel-debugbar": "^2.1"
+ "pingpong/menus": "^2.2"
},
"require-dev": {
"fzaninotto/faker": "~1.4",
@@ -21,7 +18,8 @@
"phpunit/phpunit": "~4.0",
"symfony/css-selector": "2.8.*|3.0.*",
"symfony/dom-crawler": "2.8.*|3.0.*",
- "ignasbernotas/laravel-model-generator": "^1.0"
+ "ignasbernotas/laravel-model-generator": "^1.0",
+ "barryvdh/laravel-debugbar": "^2.1"
},
"autoload": {
"classmap": [
diff --git a/composer.lock b/composer.lock
index 30ec0a51..41717d56 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,63 +4,9 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "27413e2fb445cf59127e99f09dc8a9ea",
- "content-hash": "173c8e5098f17b21677337b99e7ec552",
+ "hash": "44d6faf05b21eb90967b3daba5c1b424",
+ "content-hash": "4e94c29585710dc23f51e823efbbb86b",
"packages": [
- {
- "name": "barryvdh/laravel-debugbar",
- "version": "v2.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/barryvdh/laravel-debugbar.git",
- "reference": "974fd16e328ca851a081449100d9509af59cf0ff"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/974fd16e328ca851a081449100d9509af59cf0ff",
- "reference": "974fd16e328ca851a081449100d9509af59cf0ff",
- "shasum": ""
- },
- "require": {
- "illuminate/support": "~5.0.17|5.1.*|5.2.*",
- "maximebf/debugbar": "~1.11.0",
- "php": ">=5.4.0",
- "symfony/finder": "~2.6|~3.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.2-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Barryvdh\\Debugbar\\": "src/"
- },
- "files": [
- "src/helpers.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Barry vd. Heuvel",
- "email": "barryvdh@gmail.com"
- }
- ],
- "description": "PHP Debugbar integration for Laravel",
- "keywords": [
- "debug",
- "debugbar",
- "laravel",
- "profiler",
- "webprofiler"
- ],
- "time": "2015-12-22 06:22:38"
- },
{
"name": "classpreloader/classpreloader",
"version": "3.0.0",
@@ -847,16 +793,16 @@
},
{
"name": "laravel/framework",
- "version": "v5.2.11",
+ "version": "v5.2.14",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "e8ad411ac3ca63f532952417156e32d010fcc522"
+ "reference": "ce63ba53d4891bdbb5e1aaeced1b5dd34edbc86f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/e8ad411ac3ca63f532952417156e32d010fcc522",
- "reference": "e8ad411ac3ca63f532952417156e32d010fcc522",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/ce63ba53d4891bdbb5e1aaeced1b5dd34edbc86f",
+ "reference": "ce63ba53d4891bdbb5e1aaeced1b5dd34edbc86f",
"shasum": ""
},
"require": {
@@ -971,20 +917,20 @@
"framework",
"laravel"
],
- "time": "2016-01-22 18:36:05"
+ "time": "2016-02-03 14:19:04"
},
{
"name": "laravelcollective/html",
- "version": "v5.2.3",
+ "version": "v5.2.4",
"source": {
"type": "git",
"url": "https://github.com/LaravelCollective/html.git",
- "reference": "7ec0ca55cab54cc6d331007d86ec068b61f46aad"
+ "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/LaravelCollective/html/zipball/7ec0ca55cab54cc6d331007d86ec068b61f46aad",
- "reference": "7ec0ca55cab54cc6d331007d86ec068b61f46aad",
+ "url": "https://api.github.com/repos/LaravelCollective/html/zipball/3a312d39ffe37da0f57b602618b61fd07c1fcec5",
+ "reference": "3a312d39ffe37da0f57b602618b61fd07c1fcec5",
"shasum": ""
},
"require": {
@@ -1025,7 +971,7 @@
],
"description": "HTML and Form Builders for the Laravel Framework",
"homepage": "http://laravelcollective.com",
- "time": "2016-01-20 18:28:21"
+ "time": "2016-01-27 22:29:54"
},
{
"name": "league/flysystem",
@@ -1111,67 +1057,6 @@
],
"time": "2015-12-19 20:16:43"
},
- {
- "name": "maximebf/debugbar",
- "version": "v1.11.0",
- "source": {
- "type": "git",
- "url": "https://github.com/maximebf/php-debugbar.git",
- "reference": "07741d84d39d10f00551c94284cdefcc69703e77"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/07741d84d39d10f00551c94284cdefcc69703e77",
- "reference": "07741d84d39d10f00551c94284cdefcc69703e77",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0",
- "psr/log": "^1.0",
- "symfony/var-dumper": "^2.6|^3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.0|^5.0"
- },
- "suggest": {
- "kriswallsmith/assetic": "The best way to manage assets",
- "monolog/monolog": "Log using Monolog",
- "predis/predis": "Redis storage"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.11-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "DebugBar\\": "src/DebugBar/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Maxime Bouroumeau-Fuseau",
- "email": "maxime.bouroumeau@gmail.com",
- "homepage": "http://maximebf.com"
- },
- {
- "name": "Barry vd. Heuvel",
- "email": "barryvdh@gmail.com"
- }
- ],
- "description": "Debug bar in the browser for php application",
- "homepage": "https://github.com/maximebf/php-debugbar",
- "keywords": [
- "debug",
- "debugbar"
- ],
- "time": "2015-12-10 09:50:24"
- },
{
"name": "monolog/monolog",
"version": "1.17.2",
@@ -1251,23 +1136,23 @@
},
{
"name": "mtdowling/cron-expression",
- "version": "v1.0.4",
+ "version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/mtdowling/cron-expression.git",
- "reference": "fd92e883195e5dfa77720b1868cf084b08be4412"
+ "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/fd92e883195e5dfa77720b1868cf084b08be4412",
- "reference": "fd92e883195e5dfa77720b1868cf084b08be4412",
+ "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/c9ee7886f5a12902b225a1a12f36bb45f9ab89e5",
+ "reference": "c9ee7886f5a12902b225a1a12f36bb45f9ab89e5",
"shasum": ""
},
"require": {
"php": ">=5.3.2"
},
"require-dev": {
- "phpunit/phpunit": "4.*"
+ "phpunit/phpunit": "~4.0|~5.0"
},
"type": "library",
"autoload": {
@@ -1291,7 +1176,7 @@
"cron",
"schedule"
],
- "time": "2015-01-11 23:07:46"
+ "time": "2016-01-26 21:23:30"
},
{
"name": "nesbot/carbon",
@@ -1393,16 +1278,16 @@
},
{
"name": "paragonie/random_compat",
- "version": "1.1.5",
+ "version": "v1.2.0",
"source": {
"type": "git",
"url": "https://github.com/paragonie/random_compat.git",
- "reference": "dd8998b7c846f6909f4e7a5f67fabebfc412a4f7"
+ "reference": "b0e69d10852716b2ccbdff69c75c477637220790"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/dd8998b7c846f6909f4e7a5f67fabebfc412a4f7",
- "reference": "dd8998b7c846f6909f4e7a5f67fabebfc412a4f7",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/b0e69d10852716b2ccbdff69c75c477637220790",
+ "reference": "b0e69d10852716b2ccbdff69c75c477637220790",
"shasum": ""
},
"require": {
@@ -1437,68 +1322,7 @@
"pseudorandom",
"random"
],
- "time": "2016-01-06 13:31:20"
- },
- {
- "name": "phpmailer/phpmailer",
- "version": "v5.2.14",
- "source": {
- "type": "git",
- "url": "https://github.com/PHPMailer/PHPMailer.git",
- "reference": "e774bc9152de85547336e22b8926189e582ece95"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/e774bc9152de85547336e22b8926189e582ece95",
- "reference": "e774bc9152de85547336e22b8926189e582ece95",
- "shasum": ""
- },
- "require": {
- "php": ">=5.0.0"
- },
- "require-dev": {
- "phpdocumentor/phpdocumentor": "*",
- "phpunit/phpunit": "4.7.*"
- },
- "suggest": {
- "league/oauth2-client": "Needed for XOAUTH2 authentication",
- "league/oauth2-google": "Needed for Gmail XOAUTH2"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "class.phpmailer.php",
- "class.phpmaileroauth.php",
- "class.phpmaileroauthgoogle.php",
- "class.smtp.php",
- "class.pop3.php",
- "extras/EasyPeasyICS.php",
- "extras/ntlm_sasl_client.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-2.1"
- ],
- "authors": [
- {
- "name": "Jim Jagielski",
- "email": "jimjag@gmail.com"
- },
- {
- "name": "Marcus Bointon",
- "email": "phpmailer@synchromedia.co.uk"
- },
- {
- "name": "Andy Prevost",
- "email": "codeworxtech@users.sourceforge.net"
- },
- {
- "name": "Brent R. Matzelle"
- }
- ],
- "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
- "time": "2015-11-01 10:15:28"
+ "time": "2016-02-06 03:52:05"
},
{
"name": "pingpong/generators",
@@ -1859,16 +1683,16 @@
},
{
"name": "symfony/console",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "ebcdc507829df915f4ca23067bd59ee4ef61f6c3"
+ "reference": "5a02eaadaa285e2bb727eb6bbdfb8201fcd971b0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/ebcdc507829df915f4ca23067bd59ee4ef61f6c3",
- "reference": "ebcdc507829df915f4ca23067bd59ee4ef61f6c3",
+ "url": "https://api.github.com/repos/symfony/console/zipball/5a02eaadaa285e2bb727eb6bbdfb8201fcd971b0",
+ "reference": "5a02eaadaa285e2bb727eb6bbdfb8201fcd971b0",
"shasum": ""
},
"require": {
@@ -1915,20 +1739,20 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2015-12-22 10:39:06"
+ "time": "2016-02-02 13:44:19"
},
{
"name": "symfony/debug",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "73612266ac709769effdbfc0762e5b07cfd2ac2a"
+ "reference": "29606049ced1ec715475f88d1bbe587252a3476e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/73612266ac709769effdbfc0762e5b07cfd2ac2a",
- "reference": "73612266ac709769effdbfc0762e5b07cfd2ac2a",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/29606049ced1ec715475f88d1bbe587252a3476e",
+ "reference": "29606049ced1ec715475f88d1bbe587252a3476e",
"shasum": ""
},
"require": {
@@ -1972,20 +1796,20 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2015-12-26 13:39:53"
+ "time": "2016-01-27 05:14:46"
},
{
"name": "symfony/event-dispatcher",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "d36355e026905fa5229e1ed7b4e9eda2e67adfcf"
+ "reference": "4dd5df31a28c0f82b41cb1e1599b74b5dcdbdafa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d36355e026905fa5229e1ed7b4e9eda2e67adfcf",
- "reference": "d36355e026905fa5229e1ed7b4e9eda2e67adfcf",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4dd5df31a28c0f82b41cb1e1599b74b5dcdbdafa",
+ "reference": "4dd5df31a28c0f82b41cb1e1599b74b5dcdbdafa",
"shasum": ""
},
"require": {
@@ -2032,20 +1856,20 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2015-10-30 23:35:59"
+ "time": "2016-01-27 05:14:46"
},
{
"name": "symfony/finder",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "8617895eb798b6bdb338321ce19453dc113e5675"
+ "reference": "623bda0abd9aa29e529c8e9c08b3b84171914723"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/8617895eb798b6bdb338321ce19453dc113e5675",
- "reference": "8617895eb798b6bdb338321ce19453dc113e5675",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/623bda0abd9aa29e529c8e9c08b3b84171914723",
+ "reference": "623bda0abd9aa29e529c8e9c08b3b84171914723",
"shasum": ""
},
"require": {
@@ -2081,20 +1905,20 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
- "time": "2015-12-05 11:13:14"
+ "time": "2016-01-27 05:14:46"
},
{
"name": "symfony/http-foundation",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "939c8c28a5b1e4ab7317bc30c1f9aa881c4b06b5"
+ "reference": "9344a87ceedfc50354a39653e54257ee9aa6a77d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/939c8c28a5b1e4ab7317bc30c1f9aa881c4b06b5",
- "reference": "939c8c28a5b1e4ab7317bc30c1f9aa881c4b06b5",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9344a87ceedfc50354a39653e54257ee9aa6a77d",
+ "reference": "9344a87ceedfc50354a39653e54257ee9aa6a77d",
"shasum": ""
},
"require": {
@@ -2133,20 +1957,20 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
- "time": "2015-12-18 15:43:53"
+ "time": "2016-02-02 13:44:19"
},
{
"name": "symfony/http-kernel",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "f7933e9f19e26e7baba7ec04735b466fedd3a6db"
+ "reference": "cec02604450481ac26710ca4249cc61b57b23942"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f7933e9f19e26e7baba7ec04735b466fedd3a6db",
- "reference": "f7933e9f19e26e7baba7ec04735b466fedd3a6db",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cec02604450481ac26710ca4249cc61b57b23942",
+ "reference": "cec02604450481ac26710ca4249cc61b57b23942",
"shasum": ""
},
"require": {
@@ -2215,20 +2039,20 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "https://symfony.com",
- "time": "2015-12-26 16:46:13"
+ "time": "2016-02-03 12:38:44"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.0.1",
+ "version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "49ff736bd5d41f45240cec77b44967d76e0c3d25"
+ "reference": "1289d16209491b584839022f29257ad859b8532d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/49ff736bd5d41f45240cec77b44967d76e0c3d25",
- "reference": "49ff736bd5d41f45240cec77b44967d76e0c3d25",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/1289d16209491b584839022f29257ad859b8532d",
+ "reference": "1289d16209491b584839022f29257ad859b8532d",
"shasum": ""
},
"require": {
@@ -2240,7 +2064,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.1-dev"
}
},
"autoload": {
@@ -2274,20 +2098,20 @@
"portable",
"shim"
],
- "time": "2015-11-20 09:19:13"
+ "time": "2016-01-20 09:13:37"
},
{
"name": "symfony/polyfill-php56",
- "version": "v1.0.1",
+ "version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "e2e77609a9e2328eb370fbb0e0d8b2000ebb488f"
+ "reference": "4d891fff050101a53a4caabb03277284942d1ad9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/e2e77609a9e2328eb370fbb0e0d8b2000ebb488f",
- "reference": "e2e77609a9e2328eb370fbb0e0d8b2000ebb488f",
+ "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/4d891fff050101a53a4caabb03277284942d1ad9",
+ "reference": "4d891fff050101a53a4caabb03277284942d1ad9",
"shasum": ""
},
"require": {
@@ -2297,7 +2121,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.1-dev"
}
},
"autoload": {
@@ -2330,20 +2154,20 @@
"portable",
"shim"
],
- "time": "2015-12-18 15:10:25"
+ "time": "2016-01-20 09:13:37"
},
{
"name": "symfony/polyfill-util",
- "version": "v1.0.1",
+ "version": "v1.1.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-util.git",
- "reference": "4271c55cbc0a77b2641f861b978123e46b3da969"
+ "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/4271c55cbc0a77b2641f861b978123e46b3da969",
- "reference": "4271c55cbc0a77b2641f861b978123e46b3da969",
+ "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4",
+ "reference": "8de62801aa12bc4dfcf85eef5d21981ae7bb3cc4",
"shasum": ""
},
"require": {
@@ -2352,7 +2176,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "1.1-dev"
}
},
"autoload": {
@@ -2382,20 +2206,20 @@
"polyfill",
"shim"
],
- "time": "2015-11-04 20:28:58"
+ "time": "2016-01-20 09:13:37"
},
{
"name": "symfony/process",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "f4794f1d00f0746621be3020ffbd8c5e0b217ee3"
+ "reference": "dfecef47506179db2501430e732adbf3793099c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/f4794f1d00f0746621be3020ffbd8c5e0b217ee3",
- "reference": "f4794f1d00f0746621be3020ffbd8c5e0b217ee3",
+ "url": "https://api.github.com/repos/symfony/process/zipball/dfecef47506179db2501430e732adbf3793099c8",
+ "reference": "dfecef47506179db2501430e732adbf3793099c8",
"shasum": ""
},
"require": {
@@ -2431,20 +2255,20 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2015-12-23 11:04:02"
+ "time": "2016-02-02 13:44:19"
},
{
"name": "symfony/routing",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "3b1bac52f42cb0f54df1a2dbabd55a1d214e2a59"
+ "reference": "4686baa55a835e1c1ede9b86ba02415c8c8d6166"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/3b1bac52f42cb0f54df1a2dbabd55a1d214e2a59",
- "reference": "3b1bac52f42cb0f54df1a2dbabd55a1d214e2a59",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/4686baa55a835e1c1ede9b86ba02415c8c8d6166",
+ "reference": "4686baa55a835e1c1ede9b86ba02415c8c8d6166",
"shasum": ""
},
"require": {
@@ -2505,20 +2329,20 @@
"uri",
"url"
],
- "time": "2015-12-23 08:00:11"
+ "time": "2016-01-27 05:14:46"
},
{
"name": "symfony/translation",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "dff0867826a7068d673801b7522f8e2634016ef9"
+ "reference": "2de0b6f7ebe43cffd8a06996ebec6aab79ea9e91"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/dff0867826a7068d673801b7522f8e2634016ef9",
- "reference": "dff0867826a7068d673801b7522f8e2634016ef9",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/2de0b6f7ebe43cffd8a06996ebec6aab79ea9e91",
+ "reference": "2de0b6f7ebe43cffd8a06996ebec6aab79ea9e91",
"shasum": ""
},
"require": {
@@ -2569,20 +2393,20 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2015-12-05 17:45:07"
+ "time": "2016-02-02 13:44:19"
},
{
"name": "symfony/var-dumper",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "87db8700deb12ba2b65e858f656a1f885530bcb0"
+ "reference": "24bb94807eff00db49374c37ebf56a0304e8aef3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/87db8700deb12ba2b65e858f656a1f885530bcb0",
- "reference": "87db8700deb12ba2b65e858f656a1f885530bcb0",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/24bb94807eff00db49374c37ebf56a0304e8aef3",
+ "reference": "24bb94807eff00db49374c37ebf56a0304e8aef3",
"shasum": ""
},
"require": {
@@ -2632,7 +2456,7 @@
"debug",
"dump"
],
- "time": "2015-12-05 11:13:14"
+ "time": "2016-01-07 13:38:51"
},
{
"name": "vlucas/phpdotenv",
@@ -2687,6 +2511,60 @@
}
],
"packages-dev": [
+ {
+ "name": "barryvdh/laravel-debugbar",
+ "version": "v2.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/barryvdh/laravel-debugbar.git",
+ "reference": "974fd16e328ca851a081449100d9509af59cf0ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/974fd16e328ca851a081449100d9509af59cf0ff",
+ "reference": "974fd16e328ca851a081449100d9509af59cf0ff",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/support": "~5.0.17|5.1.*|5.2.*",
+ "maximebf/debugbar": "~1.11.0",
+ "php": ">=5.4.0",
+ "symfony/finder": "~2.6|~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Barryvdh\\Debugbar\\": "src/"
+ },
+ "files": [
+ "src/helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "PHP Debugbar integration for Laravel",
+ "keywords": [
+ "debug",
+ "debugbar",
+ "laravel",
+ "profiler",
+ "webprofiler"
+ ],
+ "time": "2015-12-22 06:22:38"
+ },
{
"name": "doctrine/instantiator",
"version": "1.0.5",
@@ -2881,6 +2759,67 @@
],
"time": "2015-12-27 00:20:16"
},
+ {
+ "name": "maximebf/debugbar",
+ "version": "v1.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maximebf/php-debugbar.git",
+ "reference": "07741d84d39d10f00551c94284cdefcc69703e77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/07741d84d39d10f00551c94284cdefcc69703e77",
+ "reference": "07741d84d39d10f00551c94284cdefcc69703e77",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/log": "^1.0",
+ "symfony/var-dumper": "^2.6|^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0|^5.0"
+ },
+ "suggest": {
+ "kriswallsmith/assetic": "The best way to manage assets",
+ "monolog/monolog": "Log using Monolog",
+ "predis/predis": "Redis storage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "DebugBar\\": "src/DebugBar/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maxime Bouroumeau-Fuseau",
+ "email": "maxime.bouroumeau@gmail.com",
+ "homepage": "http://maximebf.com"
+ },
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Debug bar in the browser for php application",
+ "homepage": "https://github.com/maximebf/php-debugbar",
+ "keywords": [
+ "debug",
+ "debugbar"
+ ],
+ "time": "2015-12-10 09:50:24"
+ },
{
"name": "mockery/mockery",
"version": "0.9.4",
@@ -3297,16 +3236,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "4.8.21",
+ "version": "4.8.22",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "ea76b17bced0500a28098626b84eda12dbcf119c"
+ "reference": "dfb11aa5236376b4fc63853cf746af39fe780e72"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ea76b17bced0500a28098626b84eda12dbcf119c",
- "reference": "ea76b17bced0500a28098626b84eda12dbcf119c",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/dfb11aa5236376b4fc63853cf746af39fe780e72",
+ "reference": "dfb11aa5236376b4fc63853cf746af39fe780e72",
"shasum": ""
},
"require": {
@@ -3365,7 +3304,7 @@
"testing",
"xunit"
],
- "time": "2015-12-12 07:45:58"
+ "time": "2016-02-02 09:01:21"
},
{
"name": "phpunit/phpunit-mock-objects",
@@ -3796,16 +3735,16 @@
},
{
"name": "symfony/css-selector",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "4613311fd46e146f506403ce2f8a0c71d402d2a3"
+ "reference": "6605602690578496091ac20ec7a5cbd160d4dff4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/4613311fd46e146f506403ce2f8a0c71d402d2a3",
- "reference": "4613311fd46e146f506403ce2f8a0c71d402d2a3",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/6605602690578496091ac20ec7a5cbd160d4dff4",
+ "reference": "6605602690578496091ac20ec7a5cbd160d4dff4",
"shasum": ""
},
"require": {
@@ -3845,20 +3784,20 @@
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
- "time": "2015-12-05 17:45:07"
+ "time": "2016-01-27 05:14:46"
},
{
"name": "symfony/dom-crawler",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/dom-crawler.git",
- "reference": "7c622b0c9fb8bdb146d6dfa86c5f91dcbfdbc11d"
+ "reference": "b693a9650aa004576b593ff2e91ae749dc90123d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7c622b0c9fb8bdb146d6dfa86c5f91dcbfdbc11d",
- "reference": "7c622b0c9fb8bdb146d6dfa86c5f91dcbfdbc11d",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b693a9650aa004576b593ff2e91ae749dc90123d",
+ "reference": "b693a9650aa004576b593ff2e91ae749dc90123d",
"shasum": ""
},
"require": {
@@ -3901,20 +3840,20 @@
],
"description": "Symfony DomCrawler Component",
"homepage": "https://symfony.com",
- "time": "2015-12-26 13:42:31"
+ "time": "2016-01-25 09:56:57"
},
{
"name": "symfony/yaml",
- "version": "v3.0.1",
+ "version": "v3.0.2",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "3df409958a646dad2bc5046c3fb671ee24a1a691"
+ "reference": "3cf0709d7fe936e97bee9e954382e449003f1d9a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/3df409958a646dad2bc5046c3fb671ee24a1a691",
- "reference": "3df409958a646dad2bc5046c3fb671ee24a1a691",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/3cf0709d7fe936e97bee9e954382e449003f1d9a",
+ "reference": "3cf0709d7fe936e97bee9e954382e449003f1d9a",
"shasum": ""
},
"require": {
@@ -3950,7 +3889,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2015-12-26 13:39:53"
+ "time": "2016-02-02 13:44:19"
}
],
"aliases": [],
diff --git a/config/app.php b/config/app.php
index 0fd1d264..af9c1bef 100644
--- a/config/app.php
+++ b/config/app.php
@@ -87,6 +87,16 @@ return [
'key' => env('APP_KEY'),
'cipher' => 'AES-256-CBC',
+ /*
+ * Upload path used for storing all uploaded files
+ */
+ 'upload_path' => env('UPLOAD_PATH', public_path('uploads')),
+ 'thumbnail_path' => env('THUMBNAIL_PATH', public_path('uploads/thumbnails')),
+ /*
+ * Artisan cannot access to website URL, therefore we need to use PHP_SAPI const for determining running from CLI.
+ */
+ 'upload_url' => env('UPLOAD_URL', PHP_SAPI === 'cli' ? '' : url('uploads')),
+ 'thumbnail_url' => env('THUMBNAIL_URL', PHP_SAPI === 'cli' ? '' : url('uploads/thumbnails')),
/*
|--------------------------------------------------------------------------
| Logging Configuration
diff --git a/database/migrations/2016_02_08_105722_AddExtendedFileInfo.php b/database/migrations/2016_02_08_105722_AddExtendedFileInfo.php
new file mode 100644
index 00000000..3dde48b4
--- /dev/null
+++ b/database/migrations/2016_02_08_105722_AddExtendedFileInfo.php
@@ -0,0 +1,60 @@
+string('original_filename')
+ ->after('filename')->comment = 'Original filename of uploaded file';
+ $table->text('description')
+ ->nullable();
+ $table->string('keywords')
+ ->nullable()
+ ->index('keywords_idx');
+ $table->string('directory')
+ ->default('/')
+ ->index('directory_idx')->comment = 'Not real directory on FS, only virtual one - used for better user orientation in large file collections';
+ $table->index('filename');
+ $table->string('filename', 128)
+ ->comment('Filename of localy stored file')
+ ->change();
+ $table->timestamp('updated_at')
+ ->nullable()
+ ->after('created_at');
+ $table->renameColumn('sha256_hash', 'file_hash');
+ $table->string('hash_algorithm', '16')
+ ->after('sha256_hash');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('files', function (Blueprint $table) {
+ $table->dropColumn([
+ 'original_filename',
+ 'description',
+ 'keywords',
+ 'directory',
+ 'updated_at',
+ 'hash_algorithm'
+ ]);
+ $table->dropIndex('files_filename_index');
+ $table->renameColumn('file_hash', 'sha256_hash');
+ });
+ }
+}
diff --git a/database/migrations/2016_02_08_134354_AddFileSizeTofiles.php b/database/migrations/2016_02_08_134354_AddFileSizeTofiles.php
new file mode 100644
index 00000000..2dfaa024
--- /dev/null
+++ b/database/migrations/2016_02_08_134354_AddFileSizeTofiles.php
@@ -0,0 +1,33 @@
+integer('file_size')
+ ->after('mime_type')
+ ->comment('Filesize given in bytes');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('files', function (Blueprint $table) {
+ $table->dropColumn('file_size');
+ });
+ }
+}
diff --git a/public/uploads/.gitkeep b/public/uploads/.gitkeep
new file mode 100755
index 00000000..e69de29b
diff --git a/resources/assets/css/admin.css b/resources/assets/css/admin.css
index 483d5e27..f2247f94 100644
--- a/resources/assets/css/admin.css
+++ b/resources/assets/css/admin.css
@@ -8,6 +8,11 @@ ins {
color: green;
}
+code {
+ overflow: auto;
+ max-height: 40em;
+}
+
.columns:last-child:not(:first-child), .column:last-child:not(:first-child) {
float: left;
}
@@ -43,6 +48,32 @@ ins {
list-style-type: none;
}
+.tile-overview .item {
+ position: relative;
+ padding-bottom: 3em;
+}
+
+.tile-overview .controls {
+ position: absolute;
+ bottom: 0;
+}
+
+.tile-overview .controls .button {
+ margin-bottom: 0;
+}
+
+.tile-overview .small {
+ font-size: 80%;
+}
+
+.tile-overview .preview {
+ font-size: 350%;
+ text-align: center;
+ line-height: 3em;
+ max-height: 3em;
+ overflow:hidden;
+}
+
#static-page-overview .page {
position: relative;
padding-bottom: 3em;
diff --git a/resources/assets/js/vendor/highlightjs/LICENSE b/resources/assets/js/vendor/highlightjs/LICENSE
new file mode 100644
index 00000000..422deb73
--- /dev/null
+++ b/resources/assets/js/vendor/highlightjs/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2006, Ivan Sagalaev
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of highlight.js nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/resources/assets/js/vendor/highlightjs/highlight.min.js b/resources/assets/js/vendor/highlightjs/highlight.min.js
new file mode 100644
index 00000000..034046cb
--- /dev/null
+++ b/resources/assets/js/vendor/highlightjs/highlight.min.js
@@ -0,0 +1,2 @@
+/*! highlight.js v9.1.0 | BSD3 License | git.io/hljslicense */
+!function(e){"undefined"!=typeof exports?e(exports):(self.hljs=e({}),"function"==typeof define&&define.amd&&define("hljs",[],function(){return self.hljs}))}(function(e){function n(e){return e.replace(/&/gm,"&").replace(//gm,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){return/^(no-?highlight|plain|text)$/i.test(e)}function i(e){var n,t,r,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=/\blang(?:uage)?-([\w-]+)\b/i.exec(i))return E(t[1])?t[1]:"no-highlight";for(i=i.split(/\s+/),n=0,r=i.length;r>n;n++)if(E(i[n])||a(i[n]))return i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset