From 97b188e942bea6dcb13acd42d3268bfebe00aa4a Mon Sep 17 00:00:00 2001 From: Twyco Date: Sat, 11 Apr 2026 17:42:43 +0200 Subject: [PATCH] Add project general settings danger zone --- app/Http/Controllers/ProjectController.php | 30 +++ resources/js/pages/projects/Access.vue | 19 +- resources/js/pages/projects/Index.vue | 7 + resources/js/pages/projects/Show.vue | 11 + .../js/pages/projects/settings/Board.vue | 11 + .../js/pages/projects/settings/General.vue | 216 ++++++++++++++++++ .../js/pages/projects/settings/Metadata.vue | 11 + .../pages/projects/settings/Repositories.vue | 11 + resources/js/types/page-props.ts | 6 + routes/web.php | 7 + .../Projects/ProjectControllerTest.php | 144 ++++++++++++ 11 files changed, 470 insertions(+), 3 deletions(-) create mode 100644 resources/js/pages/projects/settings/General.vue diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 5fa0fb4..a2bc009 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -12,6 +12,7 @@ use App\Models\User; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Arr; +use Illuminate\Validation\Rule; use Inertia\Inertia; use Inertia\Response; @@ -44,6 +45,7 @@ class ProjectController extends Controller return Inertia::render('projects/Index', [ 'projects' => $projectQuery ->get(), + 'status' => session('status'), ]); } @@ -76,6 +78,14 @@ class ProjectController extends Controller ]); } + public function general(Request $request, Project $project): Response + { + return Inertia::render('projects/settings/General', [ + 'project' => $project, + 'status' => session('status'), + ]); + } + public function access(Request $request, Project $project): Response { $user = $request->user(); @@ -146,4 +156,24 @@ class ProjectController extends Controller return to_route('projects.access', $project) ->with('status', "{$team->name} permissions were updated."); } + + public function destroy(Request $request, Project $project): RedirectResponse + { + $request->validate([ + 'confirmation_key' => [ + 'required', + 'string', + Rule::in([$project->key]), + ], + ], [ + 'confirmation_key.in' => 'Enter the exact project key to confirm deletion.', + ]); + + $projectName = $project->name; + + $project->delete(); + + return to_route('projects.index') + ->with('status', "Project {$projectName} was deleted."); + } } diff --git a/resources/js/pages/projects/Access.vue b/resources/js/pages/projects/Access.vue index 18e675a..69864fc 100644 --- a/resources/js/pages/projects/Access.vue +++ b/resources/js/pages/projects/Access.vue @@ -13,6 +13,7 @@ import { } from '@/components/ui/card'; import AppLayout from '@/layouts/AppLayout.vue'; import { access, index, show } from '@/routes/projects/index'; +import { general as generalSettings } from '@/routes/projects/settings'; import type { BreadcrumbItem, ProjectAccessPageProps } from '@/types'; const props = defineProps(); @@ -57,9 +58,21 @@ const hasPermission = ( /> - +
+ + + +
+
+ {{ status }} +
+
+ +
+ +
+ +
+ +