From 7549998e392c524dc6e48b20f95be9026e8476cf Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sat, 4 Aug 2018 14:48:29 +0800 Subject: [PATCH] User can add and see comments on project detail Add comment listing on project detail Add comment form Show comment list Latest comment on top --- .../Controllers/Projects/CommentsController.php | 50 ++++++++++++++++++++ resources/lang/de/comment.php | 24 ++++++++++ resources/lang/en/comment.php | 24 ++++++++++ resources/lang/id/comment.php | 24 ++++++++++ resources/views/projects/comments.blade.php | 14 ++++++ .../projects/partials/comment-section.blade.php | 18 ++++++++ .../views/projects/partials/nav-tabs.blade.php | 3 ++ routes/web/projects.php | 6 +++ tests/Feature/Projects/ProjectCommentsTest.php | 53 ++++++++++++++++++++++ 9 files changed, 216 insertions(+) create mode 100644 app/Http/Controllers/Projects/CommentsController.php create mode 100644 resources/lang/de/comment.php create mode 100644 resources/lang/en/comment.php create mode 100644 resources/lang/id/comment.php create mode 100755 resources/views/projects/comments.blade.php create mode 100644 resources/views/projects/partials/comment-section.blade.php create mode 100644 tests/Feature/Projects/ProjectCommentsTest.php diff --git a/app/Http/Controllers/Projects/CommentsController.php b/app/Http/Controllers/Projects/CommentsController.php new file mode 100644 index 0000000..c1250b0 --- /dev/null +++ b/app/Http/Controllers/Projects/CommentsController.php @@ -0,0 +1,50 @@ +comments()->latest()->paginate(); + + return view('projects.comments', compact('project', 'comments')); + } + + /** + * Store a new comment in storage. + * + * @param \Illuminate\Http\Request $request + * @param \App\Entities\Projects\Project $project + * @return \Illuminate\Http\RedirectResponse + */ + public function store(Request $request, Project $project) + { + $this->authorize('view', $project); + + $newComment = $request->validate([ + 'body' => 'required|string|max:255', + 'fu_type_id' => 'nullable|numeric', + 'objection_id' => 'nullable|numeric', + ]); + + $project->comments()->create([ + 'body' => $newComment['body'], + 'creator_id' => auth()->id(), + ]); + + flash(__('comment.created'), 'success'); + + return back(); + } +} diff --git a/resources/lang/de/comment.php b/resources/lang/de/comment.php new file mode 100644 index 0000000..699a233 --- /dev/null +++ b/resources/lang/de/comment.php @@ -0,0 +1,24 @@ + 'Comment', + 'list' => 'Comments', + 'empty' => 'Comment is empty.', + + // Actions + 'create' => 'Add Comment', + 'create_text' => 'Write your comment ...', + 'created' => 'Create new Comment succeded.', + 'edit' => 'Edit Comment', + 'update' => 'Update Comment', + 'updated' => 'Update Comment succeded.', + 'delete' => 'Delete Comment', + 'delete_confirm' => 'Are you sure to delete this Comment?', + 'deleted' => 'Delete Comment succeded.', + 'undeleted' => 'Comment not deleted.', + 'undeleteable' => 'Comment cannot be deleted.', + + // Attributes + 'body' => 'Comment', +]; diff --git a/resources/lang/en/comment.php b/resources/lang/en/comment.php new file mode 100644 index 0000000..699a233 --- /dev/null +++ b/resources/lang/en/comment.php @@ -0,0 +1,24 @@ + 'Comment', + 'list' => 'Comments', + 'empty' => 'Comment is empty.', + + // Actions + 'create' => 'Add Comment', + 'create_text' => 'Write your comment ...', + 'created' => 'Create new Comment succeded.', + 'edit' => 'Edit Comment', + 'update' => 'Update Comment', + 'updated' => 'Update Comment succeded.', + 'delete' => 'Delete Comment', + 'delete_confirm' => 'Are you sure to delete this Comment?', + 'deleted' => 'Delete Comment succeded.', + 'undeleted' => 'Comment not deleted.', + 'undeleteable' => 'Comment cannot be deleted.', + + // Attributes + 'body' => 'Comment', +]; diff --git a/resources/lang/id/comment.php b/resources/lang/id/comment.php new file mode 100644 index 0000000..b20b834 --- /dev/null +++ b/resources/lang/id/comment.php @@ -0,0 +1,24 @@ + 'Komentar', + 'list' => 'List Komentar', + 'empty' => 'Belum ada Komentar', + + // Actions + 'create' => 'Tambah Komentar', + 'create_text' => 'Tulis komentar anda ...', + 'created' => 'Input Komentar berhasil.', + 'edit' => 'Edit Komentar', + 'update' => 'Update Komentar', + 'updated' => 'Update data Komentar telah berhasil.', + 'delete' => 'Hapus Komentar', + 'delete_confirm' => 'Anda yakin akan menghapus Komentar ini?', + 'deleted' => 'Hapus data Komentar telah berhasil.', + 'undeleted' => 'Data Komentar gagal dihapus.', + 'undeleteable' => 'Data Komentar tidak dapat dihapus.', + + // Attributes + 'body' => 'Komentar', +]; diff --git a/resources/views/projects/comments.blade.php b/resources/views/projects/comments.blade.php new file mode 100755 index 0000000..75bc337 --- /dev/null +++ b/resources/views/projects/comments.blade.php @@ -0,0 +1,14 @@ +@extends('layouts.project') + +@section('subtitle', __('comment.list')) + +@section('content-project') +
+
+ {{ $comments->links() }} + @include('projects.partials.comment-section') + {{ $comments->links() }} +
+
+ +@endsection diff --git a/resources/views/projects/partials/comment-section.blade.php b/resources/views/projects/partials/comment-section.blade.php new file mode 100644 index 0000000..08ef021 --- /dev/null +++ b/resources/views/projects/partials/comment-section.blade.php @@ -0,0 +1,18 @@ +{{ Form::open(['route' => ['projects.comments.store', $project]]) }} +
+
{!! FormField::textarea('body', ['required' => true, 'label' => false, 'placeholder' => __('comment.create_text')]) !!}
+
+ {{ Form::submit(__('comment.create'), ['class' => 'btn btn-success btn-block']) }}
+
+
+{{ Form::close() }} +@foreach($comments as $comment) +
+ + {{ $comment->created_at }} + {{ $comment->creator->name }} + + + {!! nl2br($comment->body) !!} +
+@endforeach diff --git a/resources/views/projects/partials/nav-tabs.blade.php b/resources/views/projects/partials/nav-tabs.blade.php index 22a184d..ffe6549 100644 --- a/resources/views/projects/partials/nav-tabs.blade.php +++ b/resources/views/projects/partials/nav-tabs.blade.php @@ -8,6 +8,9 @@ {!! link_to_route('projects.jobs.index', __('project.jobs').' ('.$project->jobs->count().')', $project) !!} @endcan +
  • + {!! link_to_route('projects.comments.index', __('comment.list').' ('.$project->comments->count().')', $project) !!} +
  • @can('view-payments', $project)
  • {!! link_to_route('projects.payments', __('project.payments').' ('.$project->payments->count().')', $project) !!} diff --git a/routes/web/projects.php b/routes/web/projects.php index 0c1af20..b8af5c4 100644 --- a/routes/web/projects.php +++ b/routes/web/projects.php @@ -38,6 +38,12 @@ Route::group(['middleware' => ['auth'], 'namespace' => 'Projects'], function () Route::post('projects/{project}/jobs-reorder', ['as' => 'projects.jobs-reorder', 'uses' => 'ProjectsController@jobsReorder']); /* + * Project Comments Routes + */ + Route::get('projects/{project}/comments', 'CommentsController@index')->name('projects.comments.index'); + Route::post('projects/{project}/comments', 'CommentsController@store')->name('projects.comments.store'); + + /* * Tasks Routes */ Route::get('jobs/{job}/tasks/create', ['as' => 'tasks.create', 'uses' => 'TasksController@create']); diff --git a/tests/Feature/Projects/ProjectCommentsTest.php b/tests/Feature/Projects/ProjectCommentsTest.php new file mode 100644 index 0000000..b123298 --- /dev/null +++ b/tests/Feature/Projects/ProjectCommentsTest.php @@ -0,0 +1,53 @@ +adminUserSigningIn(); + $project = factory(Project::class)->create(); + $comment = factory(Comment::class)->create([ + 'commentable_type' => 'projects', + 'commentable_id' => $project->id, + 'body' => 'This is project comment.', + ]); + + $this->visitRoute('projects.comments.index', $project); + $this->seeRouteIs('projects.comments.index', $project); + + $this->seeText('This is project comment.'); + } + + /** @test */ + public function admin_can_add_comment_to_a_project() + { + $admin = $this->adminUserSigningIn(); + $project = factory(Project::class)->create(); + + $this->visitRoute('projects.comments.index', $project); + + $this->submitForm(__('comment.create'), [ + 'body' => 'Komentar pertama.', + ]); + + $this->seePageIs(route('projects.comments.index', $project)); + $this->see(__('comment.created')); + + $this->seeInDatabase('comments', [ + 'commentable_type' => 'projects', + 'commentable_id' => $project->id, + 'body' => 'Komentar pertama.', + 'creator_id' => $admin->id, + ]); + } +}