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'); + } +};