diff --git a/app/Http/Controllers/Projects/TasksController.php b/app/Http/Controllers/Projects/TasksController.php index 2511800..5cc86e9 100755 --- a/app/Http/Controllers/Projects/TasksController.php +++ b/app/Http/Controllers/Projects/TasksController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Projects; +use DB; use App\Entities\Projects\Job; use App\Entities\Projects\Task; use App\Http\Controllers\Controller; @@ -68,4 +69,30 @@ class TasksController extends Controller return redirect()->route('jobs.show', $task->job_id); } + + /** + * Set a task to become a job. + * + * @param \App\Entities\Projects\Task $task + * @return \Illuminate\Routing\Redirector + */ + public function setAsJob(Task $task) + { + $oldJob = $task->job; + + $job = new Job; + $job->name = $task->name; + $job->description = $task->description; + $job->project_id = $oldJob->project_id; + $job->worker_id = $oldJob->worker_id; + + DB::beginTransaction(); + $job->save(); + $task->delete(); + DB::commit(); + + flash(__('task.upgraded_as_job'), 'success'); + + return redirect()->route('jobs.edit', $job); + } } diff --git a/resources/lang/id/task.php b/resources/lang/id/task.php index 28e79eb..69a9d12 100644 --- a/resources/lang/id/task.php +++ b/resources/lang/id/task.php @@ -22,6 +22,10 @@ return [ 'deleted' => 'Hapus data Task telah berhasil.', 'undeleted' => 'Data Task gagal dihapus.', + 'set_as_job' => 'Set Menjadi Job', + 'set_as_job_confirm' => 'Anda yakin mengubah task ini menjadi sebuah Job?', + 'upgraded_as_job' => 'Task telah menjadi Job.', + // Attributes 'name' => 'Nama Task', 'progress' => 'Progress', diff --git a/resources/views/jobs/partials/job-tasks-operation.blade.php b/resources/views/jobs/partials/job-tasks-operation.blade.php index 4887762..9d3b366 100644 --- a/resources/views/jobs/partials/job-tasks-operation.blade.php +++ b/resources/views/jobs/partials/job-tasks-operation.blade.php @@ -1,8 +1,20 @@ @if (Request::get('action') == 'task_edit' && $editableTask) @can('update', $editableTask) -{{ Form::model($editableTask, ['route' => ['tasks.update', $editableTask], 'method' => 'patch']) }}
-

{{ __('task.edit') }}

+
+
+ {!! FormField::formButton( + [ + 'route' => ['tasks.set-as-job', $editableTask], + 'onsubmit' => __('task.set_as_job_confirm'), + ], + __('task.set_as_job'), + ['class' => 'btn btn-success btn-xs', 'id' => 'set-as-job-'.$editableTask->id] + ) !!} +
+

{{ __('task.edit') }}

+
+ {{ Form::model($editableTask, ['route' => ['tasks.update', $editableTask], 'method' => 'patch']) }}
{!! FormField::text('name') !!}
@@ -29,8 +41,8 @@ {{ link_to_route('jobs.show', __('app.cancel'), [$job], ['class' => 'btn btn-default']) }}
- {{ Form::close() }}
+ {{ Form::close() }} @endcan @endif diff --git a/routes/web/projects.php b/routes/web/projects.php index 949d7fc..c51d41e 100644 --- a/routes/web/projects.php +++ b/routes/web/projects.php @@ -52,6 +52,7 @@ Route::group(['middleware' => ['auth'], 'namespace' => 'Projects'], function () Route::post('jobs/{job}/tasks', ['as' => 'tasks.store', 'uses' => 'TasksController@store']); Route::patch('tasks/{task}', ['as' => 'tasks.update', 'uses' => 'TasksController@update']); Route::delete('tasks/{task}', ['as' => 'tasks.destroy', 'uses' => 'TasksController@destroy']); + Route::post('tasks/{task}/set-as-job', ['as' => 'tasks.set-as-job', 'uses' => 'TasksController@setAsJob']); /* * Files Routes diff --git a/tests/Feature/ManageJobsTest.php b/tests/Feature/ManageJobsTest.php index 728aaf7..e3beefb 100644 --- a/tests/Feature/ManageJobsTest.php +++ b/tests/Feature/ManageJobsTest.php @@ -203,4 +203,40 @@ class ManageJobsTest extends TestCase $this->visit(route('jobs.index')); $this->seePageIs(route('jobs.index')); } + + /** @test */ + public function admin_can_upgrade_a_task_to_become_job() + { + $user = $this->adminUserSigningIn(); + + $project = factory(Project::class)->create(); + $job = factory(Job::class)->create([ + 'project_id' => $project->id, + 'type_id' => 1, + 'worker_id' => $user->id, + ]); + $task = factory(Task::class)->create([ + 'name' => 'This is a Task', + 'job_id' => $job->id, + 'description' => 'Task description.', + ]); + + $this->visitRoute('jobs.show', [$job, 'action' => 'task_edit', 'task_id' => $task->id]); + $this->seeRouteIs('jobs.show', [$job, 'action' => 'task_edit', 'task_id' => $task->id]); + $this->seeElement('button', ['id' => 'set-as-job-'.$task->id]); + + $this->press('set-as-job-'.$task->id); + + $newJob = Job::where('name', 'This is a Task')->first(); + $this->seeRouteIs('jobs.edit', $newJob); + + $this->seeInDatabase('jobs', [ + 'id' => $newJob->id, + 'name' => 'This is a Task', + 'description' => 'Task description.', + ]); + $this->dontSeeInDatabase('tasks', [ + 'id' => $task->id, + ]); + } }