diff --git a/app/Http/Controllers/TeamController.php b/app/Http/Controllers/TeamController.php index 3ee18c6..778326d 100644 --- a/app/Http/Controllers/TeamController.php +++ b/app/Http/Controllers/TeamController.php @@ -8,8 +8,10 @@ use App\Http\Requests\UpdateTeamRequest; use App\Http\Resources\TeamResource; use App\Models\Team; use Illuminate\Http\Request; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Inertia\Inertia; +use Str; class TeamController extends Controller { @@ -20,11 +22,10 @@ class TeamController extends Controller { return Inertia::render('team/Index', [ 'teams' => TeamResource::collection(Team::visibleTo(auth()->user())->get())->resolve($request), - 'canCreateTeam' => auth()->user()->can('create', Team::class), ]); } - public function show(Request$request, Team $team) + public function show(Request $request, Team $team) { return Inertia::render('team/Show', [ 'team' => TeamResource::make($team)->resolve($request), @@ -48,10 +49,12 @@ class TeamController extends Controller ); }); Inertia::flash('success', 'Team successfully created.'); + return to_route('teams.index'); } catch (\Exception $exception) { Inertia::flash('error', 'Team could not be created.'); DB::rollBack(); + return back(); } } @@ -64,9 +67,11 @@ class TeamController extends Controller /** * Show the form for editing the specified resource. */ - public function edit(Team $team) + public function edit(Request $request, Team $team) { - // + return Inertia::render('team/Edit', [ + 'team' => TeamResource::make($team)->resolve($request), + ]); } /** @@ -74,7 +79,19 @@ class TeamController extends Controller */ public function update(UpdateTeamRequest $request, Team $team) { - // + $validated = $request->validated(); + + try { + DB::transaction(function () use ($validated, $team) { + $team->update($validated); + }); + Inertia::flash('success', 'Team successfully updated.'); + + } catch (\Exception $exception) { + Inertia::flash('error', 'Team could not be updated.'); + DB::rollBack(); + } + return to_route('teams.show', $team); } /** @@ -84,4 +101,22 @@ class TeamController extends Controller { // } + + public function nameToSlug(Request $request) + { + $validated = $request->validate([ + 'name' => 'required|string|max:255', + 'ignored_slug' => 'nullable|string|max:255', + ]); + + $name = Arr::get($validated, 'name'); + $slug = Str::slug($name); + $ignoredSlug = Arr::get($validated, 'ignored_slug'); + + return response()->json([ + 'name' => $name, + 'slug' => $slug, + 'taken' => $slug !== $ignoredSlug && Team::whereSlug($slug)->exists(), + ]); + } } diff --git a/app/Http/Requests/StoreTeamRequest.php b/app/Http/Requests/StoreTeamRequest.php index f4f65b0..3352198 100644 --- a/app/Http/Requests/StoreTeamRequest.php +++ b/app/Http/Requests/StoreTeamRequest.php @@ -22,13 +22,6 @@ class StoreTeamRequest extends FormRequest ]; } - protected function prepareForValidation(): void - { - $this->merge([ - 'slug' => Str::slug($this->name), - ]); - } - public function messages(): array { return [ @@ -38,4 +31,11 @@ class StoreTeamRequest extends FormRequest 'slug.unique' => 'The name has already been taken.', ]; } + + protected function prepareForValidation(): void + { + $this->merge([ + 'slug' => Str::slug($this->name), + ]); + } } diff --git a/app/Http/Requests/UpdateTeamRequest.php b/app/Http/Requests/UpdateTeamRequest.php index ad7be4c..5263aa6 100644 --- a/app/Http/Requests/UpdateTeamRequest.php +++ b/app/Http/Requests/UpdateTeamRequest.php @@ -17,11 +17,21 @@ class UpdateTeamRequest extends FormRequest { return [ 'name' => ['nullable', 'string', 'max:255'], - 'slug' => ['nullable', 'required_if:name', 'string', 'max:255', 'unique:teams,slug,'.$this->route('team')->id], + 'slug' => ['nullable', 'required_with:name', 'string', 'max:255', 'unique:teams,slug,'.$this->route('team')->id], 'require_2fa' => ['required', 'boolean'], ]; } + public function messages(): array + { + return [ + 'slug.string' => '', + 'slug.required' => '', + 'slug.max' => '', + 'slug.unique' => 'The name has already been taken.', + ]; + } + protected function prepareForValidation(): void { $this->merge([ diff --git a/resources/js/components/TeamSlug.vue b/resources/js/components/TeamSlug.vue new file mode 100644 index 0000000..53d7843 --- /dev/null +++ b/resources/js/components/TeamSlug.vue @@ -0,0 +1,53 @@ + + + + + Slug + + + + + diff --git a/resources/js/pages/team/Create.vue b/resources/js/pages/team/Create.vue index 73b7fae..591fbeb 100644 --- a/resources/js/pages/team/Create.vue +++ b/resources/js/pages/team/Create.vue @@ -1,12 +1,14 @@ - @@ -38,25 +46,25 @@ function submit(): void { - + Name - + - + Require 2FA - + Erstellen diff --git a/resources/js/pages/team/Edit.vue b/resources/js/pages/team/Edit.vue index 809cc24..3a9cb70 100644 --- a/resources/js/pages/team/Edit.vue +++ b/resources/js/pages/team/Edit.vue @@ -1,55 +1,61 @@ - + - + Name - - - + + + Require 2FA - + - - + + Speichern diff --git a/resources/js/pages/team/Index.vue b/resources/js/pages/team/Index.vue index 367fb8b..6875fe2 100644 --- a/resources/js/pages/team/Index.vue +++ b/resources/js/pages/team/Index.vue @@ -21,7 +21,6 @@ defineOptions({ defineProps<{ teams: Team[]; - canCreateTeam: boolean; }>(); const user = usePage().props.auth.user; @@ -37,7 +36,7 @@ const canManageTeam = (team: Team) => - + diff --git a/resources/js/pages/team/Show.vue b/resources/js/pages/team/Show.vue index 3319a04..9818c3a 100644 --- a/resources/js/pages/team/Show.vue +++ b/resources/js/pages/team/Show.vue @@ -32,7 +32,7 @@ setLayoutProps({ - + Bearbeiten diff --git a/routes/web.php b/routes/web.php index cfc38c9..606cd85 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,11 +10,12 @@ Route::middleware(['auth'])->group(function () { Route::controller(TeamController::class)->prefix('teams')->name('teams.')->group(function () { Route::get('/', 'index')->name('index'); - Route::middleware('verified')->get('/create', 'create')->name('create'); - Route::middleware('verified')->post('/', 'store')->name('store'); + Route::get('/create', 'create')->name('create'); + Route::post('/', 'store')->name('store'); Route::get('/{team:slug}', 'show')->name('show'); Route::get('/edit/{team:slug}', 'edit')->name('edit'); - Route::patch('/{team:slug}', 'patch')->name('patch'); + Route::patch('/{team:slug}', 'update')->name('update'); + Route::post('/name-to-slug', 'nameToSlug')->name('nameToSlug'); }); });