From 420b161d8255c2e38032491d2abc8a703debec38 Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Fri, 4 Aug 2017 15:27:09 +0800 Subject: [PATCH] Added project file record edit TODO: file update can replace file on storage --- app/Entities/Projects/File.php | 7 ++++- app/Http/Controllers/Projects/FilesController.php | 20 ++++++++++++- resources/lang/id/file.php | 2 +- resources/views/projects/files.blade.php | 19 +++++++++++- routes/web/projects.php | 1 + tests/Feature/Projects/UploadFilesTest.php | 36 +++++++++++++++++++++++ tests/TestCase.php | 4 +-- 7 files changed, 83 insertions(+), 6 deletions(-) diff --git a/app/Entities/Projects/File.php b/app/Entities/Projects/File.php index 80ecafd..2c2543e 100644 --- a/app/Entities/Projects/File.php +++ b/app/Entities/Projects/File.php @@ -20,6 +20,11 @@ class File extends Model public function getSize() { - return \Storage::size('public/files/'.$this->filename); + return $this->fileExists() ? \Storage::size('public/files/'.$this->filename) : 0; + } + + public function fileExists() + { + return \Storage::exists('public/files/'.$this->filename); } } diff --git a/app/Http/Controllers/Projects/FilesController.php b/app/Http/Controllers/Projects/FilesController.php index 3baad31..53c6d4b 100644 --- a/app/Http/Controllers/Projects/FilesController.php +++ b/app/Http/Controllers/Projects/FilesController.php @@ -16,13 +16,18 @@ class FilesController extends Controller public function index(Request $request, $fileableId) { + $editableFile = null; $fileableType = $request->segment(1); // projects, features $modelName = $this->getModelName($fileableType); $modelShortName = $this->getModelShortName($modelName); $model = $modelName::findOrFail($fileableId); $files = $model->files; - return view($fileableType.'.files', [$modelShortName => $model, 'files' => $files]); + if (in_array($request->get('action'), ['edit', 'delete']) && $request->has('id')) { + $editableFile = File::find($request->get('id')); + } + + return view($fileableType.'.files', [$modelShortName => $model, 'files' => $files, 'editableFile' => $editableFile]); } public function create(Request $request, $fileableId) @@ -66,6 +71,19 @@ class FilesController extends Controller return redirect()->home(); } + public function update(Request $request, File $file) + { + $file->title = $request->get('title'); + $file->description = $request->get('description'); + $file->save(); + + flash(trans('file.updated'), 'success'); + + $resourceName = array_search($file->fileable_type, $this->fileableTypes); + + return redirect()->route($resourceName.'.files', $file->fileable_id); + } + private function proccessPhotoUpload($data, $fileableType, $fileableId) { $file = $data['file']; diff --git a/resources/lang/id/file.php b/resources/lang/id/file.php index 10ae295..2c74383 100644 --- a/resources/lang/id/file.php +++ b/resources/lang/id/file.php @@ -25,7 +25,7 @@ return [ 'download' => 'Download', // Attributes - 'name' => 'Nama File', + 'title' => 'Nama File', 'description' => 'Deskripsi File', 'size' => 'Ukuran File', ]; diff --git a/resources/views/projects/files.blade.php b/resources/views/projects/files.blade.php index 0e401b1..3945a5c 100755 --- a/resources/views/projects/files.blade.php +++ b/resources/views/projects/files.blade.php @@ -36,7 +36,9 @@ {!! html_link_to_route('files.download', '', [$file->id], ['icon' => 'file', 'title' => trans('file.download')]) !!} - edit + + {!! html_link_to_route('projects.files', '', [$project->id, 'action' => 'edit', 'id' => $file->id], ['icon' => 'edit', 'title' => trans('file.edit')]) !!} + @empty {{ trans('file.empty') }} @@ -46,6 +48,7 @@
+ @if (Request::has('action') == false)

{{ trans('file.create') }}

@@ -58,6 +61,20 @@ {!! Form::close() !!}
+ @endif + @if (Request::get('action') == 'edit' && $editableFile) +
+

{{ trans('file.edit') }} : {{ $editableFile->title }}

+
+ {!! Form::model($editableFile, ['route' => ['files.update', $editableFile->id],'method' => 'patch']) !!} + {!! FormField::text('title', ['label' => trans('file.title'), 'required' => true]) !!} + {!! FormField::textarea('description', ['label' => trans('file.description')]) !!} + {!! Form::submit(trans('file.update'), ['class' => 'btn btn-success']) !!} + {{ link_to_route('projects.files', trans('app.cancel'), [$project->id], ['class' => 'btn btn-default']) }} + {!! Form::close() !!} +
+
+ @endif
diff --git a/routes/web/projects.php b/routes/web/projects.php index 79208be..130838f 100644 --- a/routes/web/projects.php +++ b/routes/web/projects.php @@ -38,4 +38,5 @@ Route::group(['middleware' => ['web','role:admin'], 'namespace' => 'Projects'], Route::get('projects/{project}/files', ['as' => 'projects.files', 'uses' => 'FilesController@index']); Route::post('files/{fileable}', ['as' => 'files.upload', 'uses' => 'FilesController@create']); Route::get('files/{file}', ['as' => 'files.download', 'uses' => 'FilesController@show']); + Route::patch('files/{file}', ['as' => 'files.update', 'uses' => 'FilesController@update']); }); diff --git a/tests/Feature/Projects/UploadFilesTest.php b/tests/Feature/Projects/UploadFilesTest.php index 56f0ed0..bc159b5 100644 --- a/tests/Feature/Projects/UploadFilesTest.php +++ b/tests/Feature/Projects/UploadFilesTest.php @@ -35,4 +35,40 @@ class UploadFilesTest extends TestCase $filePath = storage_path('app/public/files/' . $file->filename); $this->assertFileExistsThenDelete($filePath, 'File doesn\'t exists.'); } + + /** @test */ + public function user_can_edit_document_file_on_a_project() + { + $user = $this->adminUserSigningIn(); + $project = factory(Project::class)->create(['owner_id' => $user->id]); + $this->visit(route('projects.files', [$project->id])); + + $this->attach(storage_path('app/guitar-640.jpg'), 'file'); + $this->type('Judul file', 'title'); + $this->type('Deskripsi file yang diuplod.', 'description'); + $this->press(trans('file.upload')); + + $this->assertCount(1, $project->files); + + $file = $project->files->first(); + + $this->visit(route('projects.files', [$project->id, 'id' => $file->id, 'action' => 'edit'])); + $this->seePageIs(route('projects.files', [$project->id, 'action' => 'edit', 'id' => $file->id])); + + $this->type('Edit Judul file', 'title'); + $this->type('Edit Deskripsi file yang diuplod.', 'description'); + $this->press(trans('file.update')); + + $this->seePageIs(route('projects.files', [$project->id])); + + $this->seeInDatabase('files', [ + 'fileable_id' => $project->id, + 'fileable_type' => 'App\Entities\Projects\Project', + 'title' => 'Edit Judul file', + 'description' => 'Edit Deskripsi file yang diuplod.', + ]); + + $filePath = storage_path('app/public/files/' . $file->filename); + $this->assertFileExistsThenDelete($filePath, 'File doesn\'t exists.'); + } } diff --git a/tests/TestCase.php b/tests/TestCase.php index 4de66f8..a9a7d24 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -52,9 +52,9 @@ class TestCase extends \Laravel\BrowserKitTesting\TestCase return $user; } - protected function assertFileExistsThenDelete($filePath) + protected function assertFileExistsThenDelete($filePath, $message = null) { - $this->assertTrue(file_exists($filePath)); + $this->assertTrue(file_exists($filePath), $message); unlink($filePath); $this->assertFalse(file_exists($filePath));