Browse Source

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
pull/15/head
Nafies Luthfi 7 years ago
parent
commit
7549998e39
  1. 50
      app/Http/Controllers/Projects/CommentsController.php
  2. 24
      resources/lang/de/comment.php
  3. 24
      resources/lang/en/comment.php
  4. 24
      resources/lang/id/comment.php
  5. 14
      resources/views/projects/comments.blade.php
  6. 18
      resources/views/projects/partials/comment-section.blade.php
  7. 3
      resources/views/projects/partials/nav-tabs.blade.php
  8. 6
      routes/web/projects.php
  9. 53
      tests/Feature/Projects/ProjectCommentsTest.php

50
app/Http/Controllers/Projects/CommentsController.php

@ -0,0 +1,50 @@
<?php
namespace App\Http\Controllers\Projects;
use Illuminate\Http\Request;
use App\Entities\Projects\Project;
use App\Http\Controllers\Controller;
class CommentsController extends Controller
{
/**
* Display a listing of the project comments.
*
* @param \App\Entities\Projects\Project $project
* @return \Illuminate\View\View
*/
public function index(Project $project)
{
$comments = $project->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();
}
}

24
resources/lang/de/comment.php

@ -0,0 +1,24 @@
<?php
return [
// Labels
'comment' => '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',
];

24
resources/lang/en/comment.php

@ -0,0 +1,24 @@
<?php
return [
// Labels
'comment' => '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',
];

24
resources/lang/id/comment.php

@ -0,0 +1,24 @@
<?php
return [
// Labels
'comment' => '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',
];

14
resources/views/projects/comments.blade.php

@ -0,0 +1,14 @@
@extends('layouts.project')
@section('subtitle', __('comment.list'))
@section('content-project')
<div class="row">
<div class="col-md-8 col-md-offset-1">
{{ $comments->links() }}
@include('projects.partials.comment-section')
{{ $comments->links() }}
</div>
</div>
@endsection

18
resources/views/projects/partials/comment-section.blade.php

@ -0,0 +1,18 @@
{{ Form::open(['route' => ['projects.comments.store', $project]]) }}
<div class="row">
<div class="col-md-9">{!! FormField::textarea('body', ['required' => true, 'label' => false, 'placeholder' => __('comment.create_text')]) !!}</div>
<div class="col-md-3">
{{ Form::submit(__('comment.create'), ['class' => 'btn btn-success btn-block']) }}<br>
</div>
</div>
{{ Form::close() }}
@foreach($comments as $comment)
<div class="alert alert-warning">
<legend style="font-size: 14px;margin-bottom: 10px;">
<span class="label label-default pull-right">{{ $comment->created_at }}</span>
<strong>{{ $comment->creator->name }}</strong>
</legend>
{!! nl2br($comment->body) !!}
</div>
@endforeach

3
resources/views/projects/partials/nav-tabs.blade.php

@ -8,6 +8,9 @@
{!! link_to_route('projects.jobs.index', __('project.jobs').' ('.$project->jobs->count().')', $project) !!} {!! link_to_route('projects.jobs.index', __('project.jobs').' ('.$project->jobs->count().')', $project) !!}
</li> </li>
@endcan @endcan
<li class="{{ Request::segment(3) == 'comments' ? 'active' : '' }}">
{!! link_to_route('projects.comments.index', __('comment.list').' ('.$project->comments->count().')', $project) !!}
</li>
@can('view-payments', $project) @can('view-payments', $project)
<li class="{{ Request::segment(3) == 'payments' ? 'active' : '' }}"> <li class="{{ Request::segment(3) == 'payments' ? 'active' : '' }}">
{!! link_to_route('projects.payments', __('project.payments').' ('.$project->payments->count().')', $project) !!} {!! link_to_route('projects.payments', __('project.payments').' ('.$project->payments->count().')', $project) !!}

6
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']); 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 * Tasks Routes
*/ */
Route::get('jobs/{job}/tasks/create', ['as' => 'tasks.create', 'uses' => 'TasksController@create']); Route::get('jobs/{job}/tasks/create', ['as' => 'tasks.create', 'uses' => 'TasksController@create']);

53
tests/Feature/Projects/ProjectCommentsTest.php

@ -0,0 +1,53 @@
<?php
namespace Tests\Feature\Projects;
use Tests\TestCase;
use App\Entities\Projects\Comment;
use App\Entities\Projects\Project;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class ProjectCommentsTest extends TestCase
{
use DatabaseMigrations;
/** @test */
public function user_can_view_project_comments()
{
$this->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,
]);
}
}
Loading…
Cancel
Save