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 @@ + + + + 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 @@ -