From 744308d0cb4bb6494965aaa26f2332ff94f37f79 Mon Sep 17 00:00:00 2001 From: unurled Date: Thu, 3 Jul 2025 20:18:53 +0200 Subject: [PATCH] Add create and show page for competition --- app/Http/Controllers/TournamentController.php | 18 ---- app/Models/Competition.php | 1 - app/Providers/AppServiceProvider.php | 12 +++ components.json | 4 +- ...00001_create_competition_system_tables.php | 22 +++-- resources/js/pages/Home.svelte | 84 +++++++++---------- resources/js/pages/tournaments/Create.svelte | 1 - resources/js/pages/tournaments/Show.svelte | 55 ++++++++++++ resources/js/types/index.d.ts | 24 ++++++ routes/web.php | 2 +- 10 files changed, 151 insertions(+), 72 deletions(-) create mode 100644 resources/js/pages/tournaments/Show.svelte diff --git a/app/Http/Controllers/TournamentController.php b/app/Http/Controllers/TournamentController.php index 842607b..462744e 100644 --- a/app/Http/Controllers/TournamentController.php +++ b/app/Http/Controllers/TournamentController.php @@ -39,14 +39,8 @@ class TournamentController extends Controller 'description' => 'nullable|string', 'location' => 'nullable|string|max:255', 'start_date' => 'required|date', - 'end_date' => 'required|date|after_or_equal:start_date', - 'registration_deadline' => 'nullable|date|before_or_equal:start_date', 'max_teams' => 'nullable|integer|min:2', 'status' => 'required|in:draft,public,private', - 'team_ids' => 'nullable|array', - 'team_ids.*' => 'exists:teams,id', - 'field_ids' => 'nullable|array', - 'field_ids.*' => 'exists:fields,id', ]); if ($validator->fails()) { @@ -59,23 +53,11 @@ class TournamentController extends Controller $tournament->description = $request->description; $tournament->location = $request->location; $tournament->start_date = $request->start_date; - $tournament->end_date = $request->end_date; - $tournament->registration_deadline = $request->registration_deadline; $tournament->max_teams = $request->max_teams; $tournament->status = $request->status; $tournament->owner = Auth::id(); $tournament->save(); - // Associate teams with the tournament - if ($request->has('team_ids') && is_array($request->team_ids)) { - $tournament->teams()->attach($request->team_ids, ['status' => 'confirmed']); - } - - // Associate fields with the tournament - if ($request->has('field_ids') && is_array($request->field_ids)) { - $tournament->fields()->attach($request->field_ids); - } - // Create a default scheduling mode $schedulingMode = new SchedulingMode(); $schedulingMode->competition_id = $tournament->id; diff --git a/app/Models/Competition.php b/app/Models/Competition.php index cafaad1..b1f198c 100644 --- a/app/Models/Competition.php +++ b/app/Models/Competition.php @@ -20,7 +20,6 @@ class Competition extends Model 'name', 'description', 'start_date', - 'end_date', 'status', 'location', 'max_teams', diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 4c3ce23..acf96dd 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -4,7 +4,9 @@ namespace App\Providers; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Blade; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Event; +use Illuminate\Support\Facades\Log; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -65,5 +67,15 @@ class AppServiceProvider extends ServiceProvider return false; }); + + DB::listen(function ($query) { + Log::info( + $query->sql, + [ + 'bindings' => $query->bindings, + 'time' => $query->time, + ] + ); + }); } } diff --git a/components.json b/components.json index c10d90f..df39915 100644 --- a/components.json +++ b/components.json @@ -1,5 +1,5 @@ { - "$schema": "https://next.shadcn-svelte.com/schema.json", + "$schema": "https://shadcn-svelte.com/schema.json", "tailwind": { "css": "resources/css/app.css", "baseColor": "neutral" @@ -12,5 +12,5 @@ "lib": "@/lib" }, "typescript": true, - "registry": "https://next.shadcn-svelte.com/registry" + "registry": "https://shadcn-svelte.com/registry" } diff --git a/database/migrations/2025_06_24_000001_create_competition_system_tables.php b/database/migrations/2025_06_24_000001_create_competition_system_tables.php index 90d735c..ba754ed 100644 --- a/database/migrations/2025_06_24_000001_create_competition_system_tables.php +++ b/database/migrations/2025_06_24_000001_create_competition_system_tables.php @@ -17,7 +17,6 @@ return new class extends Migration $table->string('name'); $table->text('description')->nullable(); $table->date('start_date'); - $table->date('end_date'); $table->string('status')->default('planned'); $table->string('location')->nullable(); $table->integer('max_teams')->default(0); @@ -31,6 +30,11 @@ return new class extends Migration $table->id(); $table->string('name'); $table->text('description')->nullable(); + $table->integer('competition_id')->nullable(); + $table->string('algorithm')->default('round_robin'); + $table->json('config')->nullable(); + $table->integer('sequence_order')->default(1); + $table->string('status')->default('active'); $table->timestamps(); }); @@ -48,6 +52,13 @@ return new class extends Migration $table->timestamps(); }); + Schema::create('competition_field', function (Blueprint $table) { + $table->id(); + $table->foreignId('competition_id')->constrained('competitions')->onDelete('cascade'); + $table->foreignId('field_id')->constrained('fields')->onDelete('cascade'); + $table->timestamps(); + }); + // Create teams table Schema::create('teams', function (Blueprint $table) { $table->id(); @@ -59,12 +70,11 @@ return new class extends Migration $table->timestamps(); }); - // Create team members table - Schema::create('team_members', function (Blueprint $table) { + Schema::create('competition_team', function (Blueprint $table) { $table->id(); + $table->foreignId('competition_id')->constrained('competitions')->onDelete('cascade'); $table->foreignId('team_id')->constrained('teams')->onDelete('cascade'); - $table->foreignId('user_id')->constrained('users')->onDelete('cascade'); - $table->string('role')->default('member'); + $table->string('status')->default('confirmed'); $table->timestamps(); }); @@ -103,7 +113,7 @@ return new class extends Migration { Schema::dropIfExists('break_periods'); Schema::dropIfExists('matches'); - Schema::dropIfExists('team_members'); + Schema::dropIfExists('competition_team'); Schema::dropIfExists('teams'); Schema::dropIfExists('fields'); Schema::dropIfExists('scheduling_modes'); diff --git a/resources/js/pages/Home.svelte b/resources/js/pages/Home.svelte index 2aeeb4b..f11f758 100644 --- a/resources/js/pages/Home.svelte +++ b/resources/js/pages/Home.svelte @@ -87,11 +87,11 @@
- {formatDate(tournament.date)} + {formatDate(tournament.start_date)}
- {tournament.participantsCount} participants + {tournament.max_teams} participants
@@ -107,7 +107,7 @@ -
+
{#if !userTournaments.original.data || userTournaments.original.data.length === 0}
@@ -118,47 +118,45 @@
{:else} -
- {#each userTournaments.original.data as tournament (tournament.id)} - - - - - {tournament.name} - - {tournament.description} - - -
-
- - {formatDate(tournament.date)} -
-
- - {tournament.participantsCount} participants -
-
- - Created by you -
+ {#each userTournaments.original.data as tournament (tournament.id)} + + + + + {tournament.name} + + {tournament.description} + + +
+
+ + {formatDate(tournament.start_date)}
- - - - - - - {/each} -
+
+ + {tournament.max_teams} participants +
+
+ + Created by you +
+
+
+ + + + +
+ {/each} {/if}
diff --git a/resources/js/pages/tournaments/Create.svelte b/resources/js/pages/tournaments/Create.svelte index acc03f8..c431580 100644 --- a/resources/js/pages/tournaments/Create.svelte +++ b/resources/js/pages/tournaments/Create.svelte @@ -72,7 +72,6 @@

Create New Tournament

-
diff --git a/resources/js/pages/tournaments/Show.svelte b/resources/js/pages/tournaments/Show.svelte new file mode 100644 index 0000000..7bbfb8d --- /dev/null +++ b/resources/js/pages/tournaments/Show.svelte @@ -0,0 +1,55 @@ + + + + {JSON.stringify(tournament)} + + + + Teams + + + + + + Name + Actions + + + + {#each tournament.teams as team (team)} + + {JSON.stringify(team)} + + + + + + {/each} + + + + + + + + + + diff --git a/resources/js/types/index.d.ts b/resources/js/types/index.d.ts index e2abcaf..d20f556 100644 --- a/resources/js/types/index.d.ts +++ b/resources/js/types/index.d.ts @@ -44,3 +44,27 @@ export interface Permission { description: string; is_wildcard: boolean; } + +export enum Status { + DRAFT = 'draft', + PUBLIC = 'public', + PRIVATE = 'private', +} + +export interface Tournament { + id: number; + name: string; + description?: string; + start_date: string; + status: Status; + location?: string; + max_teams: number; + current_scheduling_mode_id?: number; + owner: string; + created_at: string; + updated_at: string; + teams: object[]; + fields: object[]; + matches: object[]; + break_periods: object[]; +} diff --git a/routes/web.php b/routes/web.php index 3f8fc73..24d88fe 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,7 +11,7 @@ Route::get('/', function () { $user = Auth::user(); $userTournaments = []; if ($user) { - $userTournaments = Inertia::defer(fn() => CompetitionController::getUser($user, 1, 10)); + $userTournaments = Inertia::defer(fn() => CompetitionController::getUser($user, 0, 10)); } return Inertia::render('Home', [ 'publicTournaments' => Inertia::defer(fn() => CompetitionController::getPublics(1, 10)),