From 0dac411fb069a63103a6ed8722a04cecd7171e9c Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 10 Mar 2026 13:27:53 +0700 Subject: [PATCH] feat: Establish one-to-many relationship between lecturers and courses, adding UI fields and table columns for assignment and display. --- .../Master/Courses/CourseResource.php | 14 +++++++++++ .../Master/Lecturers/Schemas/LecturerForm.php | 25 +++++++++++++++++++ .../Lecturers/Tables/LecturersTable.php | 12 +++++++++ app/Models/Course.php | 6 +++++ app/Models/Lecturer.php | 6 +++++ ...2026_02_25_024503_create_courses_table.php | 1 + 6 files changed, 64 insertions(+) diff --git a/app/Filament/Resources/Master/Courses/CourseResource.php b/app/Filament/Resources/Master/Courses/CourseResource.php index c8ce288..de10546 100644 --- a/app/Filament/Resources/Master/Courses/CourseResource.php +++ b/app/Filament/Resources/Master/Courses/CourseResource.php @@ -12,6 +12,7 @@ use App\Models\Course; use BackedEnum; use Filament\Actions\BulkActionGroup; +use Filament\Forms\Components\Select; use Filament\Forms\Components\TextInput; use Filament\Resources\Resource; use Filament\Schemas\Schema; @@ -80,6 +81,15 @@ public static function form(Schema $schema): Schema ->maxValue(8) ->helperText('Semester ke berapa mata kuliah ini diajarkan (1-8).'), + Select::make('lecturer_id') + ->label('Dosen Pengampu') + ->placeholder('Pilih Dosen') + ->relationship('lecturer', 'full_name') + ->preload() + ->searchable() + ->helperText('Pilih dosen yang mengampu mata kuliah ini.') + ->required(), + ]) ->columns(1); } @@ -101,6 +111,10 @@ public static function table(Table $table): Table ->label('SKS') ->sortable(), + TextColumn::make('lecturer.full_name') + ->label('Dosen Pengampu') + ->searchable(), + ...TimestampColumns::make(), ]) ->filters([ diff --git a/app/Filament/Resources/Master/Lecturers/Schemas/LecturerForm.php b/app/Filament/Resources/Master/Lecturers/Schemas/LecturerForm.php index 6966240..4d2234f 100644 --- a/app/Filament/Resources/Master/Lecturers/Schemas/LecturerForm.php +++ b/app/Filament/Resources/Master/Lecturers/Schemas/LecturerForm.php @@ -3,9 +3,11 @@ namespace App\Filament\Resources\Master\Lecturers\Schemas; use App\Enums\Sex; +use App\Models\Course; use Carbon\Carbon; use Filament\Forms\Components\DatePicker; use Filament\Forms\Components\Radio; +use Filament\Forms\Components\Select; use Filament\Forms\Components\Textarea; use Filament\Forms\Components\TextInput; use Filament\Schemas\Components\Grid; @@ -115,6 +117,29 @@ public static function configure(Schema $schema): Schema ->columnSpanFull(), ]) ->columns(2), + + Section::make('Mata Kuliah') + ->description('Daftar mata kuliah yang diampu oleh dosen ini.') + ->schema([ + Select::make('courses') + ->label('Mata Kuliah') + ->multiple() + ->relationship('courses', 'name') + ->options(function () { + return Course::all() + ->groupBy('semester') + ->mapWithKeys(function ($courses, $semester) { + return [ + "Semester $semester" => $courses->pluck('name', 'id')->toArray(), + ]; + }) + ->toArray(); + }) + ->searchable() + ->preload() + ->live() + ->required(), + ]), ]) ->columns(1); } diff --git a/app/Filament/Resources/Master/Lecturers/Tables/LecturersTable.php b/app/Filament/Resources/Master/Lecturers/Tables/LecturersTable.php index 6ac45b2..87a69cf 100644 --- a/app/Filament/Resources/Master/Lecturers/Tables/LecturersTable.php +++ b/app/Filament/Resources/Master/Lecturers/Tables/LecturersTable.php @@ -77,6 +77,12 @@ public static function configure(Table $table): Table ->label('Alamat') ->limit(50), + TextColumn::make('courses.name') + ->label('Mata Kuliah') + ->badge() + ->searchable() + ->listWithLineBreaks(), + ...TimestampColumns::make(), ]) ->filters([ @@ -85,6 +91,12 @@ public static function configure(Table $table): Table ->options(Sex::class) ->native(false), + SelectFilter::make('courses') + ->label('Mata Kuliah') + ->relationship('courses', 'name') + ->multiple() + ->preload(), + TrashedFilter::make() ->native(false), ]) diff --git a/app/Models/Course.php b/app/Models/Course.php index be95d7c..5837e2a 100644 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -4,6 +4,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; class Course extends Model @@ -11,4 +12,9 @@ class Course extends Model use HasFactory, SoftDeletes; protected $guarded = ['id']; + + public function lecturer(): BelongsTo + { + return $this->belongsTo(Lecturer::class); + } } diff --git a/app/Models/Lecturer.php b/app/Models/Lecturer.php index 46543b2..2677813 100644 --- a/app/Models/Lecturer.php +++ b/app/Models/Lecturer.php @@ -8,6 +8,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; class Lecturer extends Model @@ -40,4 +41,9 @@ public function user(): BelongsTo { return $this->belongsTo(User::class); } + + public function courses(): HasMany + { + return $this->hasMany(Course::class); + } } diff --git a/database/migrations/2026_02_25_024503_create_courses_table.php b/database/migrations/2026_02_25_024503_create_courses_table.php index e143e46..190fd3d 100644 --- a/database/migrations/2026_02_25_024503_create_courses_table.php +++ b/database/migrations/2026_02_25_024503_create_courses_table.php @@ -13,6 +13,7 @@ public function up(): void { Schema::create('courses', function (Blueprint $table) { $table->id(); + $table->foreignId('lecturer_id')->nullable()->constrained()->nullOnDelete(); $table->string('code', 20)->unique(); $table->string('name', 100); $table->integer('credit')->default(3);