diff --git a/app/Http/Controllers/API/JawabanTAController.php b/app/Http/Controllers/API/JawabanTAController.php index 47d4589..7cc1072 100644 --- a/app/Http/Controllers/API/JawabanTAController.php +++ b/app/Http/Controllers/API/JawabanTAController.php @@ -69,7 +69,7 @@ public function store(Request $request): JsonResponse 'praktikan_id' => ['required', 'integer'], 'modul_id' => ['required', 'integer'], 'answers' => ['present', 'array'], - 'answers.*.soal_id' => ['required', 'integer', 'exists:soal_tas,id'], + 'answers.*.soal_id' => ['required', 'integer', 'exists:soal_tas,id', 'distinct'], 'answers.*.opsi_id' => ['required', 'integer', 'exists:soal_opsis,id'], ]); @@ -114,7 +114,8 @@ public function store(Request $request): JsonResponse ->get(); $correct = $jawaban->filter(fn (JawabanTa $item) => $item->opsi_id === $item->soal_ta?->opsi_benar_id)->count(); - $nilai = $jawaban->isNotEmpty() ? ($correct / $jawaban->count()) * 100 : 0; + $totalQuestions = SoalTa::where('modul_id', $modulId)->count(); + $nilai = $totalQuestions > 0 ? round(($correct / $totalQuestions) * 100, 2) : 0; return response()->json([ 'status' => 'success', diff --git a/app/Http/Controllers/API/JawabanTKController.php b/app/Http/Controllers/API/JawabanTKController.php index 847f090..142d9f0 100644 --- a/app/Http/Controllers/API/JawabanTKController.php +++ b/app/Http/Controllers/API/JawabanTKController.php @@ -69,7 +69,7 @@ public function store(Request $request): JsonResponse 'praktikan_id' => ['required', 'integer'], 'modul_id' => ['required', 'integer'], 'answers' => ['present', 'array'], - 'answers.*.soal_id' => ['required', 'integer', 'exists:soal_tks,id'], + 'answers.*.soal_id' => ['required', 'integer', 'exists:soal_tks,id', 'distinct'], 'answers.*.opsi_id' => ['required', 'integer', 'exists:soal_opsis,id'], ]); @@ -113,7 +113,8 @@ public function store(Request $request): JsonResponse ->get(); $correct = $jawaban->filter(fn (JawabanTk $item) => $item->opsi_id === $item->soal_tk?->opsi_benar_id)->count(); - $nilai = $jawaban->isNotEmpty() ? ($correct / $jawaban->count()) * 100 : 0; + $totalQuestions = SoalTk::where('modul_id', $modulId)->count(); + $nilai = $totalQuestions > 0 ? round(($correct / $totalQuestions) * 100, 2) : 0; return response()->json([ 'status' => 'success', diff --git a/app/Http/Controllers/API/SoalTPController.php b/app/Http/Controllers/API/SoalTPController.php index f756f2f..23f7f96 100644 --- a/app/Http/Controllers/API/SoalTPController.php +++ b/app/Http/Controllers/API/SoalTPController.php @@ -25,12 +25,14 @@ public function store(Request $request, $id) // Validasi input $request->validate([ 'soal' => 'required|string|max:10000', + 'enable_file_upload' => 'sometimes|boolean', ]); // Menyimpan soal baru $soal = SoalTp::create([ 'modul_id' => $id, 'soal' => $request->soal, + 'enable_file_upload' => $request->boolean('enable_file_upload'), ]); return response()->json([ @@ -76,7 +78,8 @@ public function update(Request $request, $id) 'modul_id' => 'required|integer|exists:moduls,id', // "isEssay" => "required|boolean", // "isProgram" => "required|boolean", - 'soal' => 'required|string|max:1000', + 'soal' => 'required|string|max:10000', + 'enable_file_upload' => 'sometimes|boolean', ]); $soal = SoalTp::find($id); if (! $soal) { @@ -97,6 +100,10 @@ public function update(Request $request, $id) // $soal->isEssay = $request->isEssay; // $soal->isProgram = $request->isProgram; $soal->soal = $request->soal; + if ($request->has('enable_file_upload')) { + $soal->enable_file_upload = + $request->boolean('enable_file_upload'); + } $soal->updated_at = now(); $soal->save(); diff --git a/database/factories/AsistenFactory.php b/database/factories/AsistenFactory.php index ff33d6b..ba49232 100644 --- a/database/factories/AsistenFactory.php +++ b/database/factories/AsistenFactory.php @@ -39,18 +39,26 @@ public function definition(): array ]; } - public function withRoles(array $roleName) + public function withRoles(array $roleNames) { - return $this->afterCreating(function (Asisten $asisten) { - // Assign role in Spatie - $asisten->assignRole($role); + return $this + ->state(function () use ($roleNames) { + $roleName = fake()->randomElement($roleNames); - // // Sync `role_id` in the asistens table - // if (!$asisten->role_id) { - // $asisten->role_id = $role->id; - // $asisten->save(); - // } + $role = Role::where('name', $roleName) + ->where('guard_name', 'asisten') + ->firstOrFail(); - }); + return [ + 'role_id' => $role->id, + ]; + }) + ->afterCreating(function (Asisten $asisten) { + $role = Role::where('id', $asisten->role_id) + ->where('guard_name', 'asisten') + ->firstOrFail(); + + $asisten->syncRoles([$role]); + }); } } diff --git a/database/factories/PraktikanFactory.php b/database/factories/PraktikanFactory.php index 10fbc84..1f485c3 100644 --- a/database/factories/PraktikanFactory.php +++ b/database/factories/PraktikanFactory.php @@ -3,6 +3,7 @@ namespace Database\Factories; use App\Models\Kelas; +use App\Models\Praktikan; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -30,4 +31,10 @@ public function definition(): array 'updated_at' => now(), ]; } + public function withRole() + { + return $this->afterCreating(function (Praktikan $praktikan) { + $praktikan->assignRole('PRAKTIKAN'); + }); +} } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index eb76a53..f9b3dc8 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -15,6 +15,7 @@ use App\Models\SoalTp; use Illuminate\Database\Seeder; use Illuminate\Support\Facades\DB; +use Spatie\Permission\Models\Role; class DatabaseSeeder extends Seeder { @@ -24,74 +25,78 @@ class DatabaseSeeder extends Seeder public function run(): void { // First seeding - // Modul::factory(20)->create(); - // Role::create(['name' => 'SOFTWARE', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'KORDAS', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'WAKORDAS', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'KOORPRAK', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'ADMIN', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'HARDWARE', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'DDC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'ATC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'RDC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'HRD', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'CMD', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'MLC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); + $this->call(RolePermissionsSeeder::class); + + Modul::factory(20)->create(); // end Of First Seeding // //////////////////////////////////////////////////////////// // Second Seeding - // Kelas::factory(10)->create(); - - // Asisten::factory(10)->create(); - // $asisten = Asisten::factory(90)->withRoles(['SOFTWARE', 'KORDAS', 'WAKORDAS', 'KOORPRAK', 'ADMIN', 'HARDWARE', 'DDC', 'ATC', 'RDC', 'HRD', 'CMD', 'MLC'])->create(); - - // DB::table('configurations')->insert([ - // [ - // 'tp_activation' => 1, - // 'tubes_activation' => 0, - // 'polling_activation' => 1, - // 'secretfeature_activation' => 0, - // 'registrationPraktikan_activation' => 1, - // 'registrationAsisten_activation' => 1, - // 'kode_asisten' => 'BOT', - // 'created_at' => now(), - // 'updated_at' => now(), - // ], - // ]); - - // // buat polling - // $words = [ - // 'Terjaim', - // 'Terasik', - // 'Terganteng', - // 'Tercantik', - // 'Terjamet', - // 'Terwibu', - // 'Tergalak', - // 'Tergalau', - // 'Termager', - // 'Terkocak', - // 'Tergaring', - // 'Tersantuy', - // 'Terimut', - // 'Tercool', - // 'Terpelit', - // 'Terkece', - // 'Terkpop', - // ]; - - // foreach ($words as $word) { - // DB::table('jenis_pollings')->insert([ - // 'judul' => $word, - // 'created_at' => now(), - // 'updated_at' => now(), - // ]); - // } - - // // buat kode pelanggaran + Kelas::factory(10)->create(); + + Asisten::factory(30) + ->withRoles([ + 'SOFTWARE', + 'KORDAS', + 'WAKORDAS', + 'KOORPRAK', + 'ADMIN', + 'HARDWARE', + 'DDC', + 'ATC', + 'RDC', + 'HRD', + 'CMD', + 'MLC', + ]) + ->create(); + + DB::table('configurations')->insert([ + [ + 'tp_activation' => 1, + 'tubes_activation' => 0, + 'polling_activation' => 1, + 'secretfeature_activation' => 0, + 'registrationPraktikan_activation' => 1, + 'registrationAsisten_activation' => 1, + 'kode_asisten' => 'BOT', + 'created_at' => now(), + 'updated_at' => now(), + ], + ]); + + // buat polling + $words = [ + 'Terjaim', + 'Terasik', + 'Terganteng', + 'Tercantik', + 'Terjamet', + 'Terwibu', + 'Tergalak', + 'Tergalau', + 'Termager', + 'Terkocak', + 'Tergaring', + 'Tersantuy', + 'Terimut', + 'Tercool', + 'Terpelit', + 'Terkece', + 'Terkpop', + ]; + + foreach ($words as $word) { + DB::table('jenis_pollings')->insert([ + 'judul' => $word, + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + + // buat kode pelanggaran // DB::table('kode_pelanggarans')->insert([ // [ // 'pelanggaran' => 'Belum Input Nilai', @@ -108,7 +113,7 @@ public function run(): void // Third Seeding // // buat praktikan - // Praktikan::factory()->count(30)->create(); + Praktikan::factory()->count(30)->withRole()->create(); SoalTp::factory()->count(10)->create(); // Menghasilkan 10 record untuk tabel soal_tps SoalTa::factory()->count(10)->create(); // Menghasilkan 10 record untuk tabel soal_tas diff --git a/database/seeders/RolePermissionsSeeder.php b/database/seeders/RolePermissionsSeeder.php index 82b7635..52acab3 100644 --- a/database/seeders/RolePermissionsSeeder.php +++ b/database/seeders/RolePermissionsSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; use Illuminate\Database\Seeder; +use Spatie\Permission\PermissionRegistrar; use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role; @@ -13,374 +14,376 @@ class RolePermissionsSeeder extends Seeder */ public function run(): void { + app()[PermissionRegistrar::class]->forgetCachedPermissions(); // aslab Pro Ultra // List of permissions to create - // $permissions = [ - // // 'super-aslab', - // // 'aslab-features', - // // 'ddc-features', - // // 'atc-features', - // // 'rdc-features', - // // 'asisten-features', - // 'manage-role', - // 'manage-praktikum', - // 'laporan-praktikum', - // 'manage-plot', - // 'manage-pelanggaran', - // 'manage-modul', - // 'manage-soal', - // 'unlock-jawaban', - // 'tugas-pendahuluan', - // 'see-pelanggaran', - // 'lms-configuration', - // 'manage-profile', - // 'see-praktikum', - // 'see-history', - // 'see-soal', - // 'nilai-praktikan', - // 'see-plot', - // 'ranking-praktikan', - // 'see-polling', - // 'set-praktikan', - // 'reset-praktikan', - // 'check-tugas-pendahuluan', - // 'change-password', - // 'praktikan-regist', - // 'tp-configuration', - // 'logout', - // ]; - - // Role::create(['name' => 'SOFTWARE', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'KORDAS', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'WAKORDAS', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'KOORPRAK', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'ADMIN', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'HARDWARE', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'DDC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'ATC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'RDC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'HRD', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'CMD', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // Role::create(['name' => 'MLC', 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - - // // Create permissions - // foreach ($permissions as $permission) { - // Permission::firstOrCreate(['name' => $permission, 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); - // } + $permissions = [ + 'super-aslab', + 'aslab-features', + 'ddc-features', + 'atc-features', + 'rdc-features', + 'asisten-features', + 'manage-role', + 'manage-praktikum', + 'laporan-praktikum', + 'manage-plot', + 'manage-pelanggaran', + 'manage-modul', + 'manage-soal', + 'unlock-jawaban', + 'tugas-pendahuluan', + 'see-pelanggaran', + 'lms-configuration', + 'manage-profile', + 'see-praktikum', + 'see-history', + 'see-soal', + 'nilai-praktikan', + 'see-plot', + 'ranking-praktikan', + 'see-polling', + 'set-praktikan', + 'reset-praktikan', + 'check-tugas-pendahuluan', + 'change-password', + 'praktikan-regist', + 'tp-configuration', + 'logout', + ]; + + // Create permissions + foreach ($permissions as $permission) { + Permission::firstOrCreate(['name' => $permission, 'guard_name' => 'asisten', 'created_at' => now(), 'updated_at' => now()]); + } + + $assistantRoles = [ + 'SOFTWARE', + 'KORDAS', + 'WAKORDAS', + 'KOORPRAK', + 'ADMIN', + 'HARDWARE', + 'DDC', + 'ATC', + 'RDC', + 'HRD', + 'CMD', + 'MLC', + ]; + + foreach ($assistantRoles as $roleName) { + Role::firstOrCreate([ + 'name' => $roleName, + 'guard_name' => 'asisten', + ]); + } + + Role::firstOrCreate([ + 'name' => 'PRAKTIKAN', + 'guard_name' => 'praktikan', + ]); - // Role::create(['name' => 'PRAKTIKAN', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'lihat-profile', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'lihat-nilai', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'lihat-modul', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'lihat-asisten', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'praktikum-lms', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'lihat-leaderboard', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'isi-polling', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - // Permission::create(['name' => 'ganti-password', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); - Permission::create(['name' => 'logout-praktikan', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'lihat-profile', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'lihat-nilai', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'lihat-modul', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'lihat-asisten', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'praktikum-lms', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'lihat-leaderboard', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'isi-polling', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'ganti-password', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); + Permission::firstOrCreate(['name' => 'logout-praktikan', 'guard_name' => 'praktikan', 'created_at' => now(), 'updated_at' => now()]); $role = Role::firstOrCreate(['name' => 'PRAKTIKAN', 'guard_name' => 'praktikan']); $role->givePermissionTo([ - // 'lihat-profile', - // 'lihat-nilai', - // 'lihat-modul', - // 'lihat-asisten', - // 'praktikum-lms', - // 'lihat-leaderboard', - // 'isi-polling', - // 'ganti-password', + 'lihat-profile', + 'lihat-nilai', + 'lihat-modul', + 'lihat-asisten', + 'praktikum-lms', + 'lihat-leaderboard', + 'isi-polling', + 'ganti-password', 'logout-praktikan', ]); - // $AslabProUltra = Role::firstOrCreate(['name' => 'SOFTWARE', 'guard_name' => 'asisten']); - - // $Kordas = Role::firstOrCreate(['name' => 'KORDAS', 'guard_name' => 'asisten']); - - // $Wakordas = Role::firstOrCreate(['name' => 'WAKORDAS', 'guard_name' => 'asisten']); - - // $Koorprak = Role::firstOrCreate(['name' => 'KOORPRAK', 'guard_name' => 'asisten']); - - // $Admin = Role::firstOrCreate(['name' => 'ADMIN', 'guard_name' => 'asisten']); - - // $Hardware = Role::firstOrCreate(['name' => 'HARDWARE', 'guard_name' => 'asisten']); - - // $AsistenSemiUltra = Role::firstOrCreate(['name' => 'DDC', 'guard_name' => 'asisten']); - - // $AsprakATC = Role::firstOrCreate(['name' => 'ATC', 'guard_name' => 'asisten']); - - // $AsprakRDC = Role::firstOrCreate(['name' => 'RDC', 'guard_name' => 'asisten']); - - // $AsprakCMD = Role::firstOrCreate(['name' => 'CMD', 'guard_name' => 'asisten']); - - // $AsprakHRD = Role::firstOrCreate(['name' => 'HRD', 'guard_name' => 'asisten']); - - // $AsprakMLC = Role::firstOrCreate(['name' => 'MLC', 'guard_name' => 'asisten']); - - // $AslabProUltra->givePermissionTo('manage-role'); - // $AslabProUltra->givePermissionTo('manage-praktikum'); - // $AslabProUltra->givePermissionTo('laporan-praktikum'); - // $AslabProUltra->givePermissionTo('manage-plot'); - // $AslabProUltra->givePermissionTo('manage-pelanggaran'); - // $AslabProUltra->givePermissionTo('manage-modul'); - // $AslabProUltra->givePermissionTo('manage-soal'); - // $AslabProUltra->givePermissionTo('unlock-jawaban'); - // $AslabProUltra->givePermissionTo('tugas-pendahuluan'); - // $AslabProUltra->givePermissionTo('lms-configuration'); - // $AslabProUltra->givePermissionTo('manage-profile'); - // $AslabProUltra->givePermissionTo('see-praktikum'); - // $AslabProUltra->givePermissionTo('see-history'); - // $AslabProUltra->givePermissionTo('see-soal'); - // $AslabProUltra->givePermissionTo('nilai-praktikan'); - // $AslabProUltra->givePermissionTo('see-plot'); - // $AslabProUltra->givePermissionTo('ranking-praktikan'); - // $AslabProUltra->givePermissionTo('see-polling'); - // $AslabProUltra->givePermissionTo('see-pelanggaran'); - // $AslabProUltra->givePermissionTo('set-praktikan'); - // $AslabProUltra->givePermissionTo('reset-praktikan'); - // $AslabProUltra->givePermissionTo('check-tugas-pendahuluan'); - // $AslabProUltra->givePermissionTo('change-password'); - // $AslabProUltra->givePermissionTo('tp-configuration'); - // $AslabProUltra->givePermissionTo('praktikan-regist'); - // $AslabProUltra->givePermissionTo('logout'); - - // $Kordas->givePermissionTo('manage-role'); - // $Kordas->givePermissionTo('manage-praktikum'); - // $Kordas->givePermissionTo('laporan-praktikum'); - // $Kordas->givePermissionTo('manage-plot'); - // $Kordas->givePermissionTo('manage-pelanggaran'); - // $Kordas->givePermissionTo('manage-modul'); - // $Kordas->givePermissionTo('manage-soal'); - // $Kordas->givePermissionTo('unlock-jawaban'); - // $Kordas->givePermissionTo('tugas-pendahuluan'); - // $Kordas->givePermissionTo('lms-configuration'); - // $Kordas->givePermissionTo('manage-profile'); - // $Kordas->givePermissionTo('see-praktikum'); - // $Kordas->givePermissionTo('see-history'); - // $Kordas->givePermissionTo('see-soal'); - // $Kordas->givePermissionTo('nilai-praktikan'); - // $Kordas->givePermissionTo('see-plot'); - // $Kordas->givePermissionTo('ranking-praktikan'); - // $Kordas->givePermissionTo('see-polling'); - // $Kordas->givePermissionTo('see-pelanggaran'); - // $Kordas->givePermissionTo('set-praktikan'); - // $Kordas->givePermissionTo('reset-praktikan'); - // $Kordas->givePermissionTo('check-tugas-pendahuluan'); - // $Kordas->givePermissionTo('change-password'); - // $Kordas->givePermissionTo('tp-configuration'); - // $Kordas->givePermissionTo('praktikan-regist'); - // $Kordas->givePermissionTo('logout'); - - // $Wakordas->givePermissionTo('manage-role'); - // $Wakordas->givePermissionTo('manage-praktikum'); - // $Wakordas->givePermissionTo('laporan-praktikum'); - // $Wakordas->givePermissionTo('manage-plot'); - // $Wakordas->givePermissionTo('manage-pelanggaran'); - // $Wakordas->givePermissionTo('manage-modul'); - // $Wakordas->givePermissionTo('manage-soal'); - // $Wakordas->givePermissionTo('unlock-jawaban'); - // $Wakordas->givePermissionTo('tugas-pendahuluan'); - // $Wakordas->givePermissionTo('lms-configuration'); - // $Wakordas->givePermissionTo('manage-profile'); - // $Wakordas->givePermissionTo('see-praktikum'); - // $Wakordas->givePermissionTo('see-history'); - // $Wakordas->givePermissionTo('see-soal'); - // $Wakordas->givePermissionTo('nilai-praktikan'); - // $Wakordas->givePermissionTo('see-plot'); - // $Wakordas->givePermissionTo('ranking-praktikan'); - // $Wakordas->givePermissionTo('see-polling'); - // $Wakordas->givePermissionTo('see-pelanggaran'); - // $Wakordas->givePermissionTo('set-praktikan'); - // $Wakordas->givePermissionTo('reset-praktikan'); - // $Wakordas->givePermissionTo('check-tugas-pendahuluan'); - // $Wakordas->givePermissionTo('change-password'); - // $Wakordas->givePermissionTo('tp-configuration'); - // $Wakordas->givePermissionTo('praktikan-regist'); - // $Wakordas->givePermissionTo('logout'); - - // $Koorprak->givePermissionTo('manage-praktikum'); - // $Koorprak->givePermissionTo('laporan-praktikum'); - // $Koorprak->givePermissionTo('manage-plot'); - // $Koorprak->givePermissionTo('manage-pelanggaran'); - // $Koorprak->givePermissionTo('manage-modul'); - // $Koorprak->givePermissionTo('manage-soal'); - // $Koorprak->givePermissionTo('unlock-jawaban'); - // $Koorprak->givePermissionTo('tugas-pendahuluan'); - // $Koorprak->givePermissionTo('lms-configuration'); - // $Koorprak->givePermissionTo('manage-profile'); - // $Koorprak->givePermissionTo('see-praktikum'); - // $Koorprak->givePermissionTo('see-history'); - // $Koorprak->givePermissionTo('see-soal'); - // $Koorprak->givePermissionTo('nilai-praktikan'); - // $Koorprak->givePermissionTo('see-plot'); - // $Koorprak->givePermissionTo('ranking-praktikan'); - // $Koorprak->givePermissionTo('see-polling'); - // $Koorprak->givePermissionTo('see-pelanggaran'); - // $Koorprak->givePermissionTo('set-praktikan'); - // $Koorprak->givePermissionTo('reset-praktikan'); - // $Koorprak->givePermissionTo('check-tugas-pendahuluan'); - // $Koorprak->givePermissionTo('change-password'); - // $Koorprak->givePermissionTo('tp-configuration'); - // $Koorprak->givePermissionTo('praktikan-regist'); - // $Koorprak->givePermissionTo('logout'); - - // $Admin->givePermissionTo('manage-praktikum'); - // $Admin->givePermissionTo('laporan-praktikum'); - // $Admin->givePermissionTo('manage-plot'); - // $Admin->givePermissionTo('manage-pelanggaran'); - // $Admin->givePermissionTo('manage-modul'); - // $Admin->givePermissionTo('manage-soal'); - // $Admin->givePermissionTo('unlock-jawaban'); - // $Admin->givePermissionTo('tugas-pendahuluan'); - // $Admin->givePermissionTo('lms-configuration'); - // $Admin->givePermissionTo('manage-profile'); - // $Admin->givePermissionTo('see-praktikum'); - // $Admin->givePermissionTo('see-history'); - // $Admin->givePermissionTo('see-soal'); - // $Admin->givePermissionTo('nilai-praktikan'); - // $Admin->givePermissionTo('see-plot'); - // $Admin->givePermissionTo('ranking-praktikan'); - // $Admin->givePermissionTo('see-polling'); - // $Admin->givePermissionTo('see-pelanggaran'); - // $Admin->givePermissionTo('set-praktikan'); - // $Admin->givePermissionTo('reset-praktikan'); - // $Admin->givePermissionTo('check-tugas-pendahuluan'); - // $Admin->givePermissionTo('change-password'); - // $Admin->givePermissionTo('tp-configuration'); - // $Admin->givePermissionTo('praktikan-regist'); - // $Admin->givePermissionTo('logout'); - - // $Hardware->givePermissionTo('manage-praktikum'); - // $Hardware->givePermissionTo('laporan-praktikum'); - // $Hardware->givePermissionTo('manage-plot'); - // $Hardware->givePermissionTo('manage-pelanggaran'); - // $Hardware->givePermissionTo('manage-modul'); - // $Hardware->givePermissionTo('manage-soal'); - // $Hardware->givePermissionTo('unlock-jawaban'); - // $Hardware->givePermissionTo('tugas-pendahuluan'); - // $Hardware->givePermissionTo('lms-configuration'); - // $Hardware->givePermissionTo('manage-profile'); - // $Hardware->givePermissionTo('see-praktikum'); - // $Hardware->givePermissionTo('see-history'); - // $Hardware->givePermissionTo('see-soal'); - // $Hardware->givePermissionTo('nilai-praktikan'); - // $Hardware->givePermissionTo('see-plot'); - // $Hardware->givePermissionTo('ranking-praktikan'); - // $Hardware->givePermissionTo('see-polling'); - // $Hardware->givePermissionTo('see-pelanggaran'); - // $Hardware->givePermissionTo('set-praktikan'); - // $Hardware->givePermissionTo('reset-praktikan'); - // $Hardware->givePermissionTo('check-tugas-pendahuluan'); - // $Hardware->givePermissionTo('change-password'); - // $Hardware->givePermissionTo('tp-configuration'); - // $Hardware->givePermissionTo('praktikan-regist'); - // $Hardware->givePermissionTo('logout'); - - // $AsistenSemiUltra->givePermissionTo('manage-profile'); - // $AsistenSemiUltra->givePermissionTo('see-praktikum'); - // $AsistenSemiUltra->givePermissionTo('see-history'); - // $AsistenSemiUltra->givePermissionTo('see-soal'); - // $AsistenSemiUltra->givePermissionTo('nilai-praktikan'); - // $AsistenSemiUltra->givePermissionTo('see-plot'); - // $AsistenSemiUltra->givePermissionTo('ranking-praktikan'); - // $AsistenSemiUltra->givePermissionTo('see-polling'); - // $AsistenSemiUltra->givePermissionTo('see-pelanggaran'); - // $AsistenSemiUltra->givePermissionTo('set-praktikan'); - // $AsistenSemiUltra->givePermissionTo('reset-praktikan'); - // $AsistenSemiUltra->givePermissionTo('check-tugas-pendahuluan'); - // $AsistenSemiUltra->givePermissionTo('change-password'); - // $AsistenSemiUltra->givePermissionTo('logout'); - // $AsistenSemiUltra->givePermissionTo('manage-modul'); - // $AsistenSemiUltra->givePermissionTo('manage-soal'); - // $AsistenSemiUltra->givePermissionTo('unlock-jawaban'); - // $AsistenSemiUltra->givePermissionTo('manage-praktikum'); - // $AsistenSemiUltra->givePermissionTo('see-pelanggaran'); - // $AsistenSemiUltra->givePermissionTo('tugas-pendahuluan'); - // $AsistenSemiUltra->givePermissionTo('tp-configuration'); - // $AsistenSemiUltra->givePermissionTo('praktikan-regist'); - - // $AsprakATC->givePermissionTo('manage-profile'); - // $AsprakATC->givePermissionTo('see-praktikum'); - // $AsprakATC->givePermissionTo('see-history'); - // $AsprakATC->givePermissionTo('see-soal'); - // $AsprakATC->givePermissionTo('nilai-praktikan'); - // $AsprakATC->givePermissionTo('see-plot'); - // $AsprakATC->givePermissionTo('ranking-praktikan'); - // $AsprakATC->givePermissionTo('see-polling'); - // $AsprakATC->givePermissionTo('see-pelanggaran'); - // $AsprakATC->givePermissionTo('set-praktikan'); - // $AsprakATC->givePermissionTo('reset-praktikan'); - // $AsprakATC->givePermissionTo('check-tugas-pendahuluan'); - // $AsprakATC->givePermissionTo('change-password'); - // $AsprakATC->givePermissionTo('logout'); - // $AsprakATC->givePermissionTo('manage-modul'); - // $AsprakATC->givePermissionTo('manage-soal'); - // $AsprakATC->givePermissionTo('unlock-jawaban'); - // $AsprakATC->givePermissionTo('tugas-pendahuluan'); - - // $AsprakRDC->givePermissionTo('manage-profile'); - // $AsprakRDC->givePermissionTo('see-praktikum'); - // $AsprakRDC->givePermissionTo('see-history'); - // $AsprakRDC->givePermissionTo('see-soal'); - // $AsprakRDC->givePermissionTo('nilai-praktikan'); - // $AsprakRDC->givePermissionTo('see-plot'); - // $AsprakRDC->givePermissionTo('ranking-praktikan'); - // $AsprakRDC->givePermissionTo('see-polling'); - // $AsprakRDC->givePermissionTo('see-pelanggaran'); - // $AsprakRDC->givePermissionTo('set-praktikan'); - // $AsprakRDC->givePermissionTo('reset-praktikan'); - // $AsprakRDC->givePermissionTo('check-tugas-pendahuluan'); - // $AsprakRDC->givePermissionTo('change-password'); - // $AsprakRDC->givePermissionTo('logout'); - // $AsprakRDC->givePermissionTo('manage-praktikum'); - // $AsprakRDC->givePermissionTo('tp-configuration'); - // $AsprakRDC->givePermissionTo('praktikan-regist'); - // $AsprakRDC->givePermissionTo('see-pelanggaran'); - - // $AsprakCMD->givePermissionTo('manage-profile'); - // $AsprakCMD->givePermissionTo('see-praktikum'); - // $AsprakCMD->givePermissionTo('see-history'); - // $AsprakCMD->givePermissionTo('see-soal'); - // $AsprakCMD->givePermissionTo('nilai-praktikan'); - // $AsprakCMD->givePermissionTo('see-plot'); - // $AsprakCMD->givePermissionTo('ranking-praktikan'); - // $AsprakCMD->givePermissionTo('see-polling'); - // $AsprakCMD->givePermissionTo('see-pelanggaran'); - // $AsprakCMD->givePermissionTo('set-praktikan'); - // $AsprakCMD->givePermissionTo('reset-praktikan'); - // $AsprakCMD->givePermissionTo('check-tugas-pendahuluan'); - // $AsprakCMD->givePermissionTo('change-password'); - // $AsprakCMD->givePermissionTo('logout'); - - // $AsprakHRD->givePermissionTo('manage-profile'); - // $AsprakHRD->givePermissionTo('see-praktikum'); - // $AsprakHRD->givePermissionTo('see-history'); - // $AsprakHRD->givePermissionTo('see-soal'); - // $AsprakHRD->givePermissionTo('nilai-praktikan'); - // $AsprakHRD->givePermissionTo('see-plot'); - // $AsprakHRD->givePermissionTo('ranking-praktikan'); - // $AsprakHRD->givePermissionTo('see-polling'); - // $AsprakHRD->givePermissionTo('see-pelanggaran'); - // $AsprakHRD->givePermissionTo('set-praktikan'); - // $AsprakHRD->givePermissionTo('reset-praktikan'); - // $AsprakHRD->givePermissionTo('check-tugas-pendahuluan'); - // $AsprakHRD->givePermissionTo('change-password'); - // $AsprakHRD->givePermissionTo('logout'); - - // $AsprakMLC->givePermissionTo('manage-profile'); - // $AsprakMLC->givePermissionTo('see-praktikum'); - // $AsprakMLC->givePermissionTo('see-history'); - // $AsprakMLC->givePermissionTo('see-soal'); - // $AsprakMLC->givePermissionTo('nilai-praktikan'); - // $AsprakMLC->givePermissionTo('see-plot'); - // $AsprakMLC->givePermissionTo('ranking-praktikan'); - // $AsprakMLC->givePermissionTo('see-polling'); - // $AsprakMLC->givePermissionTo('see-pelanggaran'); - // $AsprakMLC->givePermissionTo('set-praktikan'); - // $AsprakMLC->givePermissionTo('reset-praktikan'); - // $AsprakMLC->givePermissionTo('check-tugas-pendahuluan'); - // $AsprakMLC->givePermissionTo('change-password'); - // $AsprakMLC->givePermissionTo('logout'); + $AslabProUltra = Role::firstOrCreate(['name' => 'SOFTWARE', 'guard_name' => 'asisten']); + $Kordas = Role::firstOrCreate(['name' => 'KORDAS', 'guard_name' => 'asisten']); + $Wakordas = Role::firstOrCreate(['name' => 'WAKORDAS', 'guard_name' => 'asisten']); + $Koorprak = Role::firstOrCreate(['name' => 'KOORPRAK', 'guard_name' => 'asisten']); + $Admin = Role::firstOrCreate(['name' => 'ADMIN', 'guard_name' => 'asisten']); + $Hardware = Role::firstOrCreate(['name' => 'HARDWARE', 'guard_name' => 'asisten']); + $AsistenSemiUltra = Role::firstOrCreate(['name' => 'DDC', 'guard_name' => 'asisten']); + $AsprakATC = Role::firstOrCreate(['name' => 'ATC', 'guard_name' => 'asisten']); + $AsprakRDC = Role::firstOrCreate(['name' => 'RDC', 'guard_name' => 'asisten']); + $AsprakCMD = Role::firstOrCreate(['name' => 'CMD', 'guard_name' => 'asisten']); + $AsprakHRD = Role::firstOrCreate(['name' => 'HRD', 'guard_name' => 'asisten']); + $AsprakMLC = Role::firstOrCreate(['name' => 'MLC', 'guard_name' => 'asisten']); + $AslabProUltra->givePermissionTo('manage-role'); + $AslabProUltra->givePermissionTo('manage-praktikum'); + $AslabProUltra->givePermissionTo('laporan-praktikum'); + $AslabProUltra->givePermissionTo('manage-plot'); + $AslabProUltra->givePermissionTo('manage-pelanggaran'); + $AslabProUltra->givePermissionTo('manage-modul'); + $AslabProUltra->givePermissionTo('manage-soal'); + $AslabProUltra->givePermissionTo('unlock-jawaban'); + $AslabProUltra->givePermissionTo('tugas-pendahuluan'); + $AslabProUltra->givePermissionTo('lms-configuration'); + $AslabProUltra->givePermissionTo('manage-profile'); + $AslabProUltra->givePermissionTo('see-praktikum'); + $AslabProUltra->givePermissionTo('see-history'); + $AslabProUltra->givePermissionTo('see-soal'); + $AslabProUltra->givePermissionTo('nilai-praktikan'); + $AslabProUltra->givePermissionTo('see-plot'); + $AslabProUltra->givePermissionTo('ranking-praktikan'); + $AslabProUltra->givePermissionTo('see-polling'); + $AslabProUltra->givePermissionTo('see-pelanggaran'); + $AslabProUltra->givePermissionTo('set-praktikan'); + $AslabProUltra->givePermissionTo('reset-praktikan'); + $AslabProUltra->givePermissionTo('check-tugas-pendahuluan'); + $AslabProUltra->givePermissionTo('change-password'); + $AslabProUltra->givePermissionTo('tp-configuration'); + $AslabProUltra->givePermissionTo('praktikan-regist'); + $AslabProUltra->givePermissionTo('logout'); + + $Kordas->givePermissionTo('manage-role'); + $Kordas->givePermissionTo('manage-praktikum'); + $Kordas->givePermissionTo('laporan-praktikum'); + $Kordas->givePermissionTo('manage-plot'); + $Kordas->givePermissionTo('manage-pelanggaran'); + $Kordas->givePermissionTo('manage-modul'); + $Kordas->givePermissionTo('manage-soal'); + $Kordas->givePermissionTo('unlock-jawaban'); + $Kordas->givePermissionTo('tugas-pendahuluan'); + $Kordas->givePermissionTo('lms-configuration'); + $Kordas->givePermissionTo('manage-profile'); + $Kordas->givePermissionTo('see-praktikum'); + $Kordas->givePermissionTo('see-history'); + $Kordas->givePermissionTo('see-soal'); + $Kordas->givePermissionTo('nilai-praktikan'); + $Kordas->givePermissionTo('see-plot'); + $Kordas->givePermissionTo('ranking-praktikan'); + $Kordas->givePermissionTo('see-polling'); + $Kordas->givePermissionTo('see-pelanggaran'); + $Kordas->givePermissionTo('set-praktikan'); + $Kordas->givePermissionTo('reset-praktikan'); + $Kordas->givePermissionTo('check-tugas-pendahuluan'); + $Kordas->givePermissionTo('change-password'); + $Kordas->givePermissionTo('tp-configuration'); + $Kordas->givePermissionTo('praktikan-regist'); + $Kordas->givePermissionTo('logout'); + + $Wakordas->givePermissionTo('manage-role'); + $Wakordas->givePermissionTo('manage-praktikum'); + $Wakordas->givePermissionTo('laporan-praktikum'); + $Wakordas->givePermissionTo('manage-plot'); + $Wakordas->givePermissionTo('manage-pelanggaran'); + $Wakordas->givePermissionTo('manage-modul'); + $Wakordas->givePermissionTo('manage-soal'); + $Wakordas->givePermissionTo('unlock-jawaban'); + $Wakordas->givePermissionTo('tugas-pendahuluan'); + $Wakordas->givePermissionTo('lms-configuration'); + $Wakordas->givePermissionTo('manage-profile'); + $Wakordas->givePermissionTo('see-praktikum'); + $Wakordas->givePermissionTo('see-history'); + $Wakordas->givePermissionTo('see-soal'); + $Wakordas->givePermissionTo('nilai-praktikan'); + $Wakordas->givePermissionTo('see-plot'); + $Wakordas->givePermissionTo('ranking-praktikan'); + $Wakordas->givePermissionTo('see-polling'); + $Wakordas->givePermissionTo('see-pelanggaran'); + $Wakordas->givePermissionTo('set-praktikan'); + $Wakordas->givePermissionTo('reset-praktikan'); + $Wakordas->givePermissionTo('check-tugas-pendahuluan'); + $Wakordas->givePermissionTo('change-password'); + $Wakordas->givePermissionTo('tp-configuration'); + $Wakordas->givePermissionTo('praktikan-regist'); + $Wakordas->givePermissionTo('logout'); + + $Koorprak->givePermissionTo('manage-praktikum'); + $Koorprak->givePermissionTo('laporan-praktikum'); + $Koorprak->givePermissionTo('manage-plot'); + $Koorprak->givePermissionTo('manage-pelanggaran'); + $Koorprak->givePermissionTo('manage-modul'); + $Koorprak->givePermissionTo('manage-soal'); + $Koorprak->givePermissionTo('unlock-jawaban'); + $Koorprak->givePermissionTo('tugas-pendahuluan'); + $Koorprak->givePermissionTo('lms-configuration'); + $Koorprak->givePermissionTo('manage-profile'); + $Koorprak->givePermissionTo('see-praktikum'); + $Koorprak->givePermissionTo('see-history'); + $Koorprak->givePermissionTo('see-soal'); + $Koorprak->givePermissionTo('nilai-praktikan'); + $Koorprak->givePermissionTo('see-plot'); + $Koorprak->givePermissionTo('ranking-praktikan'); + $Koorprak->givePermissionTo('see-polling'); + $Koorprak->givePermissionTo('see-pelanggaran'); + $Koorprak->givePermissionTo('set-praktikan'); + $Koorprak->givePermissionTo('reset-praktikan'); + $Koorprak->givePermissionTo('check-tugas-pendahuluan'); + $Koorprak->givePermissionTo('change-password'); + $Koorprak->givePermissionTo('tp-configuration'); + $Koorprak->givePermissionTo('praktikan-regist'); + $Koorprak->givePermissionTo('logout'); + + $Admin->givePermissionTo('manage-praktikum'); + $Admin->givePermissionTo('laporan-praktikum'); + $Admin->givePermissionTo('manage-plot'); + $Admin->givePermissionTo('manage-pelanggaran'); + $Admin->givePermissionTo('manage-modul'); + $Admin->givePermissionTo('manage-soal'); + $Admin->givePermissionTo('unlock-jawaban'); + $Admin->givePermissionTo('tugas-pendahuluan'); + $Admin->givePermissionTo('lms-configuration'); + $Admin->givePermissionTo('manage-profile'); + $Admin->givePermissionTo('see-praktikum'); + $Admin->givePermissionTo('see-history'); + $Admin->givePermissionTo('see-soal'); + $Admin->givePermissionTo('nilai-praktikan'); + $Admin->givePermissionTo('see-plot'); + $Admin->givePermissionTo('ranking-praktikan'); + $Admin->givePermissionTo('see-polling'); + $Admin->givePermissionTo('see-pelanggaran'); + $Admin->givePermissionTo('set-praktikan'); + $Admin->givePermissionTo('reset-praktikan'); + $Admin->givePermissionTo('check-tugas-pendahuluan'); + $Admin->givePermissionTo('change-password'); + $Admin->givePermissionTo('tp-configuration'); + $Admin->givePermissionTo('praktikan-regist'); + $Admin->givePermissionTo('logout'); + + $Hardware->givePermissionTo('manage-praktikum'); + $Hardware->givePermissionTo('laporan-praktikum'); + $Hardware->givePermissionTo('manage-plot'); + $Hardware->givePermissionTo('manage-pelanggaran'); + $Hardware->givePermissionTo('manage-modul'); + $Hardware->givePermissionTo('manage-soal'); + $Hardware->givePermissionTo('unlock-jawaban'); + $Hardware->givePermissionTo('tugas-pendahuluan'); + $Hardware->givePermissionTo('lms-configuration'); + $Hardware->givePermissionTo('manage-profile'); + $Hardware->givePermissionTo('see-praktikum'); + $Hardware->givePermissionTo('see-history'); + $Hardware->givePermissionTo('see-soal'); + $Hardware->givePermissionTo('nilai-praktikan'); + $Hardware->givePermissionTo('see-plot'); + $Hardware->givePermissionTo('ranking-praktikan'); + $Hardware->givePermissionTo('see-polling'); + $Hardware->givePermissionTo('see-pelanggaran'); + $Hardware->givePermissionTo('set-praktikan'); + $Hardware->givePermissionTo('reset-praktikan'); + $Hardware->givePermissionTo('check-tugas-pendahuluan'); + $Hardware->givePermissionTo('change-password'); + $Hardware->givePermissionTo('tp-configuration'); + $Hardware->givePermissionTo('praktikan-regist'); + $Hardware->givePermissionTo('logout'); + + $AsistenSemiUltra->givePermissionTo('manage-profile'); + $AsistenSemiUltra->givePermissionTo('see-praktikum'); + $AsistenSemiUltra->givePermissionTo('see-history'); + $AsistenSemiUltra->givePermissionTo('see-soal'); + $AsistenSemiUltra->givePermissionTo('nilai-praktikan'); + $AsistenSemiUltra->givePermissionTo('see-plot'); + $AsistenSemiUltra->givePermissionTo('ranking-praktikan'); + $AsistenSemiUltra->givePermissionTo('see-polling'); + $AsistenSemiUltra->givePermissionTo('see-pelanggaran'); + $AsistenSemiUltra->givePermissionTo('set-praktikan'); + $AsistenSemiUltra->givePermissionTo('reset-praktikan'); + $AsistenSemiUltra->givePermissionTo('check-tugas-pendahuluan'); + $AsistenSemiUltra->givePermissionTo('change-password'); + $AsistenSemiUltra->givePermissionTo('logout'); + $AsistenSemiUltra->givePermissionTo('manage-modul'); + $AsistenSemiUltra->givePermissionTo('manage-soal'); + $AsistenSemiUltra->givePermissionTo('unlock-jawaban'); + $AsistenSemiUltra->givePermissionTo('manage-praktikum'); + $AsistenSemiUltra->givePermissionTo('see-pelanggaran'); + $AsistenSemiUltra->givePermissionTo('tugas-pendahuluan'); + $AsistenSemiUltra->givePermissionTo('tp-configuration'); + $AsistenSemiUltra->givePermissionTo('praktikan-regist'); + + $AsprakATC->givePermissionTo('manage-profile'); + $AsprakATC->givePermissionTo('see-praktikum'); + $AsprakATC->givePermissionTo('see-history'); + $AsprakATC->givePermissionTo('see-soal'); + $AsprakATC->givePermissionTo('nilai-praktikan'); + $AsprakATC->givePermissionTo('see-plot'); + $AsprakATC->givePermissionTo('ranking-praktikan'); + $AsprakATC->givePermissionTo('see-polling'); + $AsprakATC->givePermissionTo('see-pelanggaran'); + $AsprakATC->givePermissionTo('set-praktikan'); + $AsprakATC->givePermissionTo('reset-praktikan'); + $AsprakATC->givePermissionTo('check-tugas-pendahuluan'); + $AsprakATC->givePermissionTo('change-password'); + $AsprakATC->givePermissionTo('logout'); + $AsprakATC->givePermissionTo('manage-modul'); + $AsprakATC->givePermissionTo('manage-soal'); + $AsprakATC->givePermissionTo('unlock-jawaban'); + $AsprakATC->givePermissionTo('tugas-pendahuluan'); + + $AsprakRDC->givePermissionTo('manage-profile'); + $AsprakRDC->givePermissionTo('see-praktikum'); + $AsprakRDC->givePermissionTo('see-history'); + $AsprakRDC->givePermissionTo('see-soal'); + $AsprakRDC->givePermissionTo('nilai-praktikan'); + $AsprakRDC->givePermissionTo('see-plot'); + $AsprakRDC->givePermissionTo('ranking-praktikan'); + $AsprakRDC->givePermissionTo('see-polling'); + $AsprakRDC->givePermissionTo('see-pelanggaran'); + $AsprakRDC->givePermissionTo('set-praktikan'); + $AsprakRDC->givePermissionTo('reset-praktikan'); + $AsprakRDC->givePermissionTo('check-tugas-pendahuluan'); + $AsprakRDC->givePermissionTo('change-password'); + $AsprakRDC->givePermissionTo('logout'); + $AsprakRDC->givePermissionTo('manage-praktikum'); + $AsprakRDC->givePermissionTo('tp-configuration'); + $AsprakRDC->givePermissionTo('praktikan-regist'); + $AsprakRDC->givePermissionTo('see-pelanggaran'); + + $AsprakCMD->givePermissionTo('manage-profile'); + $AsprakCMD->givePermissionTo('see-praktikum'); + $AsprakCMD->givePermissionTo('see-history'); + $AsprakCMD->givePermissionTo('see-soal'); + $AsprakCMD->givePermissionTo('nilai-praktikan'); + $AsprakCMD->givePermissionTo('see-plot'); + $AsprakCMD->givePermissionTo('ranking-praktikan'); + $AsprakCMD->givePermissionTo('see-polling'); + $AsprakCMD->givePermissionTo('see-pelanggaran'); + $AsprakCMD->givePermissionTo('set-praktikan'); + $AsprakCMD->givePermissionTo('reset-praktikan'); + $AsprakCMD->givePermissionTo('check-tugas-pendahuluan'); + $AsprakCMD->givePermissionTo('change-password'); + $AsprakCMD->givePermissionTo('logout'); + + $AsprakHRD->givePermissionTo('manage-profile'); + $AsprakHRD->givePermissionTo('see-praktikum'); + $AsprakHRD->givePermissionTo('see-history'); + $AsprakHRD->givePermissionTo('see-soal'); + $AsprakHRD->givePermissionTo('nilai-praktikan'); + $AsprakHRD->givePermissionTo('see-plot'); + $AsprakHRD->givePermissionTo('ranking-praktikan'); + $AsprakHRD->givePermissionTo('see-polling'); + $AsprakHRD->givePermissionTo('see-pelanggaran'); + $AsprakHRD->givePermissionTo('set-praktikan'); + $AsprakHRD->givePermissionTo('reset-praktikan'); + $AsprakHRD->givePermissionTo('check-tugas-pendahuluan'); + $AsprakHRD->givePermissionTo('change-password'); + $AsprakHRD->givePermissionTo('logout'); + + $AsprakMLC->givePermissionTo('manage-profile'); + $AsprakMLC->givePermissionTo('see-praktikum'); + $AsprakMLC->givePermissionTo('see-history'); + $AsprakMLC->givePermissionTo('see-soal'); + $AsprakMLC->givePermissionTo('nilai-praktikan'); + $AsprakMLC->givePermissionTo('see-plot'); + $AsprakMLC->givePermissionTo('ranking-praktikan'); + $AsprakMLC->givePermissionTo('see-polling'); + $AsprakMLC->givePermissionTo('see-pelanggaran'); + $AsprakMLC->givePermissionTo('set-praktikan'); + $AsprakMLC->givePermissionTo('reset-praktikan'); + $AsprakMLC->givePermissionTo('check-tugas-pendahuluan'); + $AsprakMLC->givePermissionTo('change-password'); + $AsprakMLC->givePermissionTo('logout'); } } diff --git a/resources/js/Components/Assistants/Content/ContentLihatTP.jsx b/resources/js/Components/Assistants/Content/ContentLihatTP.jsx index 452f106..02a5629 100644 --- a/resources/js/Components/Assistants/Content/ContentLihatTP.jsx +++ b/resources/js/Components/Assistants/Content/ContentLihatTP.jsx @@ -1,7 +1,120 @@ import MarkdownRenderer from "../../MarkdownRenderer"; +import { Image } from "@imagekit/react"; -export default function ContentLihatTP({ jawabanData, praktikan, modul }) { - const hasData = jawabanData && jawabanData.length > 0; +const parseFileAnswer = (value) => { + if (!value) { + return null; + } + + // Already an object + if ( + typeof value === "object" && + value?.type === "file" && + value?.url + ) { + return value; + } + + // Stored as JSON string in database + if (typeof value === "string") { + try { + const parsed = JSON.parse(value); + + if ( + parsed && + parsed.type === "file" && + parsed.url + ) { + return parsed; + } + } catch { + // Normal text answer, so ignore JSON parsing failure + } + } + + return null; +}; + +const AnswerContent = ({ answer }) => { + if (!answer) { + return ( + + Tidak ada jawaban + + ); + } + + const fileAnswer = parseFileAnswer(answer); + + // Image/file answer + if (fileAnswer) { + return ( +
+ + Jawaban Tugas Pendahuluan + + +
+ + + + + + + Buka gambar penuh + +
+
+ ); + } + + // Normal text answer + return ; +}; + +export default function ContentLihatTP({ + jawabanData, + praktikan, + modul, +}) { + const hasData = + Array.isArray(jawabanData) && + jawabanData.length > 0; return (
@@ -13,27 +126,33 @@ export default function ContentLihatTP({ jawabanData, praktikan, modul }) { Informasi Praktikan
+
Nama + {praktikan.nama}
+
NIM + {praktikan.nim}
+
Modul + {modul.judul} @@ -47,6 +166,7 @@ export default function ContentLihatTP({ jawabanData, praktikan, modul }) {

Jawaban Tugas Pendahuluan + {hasData && ( {jawabanData.length} soal @@ -58,19 +178,32 @@ export default function ContentLihatTP({ jawabanData, praktikan, modul }) {
{hasData ? ( jawabanData.map((item, index) => ( -
+
{/* Question */}
{index + 1} +
- +
{/* Answer */} -
+
- + + + Jawaban
+
- {item.jawaban ? ( - - ) : ( - - Tidak ada jawaban - - )} +
@@ -111,14 +249,26 @@ export default function ContentLihatTP({ jawabanData, praktikan, modul }) { stroke="currentColor" strokeWidth={1.5} > - - + + + -

Belum ada jawaban yang tersubmit untuk modul ini.

+ +

+ Belum ada jawaban yang + tersubmit untuk modul ini. +

)}

); -} \ No newline at end of file +} diff --git a/resources/js/Components/Assistants/Modals/ModalInputNilai.jsx b/resources/js/Components/Assistants/Modals/ModalInputNilai.jsx index dddb471..be40db5 100644 --- a/resources/js/Components/Assistants/Modals/ModalInputNilai.jsx +++ b/resources/js/Components/Assistants/Modals/ModalInputNilai.jsx @@ -251,18 +251,30 @@ export default function ModalInputNilai({ : []; return { - questions: entries.map((item, index) => ({ - soalId: item.soal_id ?? index, - question: - item.soal_text ?? "Soal tidak tersedia", - answer: - typeof item.jawaban === "string" - ? item.jawaban - : "-", - options: [], - selectedOptionId: null, - correctOptionId: null, - })), + questions: entries.map((item, index) => { + const parsed = + normalizeAnswerWithAttachment(item); + + return { + soalId: item.soal_id ?? index, + question: + item.soal_text ?? + "Soal tidak tersedia", + + answer: parsed.answerText, + + attachmentUrl: + parsed.attachmentUrl, + + attachmentFileId: + parsed.attachmentFileId, + + options: [], + selectedOptionId: null, + correctOptionId: null, + }; + }), + notice: data?.message, }; } @@ -325,18 +337,30 @@ export default function ModalInputNilai({ : []; return { - questions: entries.map((item, index) => ({ - soalId: item.soal_id ?? index, - question: - item.soal_text ?? "Soal tidak tersedia", - answer: - typeof item.jawaban === "string" - ? item.jawaban - : "-", - options: [], - selectedOptionId: null, - correctOptionId: null, - })), + questions: entries.map((item, index) => { + const parsed = + normalizeAnswerWithAttachment(item); + + return { + soalId: item.soal_id ?? index, + question: + item.soal_text ?? + "Soal tidak tersedia", + + answer: parsed.answerText, + + attachmentUrl: + parsed.attachmentUrl, + + attachmentFileId: + parsed.attachmentFileId, + + options: [], + selectedOptionId: null, + correctOptionId: null, + }; + }), + notice: data?.message, }; } diff --git a/resources/js/Components/Assistants/Soal/SoalInputEssay.jsx b/resources/js/Components/Assistants/Soal/SoalInputEssay.jsx index 1f338e8..d2e114e 100644 --- a/resources/js/Components/Assistants/Soal/SoalInputEssay.jsx +++ b/resources/js/Components/Assistants/Soal/SoalInputEssay.jsx @@ -53,7 +53,7 @@ export default function SoalInputEssay({ kategoriSoal, modul, modules = [], onMo const controller = getSoalController(kategoriSoal); const supportsFileUpload = useMemo( - () => ["jurnal", "fitb"].includes(kategoriSoal), + () => ["tp", "jurnal", "fitb"].includes(kategoriSoal), [kategoriSoal] ); diff --git a/resources/js/Components/Praktikans/Sections/TugasPendahuluan.jsx b/resources/js/Components/Praktikans/Sections/TugasPendahuluan.jsx index 1891ed5..e3223bb 100644 --- a/resources/js/Components/Praktikans/Sections/TugasPendahuluan.jsx +++ b/resources/js/Components/Praktikans/Sections/TugasPendahuluan.jsx @@ -1,6 +1,9 @@ -import { useEffect } from "react"; +import { useEffect, useState } from "react"; +import { Image } from "@imagekit/react"; + import QuestionCommentInput from "./QuestionCommentInput"; import MarkdownRenderer from "../../MarkdownRenderer"; +import { useImageKitUpload } from "@/hooks/useImageKitUpload"; export default function TugasPendahuluan({ isLoading = false, @@ -16,26 +19,196 @@ export default function TugasPendahuluan({ showSubmitButton = false, submitLabel = "Simpan Jawaban", }) { + const [uploadingIndexes, setUploadingIndexes] = + useState({}); + + const [uploadProgress, setUploadProgress] = + useState({}); + + const [previews, setPreviews] = + useState({}); + + const { upload } = useImageKitUpload(); + useEffect(() => { - setQuestionsCount(questions.length); + setQuestionsCount( + Array.isArray(questions) + ? questions.length + : 0 + ); }, [questions, setQuestionsCount]); const handleInputChange = (index, value) => { const updated = [...answers]; + updated[index] = value; + + setAnswers(updated); + }; + + const triggerFileInput = (index) => { + const input = document.getElementById( + `tp-file-upload-${index}` + ); + + if (input) { + input.click(); + } + }; + + const handleFileUpload = async (index, file) => { + if (!file) { + return; + } + + // Same 10MB limit as Journal/FITB + if (file.size > 10485760) { + alert("File size must be less than 10MB"); + return; + } + + // Images only + if (!file.type.startsWith("image/")) { + alert("Please upload an image file"); + return; + } + + setUploadingIndexes((previous) => ({ + ...previous, + [index]: true, + })); + + setUploadProgress((previous) => ({ + ...previous, + [index]: 0, + })); + + try { + /* + * Local preview while upload is happening. + */ + const previewUrl = + URL.createObjectURL(file); + + setPreviews((previous) => ({ + ...previous, + [index]: previewUrl, + })); + + /* + * Same ImageKit hook used by Journal/FITB. + * + * Only change is the folder: + * daskom/jawaban-tp + */ + const uploadResult = await upload( + file, + "daskom/jawaban-tp", + null, + true + ); + + /* + * Use the exact same answer format + * as Journal/FITB. + */ + const updated = [...answers]; + + updated[index] = { + type: "file", + url: uploadResult.url, + fileId: uploadResult.fileId, + filePath: uploadResult.filePath, + }; + + setAnswers(updated); + } catch (error) { + console.error( + "TP upload error:", + error + ); + + alert( + "Failed to upload file. Please try again." + ); + + setPreviews((previous) => { + const next = { + ...previous, + }; + + if (next[index]) { + URL.revokeObjectURL( + next[index] + ); + + delete next[index]; + } + + return next; + }); + } finally { + setUploadingIndexes((previous) => { + const next = { + ...previous, + }; + + delete next[index]; + + return next; + }); + + setUploadProgress((previous) => { + const next = { + ...previous, + }; + + delete next[index]; + + return next; + }); + } + }; + + const handleDeleteFile = (index) => { + const updated = [...answers]; + + updated[index] = ""; + setAnswers(updated); + + setPreviews((previous) => { + const next = { + ...previous, + }; + + if (next[index]) { + URL.revokeObjectURL( + next[index] + ); + + delete next[index]; + } + + return next; + }); }; const handleSubmit = () => { if (onSubmitTask) { - onSubmitTask("TugasPendahuluan", answers); + onSubmitTask( + "TugasPendahuluan", + answers + ); } }; if (isLoading) { return (
-

Memuat soal tugas pendahuluan...

+

+ Memuat soal tugas pendahuluan... +

); } @@ -43,15 +216,23 @@ export default function TugasPendahuluan({ if (errorMessage) { return (
-

{errorMessage}

+

+ {errorMessage} +

); } - if (!Array.isArray(questions) || questions.length === 0) { + if ( + !Array.isArray(questions) || + questions.length === 0 + ) { return (
-

Belum ada soal tugas pendahuluan untuk modul ini.

+

+ Belum ada soal tugas pendahuluan + untuk modul ini. +

); } @@ -60,31 +241,277 @@ export default function TugasPendahuluan({ <>
- {questions.map((question, index) => ( -
-
- - {index + 1} - -
- + {questions.map( + (question, index) => { + const isFileUploadEnabled = + question.enable_file_upload || + false; + + const currentAnswer = + answers[index]; + + const isFileAnswer = + typeof currentAnswer === + "object" && + currentAnswer?.type === + "file"; + + return ( +
+
+ + {index + 1} + + +
+ +
+
+ + + + {isFileUploadEnabled ? ( +
+ {!isFileAnswer && + !previews[ + index + ] ? ( +
+ + +
+ +
+
+ ) : ( +
+ {uploadingIndexes[ + index + ] ? ( +
+
+ +

+ Uploading... +

+
+ ) : ( + <> + {isFileAnswer && + currentAnswer?.url ? ( + Uploaded TP answer + ) : previews[ + index + ] ? ( + TP answer preview + ) : null} + + + +
+ +
+ + )} +
+ )} + + { + const file = + event + .target + .files?.[0]; + + if ( + file + ) { + handleFileUpload( + index, + file + ); + } + + event.target.value = + ""; + }} + disabled={ + uploadingIndexes[ + index + ] + } + /> +
+ ) : ( + -
- ))} + ); + } + )}
@@ -93,9 +520,18 @@ export default function TugasPendahuluan({
)} diff --git a/resources/js/Pages/Praktikan/TugasPendahuluanPage.jsx b/resources/js/Pages/Praktikan/TugasPendahuluanPage.jsx index 3ed2510..6589331 100644 --- a/resources/js/Pages/Praktikan/TugasPendahuluanPage.jsx +++ b/resources/js/Pages/Praktikan/TugasPendahuluanPage.jsx @@ -21,8 +21,88 @@ const normaliseQuestions = (items) => id: item.id, text: item.soal ?? item.pertanyaan ?? "", questionType: "essay", + enable_file_upload: Boolean(item.enable_file_upload), })); +const isLikelyJsonObjectString = (value) => { + if (typeof value !== "string") { + return false; + } + + const trimmed = value.trim(); + + if (trimmed === "") { + return false; + } + + return ( + (trimmed.startsWith("{") && trimmed.endsWith("}")) || + (trimmed.startsWith("[") && trimmed.endsWith("]")) + ); +}; + +const hydrateAnswer = (storedAnswer) => { + if (storedAnswer === null || storedAnswer === undefined) { + return ""; + } + + if (typeof storedAnswer === "object") { + return storedAnswer; + } + + if (typeof storedAnswer !== "string") { + return String(storedAnswer ?? ""); + } + + const trimmed = storedAnswer.trim(); + + if (trimmed === "") { + return ""; + } + + if (isLikelyJsonObjectString(trimmed)) { + try { + const parsed = JSON.parse(trimmed); + + if (parsed && typeof parsed === "object") { + return parsed; + } + } catch (error) { + console.warn( + "[TP] Failed to parse stored answer", + error + ); + } + } + + return storedAnswer; +}; + +const serialiseAnswerForSubmission = (answerValue) => { + if (answerValue === null || answerValue === undefined) { + return ""; + } + + if (typeof answerValue === "object") { + try { + return JSON.stringify(answerValue); + } catch (error) { + console.warn( + "[TP] Failed to stringify answer", + error + ); + + return ""; + } + } + + if (typeof answerValue === "string") { + return answerValue; + } + + return String(answerValue ?? ""); +}; + export default function TugasPendahuluanPage() { const { auth } = usePage().props ?? {}; const praktikan = auth?.praktikan ?? null; @@ -153,7 +233,10 @@ export default function TugasPendahuluanPage() { storedAnswers.map((item) => [Number(item?.soal_id), item?.jawaban ?? ""]) ); - const initialAnswers = data.map((question) => answerMap.get(Number(question.id)) ?? ""); + const initialAnswers = data.map((question) => { + const storedAnswer = answerMap.get(Number(question.id)); + return hydrateAnswer(storedAnswer); + }); setAnswers(initialAnswers); }, [answersQuery.data, questionsQuery.data]); @@ -186,7 +269,7 @@ export default function TugasPendahuluanPage() { soal_id: Number(question.id), praktikan_id: praktikanId, modul_id: Number(selectedModul), - jawaban: String(currentAnswers[index] ?? "-").trim() || "-", + jawaban: serialiseAnswerForSubmission(currentAnswers[index]) || "-", })); submitMutation.mutate(payload);