edit pelatih

This commit is contained in:
SitiAfiah 2026-05-04 00:38:18 +07:00
parent b73d74ebee
commit 723a179871
8 changed files with 62 additions and 39 deletions

View File

@ -3,6 +3,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Anggota; use App\Models\Anggota;
use App\Models\Kolat;
use App\Models\Role; use App\Models\Role;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@ -74,19 +75,25 @@ public function store(Request $request)
// Menampilkan form edit data kepelatihan (misal perpanjang SK) // Menampilkan form edit data kepelatihan (misal perpanjang SK)
public function edit($id) public function edit($id)
{ {
$pelatih = Anggota::findOrFail($id);
return view('pelatih.editpelatih', compact('pelatih')); $pelatih = Anggota::findOrFail($id);
} $data_kolat = Kolat::all();
return view('pelatih.editpelatih', compact('pelatih', 'data_kolat'));
}
public function update(Request $request, $id) public function update(Request $request, $id)
{ {
$pelatih = Anggota::findOrFail($id); $pelatih = Anggota::findOrFail($id);
$request->validate([ $request->validate([
'no_sk' => 'required|unique:anggotas,no_sk,' . $id, 'nama_lengkap' => 'required|string|max:255',
'tgl_sk' => 'required|date', 'email' => 'required|email|unique:users,email,' . $pelatih->user_id, // validasi email user
'foto_sk' => 'nullable|image|max:2048', 'no_hp' => 'required',
]); 'no_sk' => 'required|unique:anggotas,no_sk,' . $id, // pastikan nama tabel benar 'anggota'
'tgl_sk' => 'nullable|date', // tambahkan jika di form ada tgl_sk
'foto_sk' => 'nullable|image|max:2048',
]);
$data = $request->all(); $data = $request->all();

View File

@ -8,6 +8,9 @@
class Pelatih extends Model class Pelatih extends Model
{ {
protected $table = 'anggota';
// Kolom yang boleh diisi massal // Kolom yang boleh diisi massal
protected $fillable = [ protected $fillable = [
'anggota_id', 'anggota_id',
@ -23,4 +26,9 @@ public function anggota(): BelongsTo
{ {
return $this->belongsTo(Anggota::class, 'anggota_id'); return $this->belongsTo(Anggota::class, 'anggota_id');
} }
// public function kolat(): BelongsTo
// {
// return $this->belongsTo(Kolat::class, 'kolat_id');
// }
} }

View File

@ -13,7 +13,7 @@ class DatabaseSeeder extends Seeder
public function run(): void public function run(): void
{ {
$this->call([ $this->call([
RoleSeeder::class, // RoleSeeder::class,
KolatSeeder::class, KolatSeeder::class,
UserSeeder::class, UserSeeder::class,
]); ]);

View File

@ -14,8 +14,8 @@ class KolatSeeder extends Seeder
public function run(): void public function run(): void
{ {
DB::table('kolat')->insert([ DB::table('kolat')->insert([
'id' => 1, // Kita paksa ID 1 biar nyambung sama UserSeeder tadi 'id' => 2, // Kita paksa ID 1 biar nyambung sama UserSeeder tadi
'nama_kolat' => 'Kolat Polije', 'nama_kolat' => 'Kolat Unej',
'created_at' => now(), 'created_at' => now(),
'updated_at' => now(), 'updated_at' => now(),
]); ]);

View File

@ -60,7 +60,6 @@
<div class="col-md-6"> <div class="col-md-6">
<label class="form-label fw-bold">No. WhatsApp</label> <label class="form-label fw-bold">No. WhatsApp</label>
<div class="input-group"> <div class="input-group">
<span class="input-group-text bg-light">+62</span>
<input type="number" name="no_hp" class="form-control" value="{{ old('no_hp', $anggota->no_hp) }}" required> <input type="number" name="no_hp" class="form-control" value="{{ old('no_hp', $anggota->no_hp) }}" required>
</div> </div>
</div> </div>

View File

@ -11,6 +11,15 @@ class="text-muted text-decoration-none small">Daftar Pelatih</a></li>
</ol> </ol>
</nav> </nav>
<h3 class="fw-bold text-dark">Form Edit Data Pelatih</h3> <h3 class="fw-bold text-dark">Form Edit Data Pelatih</h3>
@if ($errors->any())
<div class="alert alert-danger shadow-sm" style="border-radius: 12px;">
<ul class="mb-0">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<p class="text-muted small">Perbarui profil pribadi dan legalitas SK pelatih <strong>{{ $pelatih->nama_lengkap }}</strong>.</p> <p class="text-muted small">Perbarui profil pribadi dan legalitas SK pelatih <strong>{{ $pelatih->nama_lengkap }}</strong>.</p>
</div> </div>

View File

@ -154,10 +154,10 @@
<!-- Avatar Inisial --> <!-- Avatar Inisial -->
<div class="rounded-circle bg-primary text-white d-flex align-items-center justify-content-center me-3 shadow-sm" <div class="rounded-circle bg-primary text-white d-flex align-items-center justify-content-center me-3 shadow-sm"
style="width: 40px; height: 40px; font-size: 14px; font-weight: bold; background: linear-gradient(45deg, #0d6efd, #0099bc);"> style="width: 40px; height: 40px; font-size: 14px; font-weight: bold; background: linear-gradient(45deg, #0d6efd, #0099bc);">
{{ strtoupper(substr($spp->anggota->nama, 0, 1)) }} {{ strtoupper(substr($spp->anggota->nama_lengkap, 0, 1)) }}
</div> </div>
<div> <div>
<div class="fw-bold text-dark" style="font-size: 0.95rem;">{{ $spp->anggota->nama }}</div> <div class="fw-bold text-dark" style="font-size: 0.95rem;">{{ $spp->anggota->nama_lengkap }}</div>
<span class="badge bg-light text-muted border fw-normal" style="font-size: 0.75rem;"> <span class="badge bg-light text-muted border fw-normal" style="font-size: 0.75rem;">
ID: {{ $spp->anggota_id }} ID: {{ $spp->anggota_id }}
</span> </span>

View File

@ -94,6 +94,30 @@
// Rute untuk Presensi // Rute untuk Presensi
Route::prefix('presensi')->name('presensi.')->group(function () { Route::prefix('presensi')->name('presensi.')->group(function () {
Route::get('/', [PresensiController::class, 'index'])->name('index');
// Halaman daftar kehadiran anggota pada jadwal tertentu (tampil QR Code & List)
Route::get('/kehadiran/{jadwal_id}', [PresensiController::class, 'kehadiran'])->name('kehadiran');
// Proses konfirmasi/verifikasi pelatih klik tombol "Sah"
Route::post('/konfirmasi/{presensi_id}', [PresensiController::class, 'konfirmasi'])->name('konfirmasi');
// Proses tambah presensi manual (Kasus Lupa HP)
Route::post('/tambah-manual', [PresensiController::class, 'storeManual'])->name('storeManual');
// --- AKTOR: ANGGOTA ---
// Halaman daftar jadwal hari ini di sisi anggota (Tampil tombol "Scan Absen")
Route::get('/anggota', [PresensiController::class, 'indexAnggota'])->name('anggota.index');
Route::get('/riwayat', [PresensiController::class, 'riwayatAnggota'])->name('anggota.riwayat');
// Halaman Kamera Scanner (Tempat anggota men-scan QR Code pelatih)
Route::get('/scan/{jadwal_id}', [PresensiController::class, 'scan'])->name('anggota.scan');
// Proses penyimpanan absen mandiri setelah sukses scan
Route::post('/store-mandiri', [PresensiController::class, 'storeMandiri'])->name('storeMandiri');
});
//Penialaian //Penialaian
@ -124,30 +148,6 @@
// --- AKTOR: PENGURUS / PELATIH --- // --- AKTOR: PENGURUS / PELATIH ---
// Halaman utama rekap jadwal (untuk pilih jadwal mana yang mau dicek) // Halaman utama rekap jadwal (untuk pilih jadwal mana yang mau dicek)
Route::get('/', [PresensiController::class, 'index'])->name('index');
// Halaman daftar kehadiran anggota pada jadwal tertentu (tampil QR Code & List)
Route::get('/kehadiran/{jadwal_id}', [PresensiController::class, 'kehadiran'])->name('kehadiran');
// Proses konfirmasi/verifikasi pelatih klik tombol "Sah"
Route::post('/konfirmasi/{presensi_id}', [PresensiController::class, 'konfirmasi'])->name('konfirmasi');
// Proses tambah presensi manual (Kasus Lupa HP)
Route::post('/tambah-manual', [PresensiController::class, 'storeManual'])->name('storeManual');
// --- AKTOR: ANGGOTA ---
// Halaman daftar jadwal hari ini di sisi anggota (Tampil tombol "Scan Absen")
Route::get('/anggota', [PresensiController::class, 'indexAnggota'])->name('anggota.index');
Route::get('/riwayat', [PresensiController::class, 'riwayatAnggota'])->name('anggota.riwayat');
// Halaman Kamera Scanner (Tempat anggota men-scan QR Code pelatih)
Route::get('/scan/{jadwal_id}', [PresensiController::class, 'scan'])->name('anggota.scan');
// Proses penyimpanan absen mandiri setelah sukses scan
Route::post('/store-mandiri', [PresensiController::class, 'storeMandiri'])->name('storeMandiri');
});
}); });