feat: overhaul project workspace navigation
linter / quality (pull_request) Successful in 1m28s
tests / ci (8.4) (pull_request) Successful in 1m47s

This commit is contained in:
2026-07-18 17:52:25 +02:00
parent a46695c2eb
commit ff796aa10a
45 changed files with 1790 additions and 995 deletions
@@ -10,8 +10,8 @@ use App\Actions\ProjectBoard\StoreTicketStatus;
use App\Actions\ProjectBoard\UpdateBoardColumn;
use App\Actions\ProjectBoard\UpdateTicketStatus;
use App\Actions\ProjectBoard\UpdateTicketStatusTransitions;
use App\Actions\Projects\BuildProjectBoardSettingsPayload;
use App\Enums\Permission;
use App\Enums\ProjectSettingsSection;
use App\Http\Requests\StoreBoardColumnRequest;
use App\Http\Requests\StoreTicketStatusRequest;
use App\Http\Requests\UpdateBoardColumnRequest;
@@ -22,13 +22,10 @@ use App\Models\Project;
use App\Models\TicketStatus;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
class ProjectBoardSettingsController extends Controller
{
public function __construct(
private readonly BuildProjectBoardSettingsPayload $buildProjectBoardSettingsPayload,
private readonly DeleteBoardColumn $deleteBoardColumn,
private readonly DeleteTicketStatus $deleteTicketStatus,
private readonly PermissionService $permissionService,
@@ -39,19 +36,6 @@ class ProjectBoardSettingsController extends Controller
private readonly UpdateTicketStatusTransitions $updateTicketStatusTransitions,
) {}
public function show(Request $request, Project $project): Response
{
abort_unless(
$this->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,
@@ -62,7 +46,7 @@ class ProjectBoardSettingsController extends Controller
);
$boardColumn = $this->storeBoardColumn->handle($project, $request->validated());
return to_route('projects.settings.board', $project)
return $this->settingsRedirect($project)
->with('status', "{$boardColumn->name} was added to the board workflow.");
}
@@ -77,7 +61,7 @@ class ProjectBoardSettingsController extends Controller
);
$boardColumn = $this->updateBoardColumn->handle($project, $boardColumn, $request->validated());
return to_route('projects.settings.board', $project)
return $this->settingsRedirect($project)
->with('status', "{$boardColumn->fresh()->name} was updated.");
}
@@ -93,7 +77,7 @@ class ProjectBoardSettingsController extends Controller
$deletedName = $this->deleteBoardColumn->handle($project, $boardColumn);
return to_route('projects.settings.board', $project)
return $this->settingsRedirect($project)
->with('status', "{$deletedName} was removed from the board workflow.");
}
@@ -107,7 +91,7 @@ class ProjectBoardSettingsController extends Controller
);
$ticketStatus = $this->storeTicketStatus->handle($project, $request->validated());
return to_route('projects.settings.board', $project)
return $this->settingsRedirect($project)
->with('status', "{$ticketStatus->name} was added to {$this->statusContextLabel($ticketStatus)}.");
}
@@ -122,7 +106,7 @@ class ProjectBoardSettingsController extends Controller
);
$ticketStatus = $this->updateTicketStatus->handle($ticketStatus, $request->validated());
return to_route('projects.settings.board', $project)
return $this->settingsRedirect($project)
->with('status', "{$ticketStatus->fresh()->name} was updated.");
}
@@ -138,7 +122,7 @@ class ProjectBoardSettingsController extends Controller
$result = $this->deleteTicketStatus->handle($project, $ticketStatus);
return to_route('projects.settings.board', $project)
return $this->settingsRedirect($project)
->with('status', "{$result['deleted_name']} was removed from {$result['context_label']}.");
}
@@ -153,7 +137,7 @@ class ProjectBoardSettingsController extends Controller
);
$this->updateTicketStatusTransitions->handle($ticketStatus, $request->validated());
return to_route('projects.settings.board', $project)
return $this->settingsRedirect($project)
->with('status', "{$ticketStatus->name} move targets were updated.");
}
@@ -161,4 +145,12 @@ class ProjectBoardSettingsController extends Controller
{
return $ticketStatus->boardColumn?->name ?? 'Backlog';
}
private function settingsRedirect(Project $project): RedirectResponse
{
return to_route('projects.settings.index', [
'project' => $project,
'section' => ProjectSettingsSection::Board->value,
]);
}
}