permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); return Inertia::render( 'projects/settings/Board', $this->buildProjectBoardSettingsPayload->handle($project, session('status')), ); } public function store( StoreBoardColumnRequest $request, Project $project, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); $boardColumn = $this->storeBoardColumn->handle($project, $request->validated()); return to_route('projects.settings.board', $project) ->with('status', "{$boardColumn->name} was added to the board workflow."); } public function update( UpdateBoardColumnRequest $request, Project $project, BoardColumn $boardColumn, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); $boardColumn = $this->updateBoardColumn->handle($project, $boardColumn, $request->validated()); return to_route('projects.settings.board', $project) ->with('status', "{$boardColumn->fresh()->name} was updated."); } public function destroy( Request $request, Project $project, BoardColumn $boardColumn, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); $deletedName = $this->deleteBoardColumn->handle($project, $boardColumn); return to_route('projects.settings.board', $project) ->with('status', "{$deletedName} was removed from the board workflow."); } public function storeStatus( StoreTicketStatusRequest $request, Project $project, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); $ticketStatus = $this->storeTicketStatus->handle($project, $request->validated()); return to_route('projects.settings.board', $project) ->with('status', "{$ticketStatus->name} was added to {$this->statusContextLabel($ticketStatus)}."); } public function updateStatus( UpdateTicketStatusRequest $request, Project $project, TicketStatus $ticketStatus, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); $ticketStatus = $this->updateTicketStatus->handle($ticketStatus, $request->validated()); return to_route('projects.settings.board', $project) ->with('status', "{$ticketStatus->fresh()->name} was updated."); } public function destroyStatus( Request $request, Project $project, TicketStatus $ticketStatus, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); $result = $this->deleteTicketStatus->handle($project, $ticketStatus); return to_route('projects.settings.board', $project) ->with('status', "{$result['deleted_name']} was removed from {$result['context_label']}."); } public function updateStatusTransitions( UpdateTicketStatusTransitionsRequest $request, Project $project, TicketStatus $ticketStatus, ): RedirectResponse { abort_unless( $this->permissionService->allows($request->user(), Permission::ProjectAdmin, $project), 403, ); $this->updateTicketStatusTransitions->handle($ticketStatus, $request->validated()); return to_route('projects.settings.board', $project) ->with('status', "{$ticketStatus->name} move targets were updated."); } private function statusContextLabel(TicketStatus $ticketStatus): string { return $ticketStatus->boardColumn?->name ?? 'Backlog'; } }