87 lines
2.3 KiB
PHP
87 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Controllers\Concerns\SyncsChartExclusions;
|
|
use App\Models\Project;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
|
|
class ProjectController extends Controller
|
|
{
|
|
use SyncsChartExclusions;
|
|
|
|
public function index(Request $request): View
|
|
{
|
|
$projects = $request->user()->projects()
|
|
->withCount('entries')
|
|
->with('latestEntry', 'team', 'category')
|
|
->orderBy('name')
|
|
->get();
|
|
|
|
return view('projects.index', ['projects' => $projects]);
|
|
}
|
|
|
|
public function create(): View
|
|
{
|
|
return view('projects.create');
|
|
}
|
|
|
|
public function store(Request $request): RedirectResponse
|
|
{
|
|
$data = $request->validate(Project::validationRules($request->user()) + $this->chartRules());
|
|
|
|
$project = $request->user()->projects()->create($data);
|
|
$this->syncChartExclusions($request, $project);
|
|
|
|
return redirect()
|
|
->route('projects.entries.index', $project)
|
|
->with('status', "Project \"{$project->name}\" created. Add your first status entry below.");
|
|
}
|
|
|
|
public function edit(Project $project): View
|
|
{
|
|
$this->authorize('update', $project);
|
|
|
|
return view('projects.edit', ['project' => $project]);
|
|
}
|
|
|
|
public function update(Request $request, Project $project): RedirectResponse
|
|
{
|
|
$this->authorize('update', $project);
|
|
|
|
$data = $request->validate(Project::validationRules($project->user) + $this->chartRules());
|
|
|
|
$project->update($data);
|
|
$this->syncChartExclusions($request, $project);
|
|
|
|
return redirect()
|
|
->route('projects.index')
|
|
->with('status', "Project \"{$project->name}\" updated.");
|
|
}
|
|
|
|
/**
|
|
* @return array<string, array<int, string>>
|
|
*/
|
|
private function chartRules(): array
|
|
{
|
|
return [
|
|
'charts' => ['nullable', 'array'],
|
|
'charts.*' => ['integer'],
|
|
];
|
|
}
|
|
|
|
public function destroy(Project $project): RedirectResponse
|
|
{
|
|
$this->authorize('delete', $project);
|
|
|
|
$name = $project->name;
|
|
$project->delete();
|
|
|
|
return redirect()
|
|
->route('projects.index')
|
|
->with('status', "Project \"{$name}\" and all its entries deleted.");
|
|
}
|
|
}
|