Browse Source

Added project file record edit

TODO: file update can replace file on storage
pull/1/head
Nafies Luthfi 8 years ago
parent
commit
420b161d82
  1. 7
      app/Entities/Projects/File.php
  2. 20
      app/Http/Controllers/Projects/FilesController.php
  3. 2
      resources/lang/id/file.php
  4. 19
      resources/views/projects/files.blade.php
  5. 1
      routes/web/projects.php
  6. 36
      tests/Feature/Projects/UploadFilesTest.php
  7. 4
      tests/TestCase.php

7
app/Entities/Projects/File.php

@ -20,6 +20,11 @@ class File extends Model
public function getSize() 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);
} }
} }

20
app/Http/Controllers/Projects/FilesController.php

@ -16,13 +16,18 @@ class FilesController extends Controller
public function index(Request $request, $fileableId) public function index(Request $request, $fileableId)
{ {
$editableFile = null;
$fileableType = $request->segment(1); // projects, features $fileableType = $request->segment(1); // projects, features
$modelName = $this->getModelName($fileableType); $modelName = $this->getModelName($fileableType);
$modelShortName = $this->getModelShortName($modelName); $modelShortName = $this->getModelShortName($modelName);
$model = $modelName::findOrFail($fileableId); $model = $modelName::findOrFail($fileableId);
$files = $model->files; $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) public function create(Request $request, $fileableId)
@ -66,6 +71,19 @@ class FilesController extends Controller
return redirect()->home(); 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) private function proccessPhotoUpload($data, $fileableType, $fileableId)
{ {
$file = $data['file']; $file = $data['file'];

2
resources/lang/id/file.php

@ -25,7 +25,7 @@ return [
'download' => 'Download', 'download' => 'Download',
// Attributes // Attributes
'name' => 'Nama File',
'title' => 'Nama File',
'description' => 'Deskripsi File', 'description' => 'Deskripsi File',
'size' => 'Ukuran File', 'size' => 'Ukuran File',
]; ];

19
resources/views/projects/files.blade.php

@ -36,7 +36,9 @@
<td class="text-center"> <td class="text-center">
{!! html_link_to_route('files.download', '', [$file->id], ['icon' => 'file', 'title' => trans('file.download')]) !!} {!! html_link_to_route('files.download', '', [$file->id], ['icon' => 'file', 'title' => trans('file.download')]) !!}
</td> </td>
<td class="text-center">edit</td>
<td class="text-center">
{!! html_link_to_route('projects.files', '', [$project->id, 'action' => 'edit', 'id' => $file->id], ['icon' => 'edit', 'title' => trans('file.edit')]) !!}
</td>
</tr> </tr>
@empty @empty
<tr><td colspan="5">{{ trans('file.empty') }}</td></tr> <tr><td colspan="5">{{ trans('file.empty') }}</td></tr>
@ -46,6 +48,7 @@
</div> </div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
@if (Request::has('action') == false)
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('file.create') }}</h3></div> <div class="panel-heading"><h3 class="panel-title">{{ trans('file.create') }}</h3></div>
<div class="panel-body"> <div class="panel-body">
@ -58,6 +61,20 @@
{!! Form::close() !!} {!! Form::close() !!}
</div> </div>
</div> </div>
@endif
@if (Request::get('action') == 'edit' && $editableFile)
<div class="panel panel-default">
<div class="panel-heading"><h3 class="panel-title">{{ trans('file.edit') }} : {{ $editableFile->title }}</h3></div>
<div class="panel-body">
{!! 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() !!}
</div>
</div>
@endif
</div> </div>
</div> </div>

1
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::get('projects/{project}/files', ['as' => 'projects.files', 'uses' => 'FilesController@index']);
Route::post('files/{fileable}', ['as' => 'files.upload', 'uses' => 'FilesController@create']); Route::post('files/{fileable}', ['as' => 'files.upload', 'uses' => 'FilesController@create']);
Route::get('files/{file}', ['as' => 'files.download', 'uses' => 'FilesController@show']); Route::get('files/{file}', ['as' => 'files.download', 'uses' => 'FilesController@show']);
Route::patch('files/{file}', ['as' => 'files.update', 'uses' => 'FilesController@update']);
}); });

36
tests/Feature/Projects/UploadFilesTest.php

@ -35,4 +35,40 @@ class UploadFilesTest extends TestCase
$filePath = storage_path('app/public/files/' . $file->filename); $filePath = storage_path('app/public/files/' . $file->filename);
$this->assertFileExistsThenDelete($filePath, 'File doesn\'t exists.'); $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.');
}
} }

4
tests/TestCase.php

@ -52,9 +52,9 @@ class TestCase extends \Laravel\BrowserKitTesting\TestCase
return $user; 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); unlink($filePath);
$this->assertFalse(file_exists($filePath)); $this->assertFalse(file_exists($filePath));

Loading…
Cancel
Save