Browse Source

Add project issue listing page and model relation

pull/37/head
Nafies Luthfi 7 years ago
parent
commit
5b703da256
  1. 10
      app/Entities/Projects/Issue.php
  2. 11
      app/Entities/Projects/Project.php
  3. 16
      app/Http/Controllers/Projects/IssueController.php
  4. 15
      database/factories/IssueFactory.php
  5. 34
      database/migrations/2019_03_03_210017_create_issues_table.php
  6. 32
      resources/views/projects/issues.blade.php
  7. 5
      routes/web/projects.php
  8. 3
      tests/Feature/Projects/ProjectIssuesTest.php
  9. 11
      tests/Unit/Models/ProjectTest.php

10
app/Entities/Projects/Issue.php

@ -0,0 +1,10 @@
<?php
namespace App\Entities\Projects;
use Illuminate\Database\Eloquent\Model;
class Issue extends Model
{
//
}

11
app/Entities/Projects/Project.php

@ -3,6 +3,7 @@
namespace App\Entities\Projects;
use DB;
use App\Entities\Projects\Issue;
use App\Entities\Invoices\Invoice;
use App\Entities\Payments\Payment;
use App\Entities\Partners\Customer;
@ -264,4 +265,14 @@ class Project extends Model
return parent::delete();
}
/**
* Project has many Issues relation.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function issues()
{
return $this->hasMany(Issue::class);
}
}

16
app/Http/Controllers/Projects/IssueController.php

@ -0,0 +1,16 @@
<?php
namespace App\Http\Controllers\Projects;
use App\Entities\Projects\Project;
use App\Http\Controllers\Controller;
class IssueController extends Controller
{
public function index(Project $project)
{
$issues = $project->issues;
return view('projects.issues', compact('project', 'issues'));
}
}

15
database/factories/IssueFactory.php

@ -0,0 +1,15 @@
<?php
use Faker\Generator as Faker;
use App\Entities\Projects\Issue;
use App\Entities\Projects\Project;
$factory->define(Issue::class, function (Faker $faker) {
return [
'project_id' => function () {
return factory(Project::class)->create()->id;
},
'title' => $faker->words(3, true),
'body' => $faker->sentences(3, true),
];
});

34
database/migrations/2019_03_03_210017_create_issues_table.php

@ -0,0 +1,34 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateIssuesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('issues', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('project_id');
$table->string('title', 60);
$table->string('body');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('issues');
}
}

32
resources/views/projects/issues.blade.php

@ -0,0 +1,32 @@
@extends('layouts.project')
@section('subtitle', __('project.issues'))
@section('content-project')
<div id="project-issues" class="panel panel-default table-responsive">
<div class="panel-heading">
<h3 class="panel-title">{{ __('project.issues') }}</h3>
</div>
<table class="table table-condensed table-striped">
<thead>
<th>{{ __('app.table_no') }}</th>
<th>{{ __('issue.name') }}</th>
<th class="text-center">{{ __('app.action') }}</th>
</thead>
<tbody>
@forelse($issues as $key => $issue)
@php
$no = 1 + $key;
@endphp
<tr id="{{ $issue->id }}">
<td>{{ $no }}</td>
<td>{{ $issue->title }}</td>
<td class="text-center">&nbsp;</td>
</tr>
@empty
<tr><td colspan="3">{{ __('issue.empty') }}</td></tr>
@endforelse
</tbody>
</table>
</div>
@endsection

5
routes/web/projects.php

@ -46,6 +46,11 @@ Route::group(['middleware' => ['auth'], 'namespace' => 'Projects'], function ()
Route::delete('projects/{project}/comments/{comment}', 'CommentsController@destroy')->name('projects.comments.destroy');
/*
* Project Issues Routes
*/
Route::get('projects/{project}/issues', 'IssueController@index')->name('projects.issues.index');
/*
* Tasks Routes
*/
Route::get('jobs/{job}/tasks/create', ['as' => 'tasks.create', 'uses' => 'TasksController@create']);

3
tests/Feature/Projects/ProjectIssuesTest.php

@ -3,6 +3,8 @@
namespace Tests\Feature\Projects;
use Tests\TestCase;
use App\Entities\Projects\Issue;
use App\Entities\Projects\Project;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ProjectIssuesTest extends TestCase
@ -24,7 +26,6 @@ class ProjectIssuesTest extends TestCase
$this->seeRouteIs('projects.issues.index', $project);
$this->seeText('The issue title.');
$this->seeText('This is a project issue.');
}
/** @test */

11
tests/Unit/Models/ProjectTest.php

@ -6,6 +6,7 @@ use Tests\TestCase;
use App\Entities\Projects\Job;
use App\Entities\Projects\File;
use App\Entities\Projects\Task;
use App\Entities\Projects\Issue;
use App\Entities\Invoices\Invoice;
use App\Entities\Payments\Payment;
use App\Entities\Projects\Comment;
@ -350,4 +351,14 @@ class ProjectTest extends TestCase
'project_id' => $project->id,
]);
}
/** @test */
public function a_project_has_many_issues_relation()
{
$project = factory(Project::class)->create();
$issue = factory(Issue::class)->create(['project_id' => $project->id]);
$this->assertInstanceOf(Collection::class, $project->issues);
$this->assertInstanceOf(Issue::class, $project->issues->first());
}
}
Loading…
Cancel
Save