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> */ 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."); } }