From e952c060f31cbcafdc094feb0fa8cdda38a8be2c Mon Sep 17 00:00:00 2001 From: Alexander Gabriel Date: Tue, 12 May 2026 20:23:45 +0000 Subject: [PATCH] =?UTF-8?q?=C3=A4nderungen=20zuammengef=C3=BChrt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Filament/Resources/Belts/BeltResource.php | 57 ++++++++++ .../Resources/Belts/Pages/CreateBelt.php | 11 ++ .../Resources/Belts/Pages/EditBelt.php | 19 ++++ .../Resources/Belts/Pages/ListBelts.php | 19 ++++ .../CoursesRelationManager.php | 67 +++++++++++ .../Resources/Belts/Schemas/BeltForm.php | 18 +++ .../Resources/Belts/Tables/BeltsTable.php | 41 +++++++ .../Resources/Courses/CourseResource.php | 65 +++++++++++ .../Resources/Courses/Pages/CreateCourse.php | 11 ++ .../Resources/Courses/Pages/EditCourse.php | 21 ++++ .../Resources/Courses/Pages/ListCourses.php | 19 ++++ .../Resources/Courses/Pages/ViewCourse.php | 19 ++++ .../RelationManagers/KidsRelationManager.php | 103 +++++++++++++++++ .../Resources/Courses/Schemas/CourseForm.php | 21 ++++ .../Courses/Schemas/CourseInfolist.php | 25 +++++ .../Resources/Courses/Tables/CoursesTable.php | 45 ++++++++ app/Filament/Resources/Kids/KidResource.php | 65 +++++++++++ .../Resources/Kids/Pages/CreateKid.php | 11 ++ app/Filament/Resources/Kids/Pages/EditKid.php | 21 ++++ .../Resources/Kids/Pages/ListKids.php | 19 ++++ app/Filament/Resources/Kids/Pages/ViewKid.php | 19 ++++ .../CoursesRelationManager.php | 104 ++++++++++++++++++ .../Resources/Kids/Schemas/KidForm.php | 21 ++++ .../Resources/Kids/Schemas/KidInfolist.php | 26 +++++ .../Resources/Kids/Tables/KidsTable.php | 45 ++++++++ app/Models/Belt.php | 17 +++ app/Models/Course.php | 23 ++++ app/Models/Kid.php | 16 +++ .../2026_04_29_133058_create_kids_table.php | 29 +++++ ...2026_04_29_141409_create_courses_table.php | 29 +++++ .../2026_04_29_142730_create_course_kid.php | 32 ++++++ .../2026_04_29_151224_create_belts_table.php | 28 +++++ ..._04_29_152036_create_belt_course_table.php | 31 ++++++ 33 files changed, 1097 insertions(+) create mode 100644 app/Filament/Resources/Belts/BeltResource.php create mode 100644 app/Filament/Resources/Belts/Pages/CreateBelt.php create mode 100644 app/Filament/Resources/Belts/Pages/EditBelt.php create mode 100644 app/Filament/Resources/Belts/Pages/ListBelts.php create mode 100644 app/Filament/Resources/Belts/RelationManagers/CoursesRelationManager.php create mode 100644 app/Filament/Resources/Belts/Schemas/BeltForm.php create mode 100644 app/Filament/Resources/Belts/Tables/BeltsTable.php create mode 100644 app/Filament/Resources/Courses/CourseResource.php create mode 100644 app/Filament/Resources/Courses/Pages/CreateCourse.php create mode 100644 app/Filament/Resources/Courses/Pages/EditCourse.php create mode 100644 app/Filament/Resources/Courses/Pages/ListCourses.php create mode 100644 app/Filament/Resources/Courses/Pages/ViewCourse.php create mode 100644 app/Filament/Resources/Courses/RelationManagers/KidsRelationManager.php create mode 100644 app/Filament/Resources/Courses/Schemas/CourseForm.php create mode 100644 app/Filament/Resources/Courses/Schemas/CourseInfolist.php create mode 100644 app/Filament/Resources/Courses/Tables/CoursesTable.php create mode 100644 app/Filament/Resources/Kids/KidResource.php create mode 100644 app/Filament/Resources/Kids/Pages/CreateKid.php create mode 100644 app/Filament/Resources/Kids/Pages/EditKid.php create mode 100644 app/Filament/Resources/Kids/Pages/ListKids.php create mode 100644 app/Filament/Resources/Kids/Pages/ViewKid.php create mode 100644 app/Filament/Resources/Kids/RelationManagers/CoursesRelationManager.php create mode 100644 app/Filament/Resources/Kids/Schemas/KidForm.php create mode 100644 app/Filament/Resources/Kids/Schemas/KidInfolist.php create mode 100644 app/Filament/Resources/Kids/Tables/KidsTable.php create mode 100644 app/Models/Belt.php create mode 100644 app/Models/Course.php create mode 100644 app/Models/Kid.php create mode 100644 database/migrations/2026_04_29_133058_create_kids_table.php create mode 100644 database/migrations/2026_04_29_141409_create_courses_table.php create mode 100644 database/migrations/2026_04_29_142730_create_course_kid.php create mode 100644 database/migrations/2026_04_29_151224_create_belts_table.php create mode 100644 database/migrations/2026_04_29_152036_create_belt_course_table.php diff --git a/app/Filament/Resources/Belts/BeltResource.php b/app/Filament/Resources/Belts/BeltResource.php new file mode 100644 index 0000000..c7f925a --- /dev/null +++ b/app/Filament/Resources/Belts/BeltResource.php @@ -0,0 +1,57 @@ + ListBelts::route('/'), + 'create' => CreateBelt::route('/create'), + 'edit' => EditBelt::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Belts/Pages/CreateBelt.php b/app/Filament/Resources/Belts/Pages/CreateBelt.php new file mode 100644 index 0000000..4aa6be7 --- /dev/null +++ b/app/Filament/Resources/Belts/Pages/CreateBelt.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('duration') + ->required() + ->numeric(), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('name') + ->columns([ + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('name') + ->searchable(), + TextColumn::make('duration') + ->numeric() + ->sortable(), + ]) + ->filters([ + // + ]) + ->headerActions([ + AttachAction::make()->preloadRecordSelect(), + ]) + ->recordActions([ + DetachAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DetachBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Belts/Schemas/BeltForm.php b/app/Filament/Resources/Belts/Schemas/BeltForm.php new file mode 100644 index 0000000..c1edc14 --- /dev/null +++ b/app/Filament/Resources/Belts/Schemas/BeltForm.php @@ -0,0 +1,18 @@ +components([ + TextInput::make('name') + ->required(), + ]); + } +} diff --git a/app/Filament/Resources/Belts/Tables/BeltsTable.php b/app/Filament/Resources/Belts/Tables/BeltsTable.php new file mode 100644 index 0000000..68cc419 --- /dev/null +++ b/app/Filament/Resources/Belts/Tables/BeltsTable.php @@ -0,0 +1,41 @@ +columns([ + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('name') + ->searchable(), + ]) + ->filters([ + // + ]) + ->recordActions([ + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Courses/CourseResource.php b/app/Filament/Resources/Courses/CourseResource.php new file mode 100644 index 0000000..e26c4df --- /dev/null +++ b/app/Filament/Resources/Courses/CourseResource.php @@ -0,0 +1,65 @@ + ListCourses::route('/'), + 'create' => CreateCourse::route('/create'), + 'view' => ViewCourse::route('/{record}'), + 'edit' => EditCourse::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Courses/Pages/CreateCourse.php b/app/Filament/Resources/Courses/Pages/CreateCourse.php new file mode 100644 index 0000000..e3cb17c --- /dev/null +++ b/app/Filament/Resources/Courses/Pages/CreateCourse.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('email') + ->label('Email address') + ->email(), + ]); + } + + public function infolist(Schema $schema): Schema + { + return $schema + ->components([ + TextEntry::make('created_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('updated_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('name'), + TextEntry::make('email') + ->label('Email address') + ->placeholder('-'), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('name') + ->columns([ + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('name') + ->searchable(), + TextColumn::make('email') + ->label('Email address') + ->searchable(), + ]) + ->filters([ + // + ]) + ->headerActions([ + CreateAction::make(), + AttachAction::make() + ->form(fn (AttachAction $action): array => [ + $action->getRecordSelect(), + DatePicker::make('date')->required(), + ])->preloadRecordSelect() + ]) + ->recordActions([ + ViewAction::make(), + EditAction::make(), + DetachAction::make(), + DeleteAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DetachBulkAction::make(), + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Courses/Schemas/CourseForm.php b/app/Filament/Resources/Courses/Schemas/CourseForm.php new file mode 100644 index 0000000..bbf3f71 --- /dev/null +++ b/app/Filament/Resources/Courses/Schemas/CourseForm.php @@ -0,0 +1,21 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('duration') + ->required() + ->numeric(), + ]); + } +} diff --git a/app/Filament/Resources/Courses/Schemas/CourseInfolist.php b/app/Filament/Resources/Courses/Schemas/CourseInfolist.php new file mode 100644 index 0000000..8f58202 --- /dev/null +++ b/app/Filament/Resources/Courses/Schemas/CourseInfolist.php @@ -0,0 +1,25 @@ +components([ + TextEntry::make('created_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('updated_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('name'), + TextEntry::make('duration') + ->numeric(), + ]); + } +} diff --git a/app/Filament/Resources/Courses/Tables/CoursesTable.php b/app/Filament/Resources/Courses/Tables/CoursesTable.php new file mode 100644 index 0000000..c8fb217 --- /dev/null +++ b/app/Filament/Resources/Courses/Tables/CoursesTable.php @@ -0,0 +1,45 @@ +columns([ + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('name') + ->searchable(), + TextColumn::make('duration') + ->numeric() + ->sortable(), + ]) + ->filters([ + // + ]) + ->recordActions([ + ViewAction::make(), + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Kids/KidResource.php b/app/Filament/Resources/Kids/KidResource.php new file mode 100644 index 0000000..15800db --- /dev/null +++ b/app/Filament/Resources/Kids/KidResource.php @@ -0,0 +1,65 @@ + ListKids::route('/'), + 'create' => CreateKid::route('/create'), + 'view' => ViewKid::route('/{record}'), + 'edit' => EditKid::route('/{record}/edit'), + ]; + } +} diff --git a/app/Filament/Resources/Kids/Pages/CreateKid.php b/app/Filament/Resources/Kids/Pages/CreateKid.php new file mode 100644 index 0000000..b257463 --- /dev/null +++ b/app/Filament/Resources/Kids/Pages/CreateKid.php @@ -0,0 +1,11 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('duration') + ->required() + ->numeric(), + DatePicker::make('date') + ]); + } + + public function infolist(Schema $schema): Schema + { + return $schema + ->components([ + TextEntry::make('created_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('updated_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('name'), + TextEntry::make('duration') + ->numeric(), + ]); + } + + public function table(Table $table): Table + { + return $table + ->recordTitleAttribute('name') + ->columns([ + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('name') + ->searchable(), + TextColumn::make('date') + ->searchable(), + TextColumn::make('duration') + ->numeric() + ->sortable(), + ]) + ->filters([ + // + ]) + ->headerActions([ + AttachAction::make() + ->schema(fn (AttachAction $action): array => [ + $action->getRecordSelect(), + DatePicker::make('date')->required(), + ])->preloadRecordSelect() + ]) + ->recordActions([ + ViewAction::make(), + EditAction::make(), + DetachAction::make(), + DeleteAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DetachBulkAction::make(), + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Filament/Resources/Kids/Schemas/KidForm.php b/app/Filament/Resources/Kids/Schemas/KidForm.php new file mode 100644 index 0000000..d409146 --- /dev/null +++ b/app/Filament/Resources/Kids/Schemas/KidForm.php @@ -0,0 +1,21 @@ +components([ + TextInput::make('name') + ->required(), + TextInput::make('email') + ->label('Email address') + ->email(), + ]); + } +} diff --git a/app/Filament/Resources/Kids/Schemas/KidInfolist.php b/app/Filament/Resources/Kids/Schemas/KidInfolist.php new file mode 100644 index 0000000..e016d32 --- /dev/null +++ b/app/Filament/Resources/Kids/Schemas/KidInfolist.php @@ -0,0 +1,26 @@ +components([ + TextEntry::make('created_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('updated_at') + ->dateTime() + ->placeholder('-'), + TextEntry::make('name'), + TextEntry::make('email') + ->label('Email address') + ->placeholder('-'), + ]); + } +} diff --git a/app/Filament/Resources/Kids/Tables/KidsTable.php b/app/Filament/Resources/Kids/Tables/KidsTable.php new file mode 100644 index 0000000..4c50624 --- /dev/null +++ b/app/Filament/Resources/Kids/Tables/KidsTable.php @@ -0,0 +1,45 @@ +columns([ + TextColumn::make('created_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('updated_at') + ->dateTime() + ->sortable() + ->toggleable(isToggledHiddenByDefault: true), + TextColumn::make('name') + ->searchable(), + TextColumn::make('email') + ->label('Email address') + ->searchable(), + ]) + ->filters([ + // + ]) + ->recordActions([ + ViewAction::make(), + EditAction::make(), + ]) + ->toolbarActions([ + BulkActionGroup::make([ + DeleteBulkAction::make(), + ]), + ]); + } +} diff --git a/app/Models/Belt.php b/app/Models/Belt.php new file mode 100644 index 0000000..4f6fd1f --- /dev/null +++ b/app/Models/Belt.php @@ -0,0 +1,17 @@ +belongsToMany(Course::class); + } + +} diff --git a/app/Models/Course.php b/app/Models/Course.php new file mode 100644 index 0000000..4f4d407 --- /dev/null +++ b/app/Models/Course.php @@ -0,0 +1,23 @@ +belongsToMany(Kid::class)->withPivot("date"); + } + + public function belts(): BelongsToMany + { + return $this->belongsToMany(Belt::class); + } + +} diff --git a/app/Models/Kid.php b/app/Models/Kid.php new file mode 100644 index 0000000..57bafd0 --- /dev/null +++ b/app/Models/Kid.php @@ -0,0 +1,16 @@ +belongsToMany(Course::class)->withPivot("date"); + } +} diff --git a/database/migrations/2026_04_29_133058_create_kids_table.php b/database/migrations/2026_04_29_133058_create_kids_table.php new file mode 100644 index 0000000..0501ac9 --- /dev/null +++ b/database/migrations/2026_04_29_133058_create_kids_table.php @@ -0,0 +1,29 @@ +id(); + $table->timestamps(); + $table->string("name"); + $table->string("email")->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('kids'); + } +}; diff --git a/database/migrations/2026_04_29_141409_create_courses_table.php b/database/migrations/2026_04_29_141409_create_courses_table.php new file mode 100644 index 0000000..1308b28 --- /dev/null +++ b/database/migrations/2026_04_29_141409_create_courses_table.php @@ -0,0 +1,29 @@ +id(); + $table->timestamps(); + $table->string("name"); + $table->integer("duration"); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('courses'); + } +}; diff --git a/database/migrations/2026_04_29_142730_create_course_kid.php b/database/migrations/2026_04_29_142730_create_course_kid.php new file mode 100644 index 0000000..3f3d070 --- /dev/null +++ b/database/migrations/2026_04_29_142730_create_course_kid.php @@ -0,0 +1,32 @@ +id(); + $table->timestamps(); + $table->foreignIdFor(Kid::class); + $table->foreignIdFor(Course::class); + $table->date("date")->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('course_kid'); + } +}; diff --git a/database/migrations/2026_04_29_151224_create_belts_table.php b/database/migrations/2026_04_29_151224_create_belts_table.php new file mode 100644 index 0000000..5d91fc4 --- /dev/null +++ b/database/migrations/2026_04_29_151224_create_belts_table.php @@ -0,0 +1,28 @@ +id(); + $table->timestamps(); + $table->string("name"); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('coursecategories'); + } +}; diff --git a/database/migrations/2026_04_29_152036_create_belt_course_table.php b/database/migrations/2026_04_29_152036_create_belt_course_table.php new file mode 100644 index 0000000..12db6a7 --- /dev/null +++ b/database/migrations/2026_04_29_152036_create_belt_course_table.php @@ -0,0 +1,31 @@ +id(); + $table->timestamps(); + $table->foreignIdFor(Belt::class); + $table->foreignIdFor(Course::class); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('belt_course'); + } +};