pengumuman (masih eror)
This commit is contained in:
parent
a53eefa96e
commit
2092a810ce
|
|
@ -12,9 +12,12 @@ class AnggotaController extends Controller
|
|||
// 1. Menampilkan Daftar Anggota
|
||||
public function anggota()
|
||||
{
|
||||
// Menggunakan with('kolat') agar data relasi langsung terbawa (Eager Loading)
|
||||
$data_anggota = Anggota::with(['kolat', 'role'])->get();
|
||||
return view('anggota.anggota', compact('data_anggota'));
|
||||
// Filter data: Ambil anggota yang relasi 'role'-nya bernama 'Anggota'
|
||||
$data_anggota = Anggota::whereHas('role', function($query) {
|
||||
$query->where('nama_role', 'Anggota');
|
||||
})->with(['kolat', 'role'])->get();
|
||||
|
||||
return view('anggota.anggota', compact('data_anggota'));
|
||||
}
|
||||
|
||||
// 2. Menampilkan Form Tambah
|
||||
|
|
@ -22,52 +25,55 @@ public function create()
|
|||
{
|
||||
// Ambil semua daftar kolat untuk ditampilkan di dropdown form
|
||||
$data_kolat = Kolat::all();
|
||||
return view('anggota.anggotacreate', compact('data_kolat'));
|
||||
$data_role = Role::all();
|
||||
|
||||
return view('anggota.anggotacreate', compact('data_kolat', 'data_role'));
|
||||
}
|
||||
|
||||
// 3. Menyimpan Anggota Baru
|
||||
public function store(Request $request)
|
||||
{
|
||||
// Validasi data
|
||||
$request->validate([
|
||||
'nama_lengkap' => 'required',
|
||||
'jabatan' => 'required|in:pengurus,pelatih,anggota',
|
||||
'no_hp' => 'required',
|
||||
'role_id' => 'required',
|
||||
'kolat_id' => 'required|exists:kolat,id', // Validasi ID kolat harus ada di tabel kolat
|
||||
]);
|
||||
{
|
||||
// 1. Validasi diperbaiki (Hapus jabatan dari required karena kita isi manual)
|
||||
$request->validate([
|
||||
'nama_lengkap' => 'required',
|
||||
'no_hp' => 'required',
|
||||
'role_id' => 'required|exists:role,id', // pastikan nama tabel benar
|
||||
'kolat_id' => 'required|exists:kolat,id',
|
||||
'jenis_kelamin'=> 'required',
|
||||
'tempat_lahir' => 'required',
|
||||
'tgl_lahir' => 'required|date',
|
||||
'tingkatan' => 'required',
|
||||
'tgl_gabung' => 'required|date',
|
||||
]);
|
||||
|
||||
// Logika Membuat No Induk Otomatis (JB-001)
|
||||
$terakhir = Anggota::orderBy('id', 'desc')->first();
|
||||
// 2. Ambil nama role untuk mengisi kolom jabatan secara otomatis
|
||||
$role = Role::find($request->role_id);
|
||||
$nama_jabatan = strtolower($role->nama_role);
|
||||
|
||||
if (!$terakhir) {
|
||||
$nomor_urut = "001";
|
||||
} else {
|
||||
// Ambil angka setelah "JB-" (JB-001 -> 001)
|
||||
$nomor_terakhir = substr($terakhir->no_induk, 3);
|
||||
$nomor_urut = sprintf("%03d", intval($nomor_terakhir) + 1);
|
||||
}
|
||||
// 3. Logika No Induk
|
||||
$terakhir = Anggota::orderBy('id', 'desc')->first();
|
||||
$nomor_urut = $terakhir ? sprintf("%03d", intval(substr($terakhir->no_induk, 3)) + 1) : "001";
|
||||
$no_induk_baru = "JB-" . $nomor_urut;
|
||||
|
||||
$no_induk_baru = "JB-" . $nomor_urut;
|
||||
// 4. Gabungkan semua data
|
||||
$data = $request->all();
|
||||
$data['no_induk'] = $no_induk_baru;
|
||||
$data['jabatan'] = $nama_jabatan; // Mengisi kolom jabatan otomatis
|
||||
|
||||
// Gabungkan data input dengan No Induk otomatis
|
||||
$data = $request->all();
|
||||
$data['no_induk'] = $no_induk_baru;
|
||||
// 5. Simpan (Pastikan fillable di Model sudah lengkap)
|
||||
Anggota::create($data);
|
||||
|
||||
// Simpan ke database
|
||||
Anggota::create($data);
|
||||
|
||||
return redirect()->route('anggota.anggota')
|
||||
->with('success', 'Anggota ' . $request->nama_lengkap . ' berhasil terdaftar dengan ID: ' . $no_induk_baru);
|
||||
}
|
||||
return redirect()->route('anggota.anggota')
|
||||
->with('success', 'Anggota berhasil terdaftar!');
|
||||
}
|
||||
|
||||
// 4. Menampilkan Form Edit
|
||||
public function edit($id)
|
||||
{
|
||||
$anggota = Anggota::findOrFail($id);
|
||||
$data_kolat = Kolat::all(); // Ambil daftar kolat lagi untuk pilihan saat edit
|
||||
$data_role = Role::all();
|
||||
|
||||
return view('anggota.editanggota', compact('anggota', 'data_kolat'));
|
||||
return view('anggota.editanggota', compact('anggota', 'data_kolat', 'data_role'));
|
||||
}
|
||||
|
||||
// 5. Update Data Anggota
|
||||
|
|
@ -89,4 +95,5 @@ public function update(Request $request, $id)
|
|||
return redirect()->route('anggota.anggota')
|
||||
->with('success', 'Data ' . $anggota->nama_lengkap . ' Berhasil Diperbarui!');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,103 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Jadwal;
|
||||
use App\Models\Kolat;
|
||||
use App\Models\Anggota;
|
||||
use App\Models\Role;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class JadwalController extends Controller
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
// Mengambil data jadwal beserta relasi kolat dan pelatih
|
||||
$data_jadwal = Jadwal::with(['kolat', 'pelatih'])->orderBy('tanggal', 'desc')->get();
|
||||
|
||||
return view('jadwal.jadwal', compact('data_jadwal'));
|
||||
}
|
||||
|
||||
|
||||
public function create()
|
||||
{
|
||||
$data_kolat = Kolat::all();
|
||||
$rolePelatih = Role::where('nama_role', 'Pelatih')->first();
|
||||
|
||||
// Ambil Anggota yang memiliki role 'Pelatih' saja (filter lewat relasi)
|
||||
$data_pelatih = Anggota::whereHas('role', function($query) {
|
||||
$query->where('nama_role', 'Pelatih');
|
||||
})->get();
|
||||
|
||||
return view('jadwal.jadwalcreate', compact('data_kolat', 'data_pelatih'));
|
||||
}
|
||||
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'judul_kegiatan' => 'required|string|max:255',
|
||||
'kolat_id' => 'required|exists:kolat,id',
|
||||
'pelatih_id' => 'required|exists:anggotas,id',
|
||||
'jenis' => 'required|in:Rutin,Tambahan,Pengumuman',
|
||||
'tanggal' => 'required|date',
|
||||
'jam_mulai' => 'required',
|
||||
'lokasi' => 'required|string',
|
||||
]);
|
||||
|
||||
Jadwal::create($request->all());
|
||||
|
||||
return redirect()->route('jadwal.index')
|
||||
->with('success', 'Jadwal latihan berhasil ditambahkan!');
|
||||
}
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
// Ambil satu data dengan relasinya
|
||||
$jadwal = Jadwal::with(['kolat', 'pelatih'])->findOrFail($id);
|
||||
|
||||
return view('jadwal.show', compact('jadwal'));
|
||||
}
|
||||
|
||||
public function edit($id)
|
||||
{
|
||||
$jadwal = Jadwal::findOrFail($id);
|
||||
$data_kolat = Kolat::all();
|
||||
|
||||
// Tetap filter agar hanya muncul daftar pelatih
|
||||
$data_pelatih = Anggota::whereHas('role', function($query) {
|
||||
$query->where('nama_role', 'Pelatih');
|
||||
})->get();
|
||||
|
||||
return view('jadwal.edit', compact('jadwal', 'data_kolat', 'data_pelatih'));
|
||||
}
|
||||
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$jadwal = Jadwal::findOrFail($id);
|
||||
|
||||
$request->validate([
|
||||
'judul_kegiatan' => 'required|string',
|
||||
'kolat_id' => 'required',
|
||||
'pelatih_id' => 'required',
|
||||
'tanggal' => 'required|date',
|
||||
]);
|
||||
|
||||
$jadwal->update($request->all());
|
||||
|
||||
return redirect()->route('jadwal.index')
|
||||
->with('success', 'Jadwal berhasil diperbarui!');
|
||||
}
|
||||
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
$jadwal = Jadwal::findOrFail($id);
|
||||
$jadwal->delete();
|
||||
|
||||
return redirect()->route('jadwal.index')
|
||||
->with('success', 'Jadwal telah dihapus dari sistem.');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,12 +1,104 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
//use Illuminate\Http\Request;
|
||||
|
||||
use App\Models\Anggota;
|
||||
use App\Models\Role;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class PelatihController extends Controller
|
||||
{
|
||||
public function pelatih()
|
||||
// Menampilkan daftar anggota yang sudah menjadi pelatih
|
||||
public function index()
|
||||
{
|
||||
return view('pelatih.pelatih');
|
||||
// Asumsi: Role pelatih memiliki nama 'Pelatih' di tabel roles
|
||||
$data_pelatih = Anggota::whereHas('role', function($q) {
|
||||
$q->where('nama_role', 'Pelatih');
|
||||
})->with('kolat')->get();
|
||||
|
||||
return view('pelatih.pelatih', compact('data_pelatih'));
|
||||
}
|
||||
|
||||
// Menampilkan form untuk upgrade anggota ke pelatih
|
||||
public function create()
|
||||
{
|
||||
// Ambil anggota yang role-nya masih 'Anggota' (bukan pelatih)
|
||||
$calon_pelatih = Anggota::whereHas('role', function($q) {
|
||||
$q->where('nama_role', 'Anggota');
|
||||
})->get();
|
||||
|
||||
return view('pelatih.pelatihcreate', compact('calon_pelatih'));
|
||||
}
|
||||
|
||||
// Proses Upgrade Anggota ke Pelatih
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'anggota_id' => 'required|exists:anggotas,id',
|
||||
'no_sk' => 'required|unique:anggotas,no_sk',
|
||||
'tgl_sk' => 'required|date',
|
||||
'masa_berlaku' => 'required|date',
|
||||
'foto_sk' => 'nullable|image|mimes:jpg,png,jpeg|max:2048',
|
||||
]);
|
||||
|
||||
// Cari data anggota berdasarkan ID yang dipilih
|
||||
$anggota = Anggota::findOrFail($request->anggota_id);
|
||||
|
||||
// Cari ID Role Pelatih
|
||||
$rolePelatih = Role::where('nama_role', 'Pelatih')->first();
|
||||
|
||||
// Data yang akan diupdate
|
||||
$updateData = [
|
||||
'role_id' => $rolePelatih->id,
|
||||
'jabatan' => 'pelatih', // Update status jabatan
|
||||
'no_sk' => $request->no_sk,
|
||||
'tgl_sk' => $request->tgl_sk,
|
||||
'masa_berlaku' => $request->masa_berlaku,
|
||||
'status' => 'Aktif',
|
||||
];
|
||||
|
||||
// Handle upload foto SK jika ada
|
||||
if ($request->hasFile('foto_sk')) {
|
||||
$path = $request->file('foto_sk')->store('sk_pelatih', 'public');
|
||||
$updateData['foto_sk'] = $path;
|
||||
}
|
||||
|
||||
// Eksekusi Update
|
||||
$anggota->update($updateData);
|
||||
|
||||
return redirect()->route('pelatih.index')
|
||||
->with('success', $anggota->nama_lengkap . ' berhasil diupgrade menjadi Pelatih!');
|
||||
}
|
||||
|
||||
// Menampilkan form edit data kepelatihan (misal perpanjang SK)
|
||||
public function edit($id)
|
||||
{
|
||||
$pelatih = Anggota::findOrFail($id);
|
||||
return view('pelatih.edit', compact('pelatih'));
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$pelatih = Anggota::findOrFail($id);
|
||||
|
||||
$request->validate([
|
||||
'no_sk' => 'required|unique:anggotas,no_sk,' . $id,
|
||||
'tgl_sk' => 'required|date',
|
||||
'foto_sk' => 'nullable|image|max:2048',
|
||||
]);
|
||||
|
||||
$data = $request->all();
|
||||
|
||||
if ($request->hasFile('foto_sk')) {
|
||||
if ($pelatih->foto_sk) {
|
||||
Storage::disk('public')->delete($pelatih->foto_sk);
|
||||
}
|
||||
$data['foto_sk'] = $request->file('foto_sk')->store('sk_pelatih', 'public');
|
||||
}
|
||||
|
||||
$pelatih->update($data);
|
||||
|
||||
return redirect()->route('pelatih.index')->with('success', 'Data kepelatihan diperbarui!');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PenilaianController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class PresensiController extends Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
|
|
@ -13,20 +13,11 @@ class Anggota extends Model
|
|||
protected $table = 'anggotas';
|
||||
|
||||
protected $fillable = [
|
||||
'no_induk',
|
||||
'nama_lengkap',
|
||||
'role_id',
|
||||
'jenis_kelamin',
|
||||
'tempat_lahir',
|
||||
'tgl_lahir',
|
||||
'no_hp',
|
||||
'kolat_id',
|
||||
'tingkatan',
|
||||
'tgl_gabung',
|
||||
'status',
|
||||
'alamat',
|
||||
'catatan_medis'
|
||||
];
|
||||
'no_induk', 'nama_lengkap', 'role_id', 'jenis_kelamin',
|
||||
'tempat_lahir', 'tgl_lahir', 'no_hp', 'kolat_id',
|
||||
'tingkatan', 'tgl_gabung', 'status', 'alamat',
|
||||
'catatan_medis', 'jabatan', 'no_sk', 'masa_berlaku', 'foto_sk'
|
||||
];
|
||||
|
||||
public function kolat()
|
||||
{
|
||||
|
|
@ -38,4 +29,23 @@ public function role()
|
|||
{
|
||||
return $this->belongsTo(Role::class, 'role_id');
|
||||
}
|
||||
|
||||
// Relasi: Mendapatkan riwayat kehadiran anggota
|
||||
public function riwayatPresensi()
|
||||
{
|
||||
return $this->hasMany(Presensi::class, 'anggota_id');
|
||||
}
|
||||
|
||||
// Relasi: Jika dia pelatih, mendapatkan semua jadwal tugasnya
|
||||
public function jadwalMelatih()
|
||||
{
|
||||
return $this->hasMany(Jadwal::class, 'pelatih_id');
|
||||
}
|
||||
|
||||
// Relasi: Jika dia pelatih, mendapatkan semua evaluasi dari murid
|
||||
public function evaluasiMasuk()
|
||||
{
|
||||
return $this->hasMany(Penilaian::class, 'pelatih_id');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Models\Presensi;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Jadwal extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $fillable = [
|
||||
'kolat_id',
|
||||
'pelatih_id',
|
||||
'judul_kegiatan',
|
||||
'jenis',
|
||||
'tanggal',
|
||||
'jam_mulai',
|
||||
'jam_selesai',
|
||||
'lokasi',
|
||||
'deskripsi'
|
||||
];
|
||||
|
||||
// Relasi: Jadwal ini milik Kolat mana?
|
||||
public function kolat()
|
||||
{
|
||||
return $this->belongsTo(Kolat::class, 'kolat_id');
|
||||
}
|
||||
|
||||
// Relasi: Siapa pelatih yang bertugas di jadwal ini?
|
||||
public function pelatih()
|
||||
{
|
||||
return $this->belongsTo(Anggota::class, 'pelatih_id');
|
||||
}
|
||||
|
||||
// Relasi: Jadwal ini punya banyak data presensi anggota
|
||||
public function presensi()
|
||||
{
|
||||
return $this->hasMany(Presensi::class, 'jadwal_id');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Penilaian extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $fillable = [
|
||||
'pelatih_id',
|
||||
'anggota_id',
|
||||
'bulan_evaluasi',
|
||||
'kedisiplinan',
|
||||
'kejelasan_materi',
|
||||
'penguasaan_teknik',
|
||||
'sikap_perilaku',
|
||||
'kritik_saran'
|
||||
];
|
||||
|
||||
// Relasi: Siapa pelatih yang sedang dinilai?
|
||||
public function pelatih()
|
||||
{
|
||||
return $this->belongsTo(Anggota::class, 'pelatih_id');
|
||||
}
|
||||
|
||||
// Relasi: Siapa anggota yang memberikan nilai (penilai)?
|
||||
public function penilai()
|
||||
{
|
||||
return $this->belongsTo(Anggota::class, 'anggota_id');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Presensi extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
protected $fillable = [
|
||||
'jadwal_id',
|
||||
'anggota_id',
|
||||
'status',
|
||||
'keterangan',
|
||||
'waktu_presensi'
|
||||
];
|
||||
|
||||
// Relasi: Presensi ini untuk jadwal yang mana?
|
||||
public function jadwal()
|
||||
{
|
||||
return $this->belongsTo(Jadwal::class, 'jadwal_id');
|
||||
}
|
||||
|
||||
// Relasi: Siapa anggota yang melakukan presensi?
|
||||
public function anggota()
|
||||
{
|
||||
return $this->belongsTo(Anggota::class, 'anggota_id');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('jadwals', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('kolat_id')->constrained('kolat')->onDelete('cascade');
|
||||
$table->foreignId('pelatih_id')->constrained('anggotas')->onDelete('cascade'); // Relasi ke anggota (yang rolenya pelatih)
|
||||
$table->string('judul_kegiatan'); // Misal: Latihan Rutin, UKT, atau Pengumuman Libur
|
||||
$table->enum('jenis', ['Rutin', 'Tambahan', 'Pengumuman']);
|
||||
$table->date('tanggal');
|
||||
$table->time('jam_mulai');
|
||||
$table->time('jam_selesai')->nullable();
|
||||
$table->string('lokasi');
|
||||
$table->text('deskripsi')->nullable(); // Untuk isi pengumuman
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('jadwals');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('presensis', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('jadwal_id')->constrained('jadwals')->onDelete('cascade');
|
||||
$table->foreignId('anggota_id')->constrained('anggotas')->onDelete('cascade');
|
||||
$table->enum('status', ['Hadir', 'Izin', 'Sakit', 'Alfa'])->default('Alfa');
|
||||
$table->text('keterangan')->nullable(); // Alasan izin/sakit
|
||||
$table->timestamp('waktu_presensi')->nullable(); // Catat jam tepatnya dia absen
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('presensis');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('penilaians', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->foreignId('pelatih_id')->constrained('anggotas')->onDelete('cascade'); // Pelatih yang dinilai
|
||||
$table->foreignId('anggota_id')->constrained('anggotas')->onDelete('cascade'); // Anggota yang menilai
|
||||
$table->date('bulan_evaluasi'); // Untuk menandai evaluasi bulan apa
|
||||
|
||||
// Kriteria Evaluasi Pelatih (Skala 1-5 atau 1-10)
|
||||
$table->integer('kedisiplinan')->default(0);
|
||||
$table->integer('kejelasan_materi')->default(0);
|
||||
$table->integer('penguasaan_teknik')->default(0);
|
||||
$table->integer('sikap_perilaku')->default(0); // Etika pelatih
|
||||
$table->text('kritik_saran')->nullable(); // Masukan dari anggota
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('penilaians');
|
||||
}
|
||||
};
|
||||
|
|
@ -42,41 +42,28 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($data_anggota as $no => $item)
|
||||
@forelse ($data_anggota as $no => $item)
|
||||
<tr>
|
||||
<td class="text-muted small text-center">{{ $no + 1 }}</td>
|
||||
<td>
|
||||
<div class="fw-bold text-dark text-center">{{ $item->nama_lengkap }}</div>
|
||||
<small class="text-muted text-center d-block">ID:
|
||||
{{ $item->no_induk }}</small>
|
||||
<div class="fw-bold text-dark text-start ps-3">{{ $item->nama_lengkap }}</div>
|
||||
<small class="text-muted text-start ps-3 d-block">ID: {{ $item->no_induk }}</small>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span
|
||||
class="badge-jk {{ $item->jenis_kelamin == 'P' ? 'bg-danger' : 'bg-primary' }} shadow-xs">
|
||||
<span class="badge-jk {{ $item->jenis_kelamin == 'P' ? 'bg-danger' : 'bg-primary' }} shadow-xs">
|
||||
{{ $item->jenis_kelamin }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span
|
||||
class="badge bg-info-soft text-info px-3">{{ $item->tingkatan }}</span>
|
||||
<div class="small text-muted mt-1" style="font-size: 10px;">Kolat
|
||||
{{ $item->asal_kolat }}</div>
|
||||
<span class="badge bg-info-soft text-info px-3">{{ $item->tingkatan }}</span>
|
||||
<div class="small text-muted mt-1" style="font-size: 10px;">Kolat {{ $item->kolat->nama_kolat ?? '-' }}</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
@if ($item->jabatan == 'pelatih')
|
||||
<span class="badge bg-primary text-white px-3"
|
||||
style="border-radius: 8px;">Pelatih</span>
|
||||
@elseif($item->jabatan == 'pengurus')
|
||||
<span class="badge bg-warning text-dark px-3"
|
||||
style="border-radius: 8px;">Pengurus</span>
|
||||
@else
|
||||
<span class="badge bg-light text-dark border px-3"
|
||||
style="border-radius: 8px;">Anggota</span>
|
||||
@endif
|
||||
{{-- Karena di filter 'anggota', maka jabatan otomatis Anggota --}}
|
||||
<span class="badge bg-light text-dark border px-3" style="border-radius: 8px;">Anggota</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span
|
||||
class="badge rounded-pill {{ $item->status == 'Aktif' ? 'bg-success-soft text-success border-success' : 'bg-secondary-soft text-secondary border-secondary' }} px-3 border">
|
||||
<span class="badge rounded-pill {{ $item->status == 'Aktif' ? 'bg-success-soft text-success border-success' : 'bg-secondary-soft text-secondary border-secondary' }} px-3 border">
|
||||
{{ $item->status }}
|
||||
</span>
|
||||
</td>
|
||||
|
|
@ -95,17 +82,16 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
|||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<div class="modal fade" id="modalDetail{{ $item->id }}" tabindex="-1"
|
||||
aria-labelledby="modalDetailLabel" aria-hidden="true">
|
||||
|
||||
{{-- MODAL DETAIL --}}
|
||||
<div class="modal fade" id="modalDetail{{ $item->id }}" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered modal-lg">
|
||||
<div class="modal-content"
|
||||
style="border-radius: 20px; border: none; overflow: hidden;">
|
||||
<div class="modal-content" style="border-radius: 20px; border: none; overflow: hidden;">
|
||||
<div class="modal-header bg-primary text-white border-0 py-3 px-4">
|
||||
<h5 class="modal-title fw-bold" id="modalDetailLabel">
|
||||
<h5 class="modal-title fw-bold">
|
||||
<i class="icon-user-check me-2"></i>Profil Lengkap Anggota
|
||||
</h5>
|
||||
<button type="button" class="btn-close btn-close-white"
|
||||
data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body p-4">
|
||||
<div class="row">
|
||||
|
|
@ -113,111 +99,76 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
|||
<div class="mb-3">
|
||||
<div class="bg-light rounded-circle d-inline-flex align-items-center justify-content-center shadow-sm"
|
||||
style="width: 120px; height: 120px; border: 4px solid #f8f9fa;">
|
||||
<i class="icon-user text-primary"
|
||||
style="font-size: 60px;"></i>
|
||||
<i class="icon-user text-primary" style="font-size: 60px;"></i>
|
||||
</div>
|
||||
</div>
|
||||
<h5 class="fw-bold mb-1">{{ $item->nama_lengkap }}</h5>
|
||||
<p class="text-muted small mb-3">ID: {{ $item->no_induk }}
|
||||
</p>
|
||||
<span
|
||||
class="badge rounded-pill {{ $item->status == 'Aktif' ? 'bg-success' : 'bg-secondary' }} px-4 py-2">
|
||||
<p class="text-muted small mb-3">ID: {{ $item->no_induk }}</p>
|
||||
<span class="badge rounded-pill {{ $item->status == 'Aktif' ? 'bg-success' : 'bg-secondary' }} px-4 py-2">
|
||||
{{ $item->status }}
|
||||
</span>
|
||||
<hr class="d-md-none">
|
||||
</div>
|
||||
|
||||
<div class="col-md-8 ps-md-4">
|
||||
<div class="col-md-8 ps-md-4 text-start">
|
||||
<div class="row g-3">
|
||||
<div class="col-12">
|
||||
<h6
|
||||
class="fw-bold text-primary mb-3 border-bottom pb-2">
|
||||
Informasi Organisasi</h6>
|
||||
<h6 class="fw-bold text-primary mb-3 border-bottom pb-2">Informasi Organisasi</h6>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Asal Kolat</small>
|
||||
<span
|
||||
class="fw-bold text-dark">{{ $item->asal_kolat }}</span>
|
||||
<span class="fw-bold text-dark">{{ $item->kolat->nama_kolat ?? '-' }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Jabatan
|
||||
Organisasi</small>
|
||||
<span
|
||||
class="fw-bold text-primary text-uppercase">{{ $item->jabatan ?? 'Anggota' }}</span>
|
||||
<small class="text-muted d-block">Jabatan</small>
|
||||
<span class="fw-bold text-primary text-uppercase">{{ $item->role->nama_role ?? 'ANGGOTA' }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Tingkatan</small>
|
||||
<span
|
||||
class="fw-bold text-dark">{{ $item->tingkatan }}</span>
|
||||
<span class="fw-bold text-dark">{{ $item->tingkatan }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Tanggal
|
||||
Gabung</small>
|
||||
<span
|
||||
class="fw-bold text-dark">{{ \Carbon\Carbon::parse($item->tgl_gabung)->format('d M Y') }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Jenis
|
||||
Kelamin</small>
|
||||
<span
|
||||
class="fw-bold text-dark">{{ $item->jenis_kelamin == 'L' ? 'Laki-laki' : 'Perempuan' }}</span>
|
||||
<small class="text-muted d-block">Tanggal Gabung</small>
|
||||
<span class="fw-bold text-dark">{{ \Carbon\Carbon::parse($item->tgl_gabung)->format('d M Y') }}</span>
|
||||
</div>
|
||||
|
||||
<div class="col-12 mt-4">
|
||||
<h6
|
||||
class="fw-bold text-primary mb-3 border-bottom pb-2">
|
||||
Kontak & Pribadi</h6>
|
||||
<h6 class="fw-bold text-primary mb-3 border-bottom pb-2">Kontak & Pribadi</h6>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Tempat, Tgl
|
||||
Lahir</small>
|
||||
<span
|
||||
class="fw-bold text-dark">{{ $item->tempat_lahir }},
|
||||
{{ \Carbon\Carbon::parse($item->tgl_lahir)->format('d M Y') }}</span>
|
||||
<small class="text-muted d-block">Tempat, Tgl Lahir</small>
|
||||
<span class="fw-bold text-dark">{{ $item->tempat_lahir }}, {{ \Carbon\Carbon::parse($item->tgl_lahir)->format('d M Y') }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">No.
|
||||
WhatsApp</small>
|
||||
<a href="https://wa.me/{{ $item->no_hp }}"
|
||||
target="_blank"
|
||||
class="text-decoration-none fw-bold text-success">
|
||||
<i
|
||||
class="icon-phone me-1"></i>{{ $item->no_hp }}
|
||||
<small class="text-muted d-block">No. WhatsApp</small>
|
||||
<a href="https://wa.me/{{ $item->no_hp }}" target="_blank" class="text-decoration-none fw-bold text-success">
|
||||
<i class="icon-phone me-1"></i>{{ $item->no_hp }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<small class="text-muted d-block">Alamat
|
||||
Lengkap</small>
|
||||
<span
|
||||
class="fw-bold text-dark">{{ $item->alamat }}</span>
|
||||
<small class="text-muted d-block">Alamat Lengkap</small>
|
||||
<span class="fw-bold text-dark">{{ $item->alamat }}</span>
|
||||
</div>
|
||||
|
||||
<div class="col-12 mt-4">
|
||||
<div class="p-3 bg-danger-soft border border-danger rounded-3"
|
||||
style="background-color: #fff5f5;">
|
||||
<h6 class="fw-bold text-danger mb-2"><i
|
||||
class="icon-heart me-2"></i>Catatan
|
||||
Medis</h6>
|
||||
<p class="mb-0 text-dark small"
|
||||
style="line-height: 1.6;">
|
||||
{{ $item->catatan_medis ?? 'Anggota tidak memiliki riwayat medis khusus.' }}
|
||||
</p>
|
||||
<div class="col-12 mt-3">
|
||||
<div class="p-3 rounded-3" style="background-color: #fff5f5; border: 1px solid #feb2b2;">
|
||||
<h6 class="fw-bold text-danger mb-2"><i class="icon-heart me-2"></i>Catatan Medis</h6>
|
||||
<p class="mb-0 text-dark small">{{ $item->catatan_medis ?? 'Tidak ada riwayat medis khusus.' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-footer border-0 px-4 pb-4">
|
||||
<button type="button" class="btn btn-light px-4"
|
||||
data-bs-dismiss="modal"
|
||||
style="border-radius: 10px;">Tutup</button>
|
||||
<button type="button" class="btn btn-light px-4" data-bs-dismiss="modal" style="border-radius: 10px;">Tutup</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="7" class="text-center py-5 text-muted small">Belum ada data anggota terdaftar.</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
|
@ -229,111 +180,16 @@ class="icon-heart me-2"></i>Catatan
|
|||
</div>
|
||||
|
||||
<style>
|
||||
/* Global Centering */
|
||||
.main-table {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* Header Styling */
|
||||
.main-table thead th {
|
||||
background-color: #f8faff;
|
||||
padding: 18px 10px;
|
||||
font-size: 0.75rem;
|
||||
color: #8c98a5;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
border-bottom: 2px solid #edf2f9;
|
||||
}
|
||||
|
||||
/* Body Cell Styling */
|
||||
.main-table tbody td {
|
||||
padding: 20px 10px;
|
||||
border-bottom: 1px solid #f1f4f8;
|
||||
color: #495057;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
/* Soft UI Badges */
|
||||
.bg-success-soft {
|
||||
background-color: #e6fffa;
|
||||
color: #38b2ac;
|
||||
}
|
||||
|
||||
.bg-info-soft {
|
||||
background-color: #e0f2fe;
|
||||
color: #0ea5e9;
|
||||
}
|
||||
|
||||
.bg-secondary-soft {
|
||||
background-color: #f3f4f6;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
/* Badge JK Circle */
|
||||
.badge-jk {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 11px;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
border-radius: 50% !important;
|
||||
}
|
||||
|
||||
/* Action Button */
|
||||
.btn-action-detail {
|
||||
background-color: #f0f7ff;
|
||||
color: #0d6efd;
|
||||
border: 1px solid #d0e4ff;
|
||||
border-radius: 10px;
|
||||
transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
/* Tombol Edit */
|
||||
.btn-action-edit {
|
||||
background-color: #fff8e6;
|
||||
color: #f59e0b;
|
||||
border: 1px solid #ffecb3;
|
||||
border-radius: 10px;
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
.btn-action-edit:hover {
|
||||
background-color: #f59e0b !important;
|
||||
color: white !important;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
|
||||
.btn-action-detail:hover {
|
||||
background-color: #0d6efd !important;
|
||||
color: white !important;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
/* Modal Profile Styling */
|
||||
.profile-circle {
|
||||
width: 85px;
|
||||
height: 85px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 36px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Table Hover Effect */
|
||||
.table-hover tbody tr:hover {
|
||||
background-color: #f8faff;
|
||||
transition: 0.2s;
|
||||
}
|
||||
|
||||
.shadow-xs {
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
.main-table thead th { background-color: #f8faff; padding: 18px 10px; font-size: 0.75rem; color: #8c98a5; letter-spacing: 1px; text-transform: uppercase; border-bottom: 2px solid #edf2f9; }
|
||||
.main-table tbody td { padding: 20px 10px; border-bottom: 1px solid #f1f4f8; color: #495057; font-size: 0.9rem; }
|
||||
.bg-success-soft { background-color: #e6fffa; color: #38b2ac; }
|
||||
.bg-info-soft { background-color: #e0f2fe; color: #0ea5e9; }
|
||||
.bg-secondary-soft { background-color: #f3f4f6; color: #6b7280; }
|
||||
.badge-jk { width: 32px; height: 32px; display: inline-flex; align-items: center; justify-content: center; font-size: 11px; font-weight: bold; color: white; border-radius: 50% !important; }
|
||||
.btn-action-detail { background-color: #f0f7ff; color: #0d6efd; border: 1px solid #d0e4ff; border-radius: 10px; transition: 0.3s; }
|
||||
.btn-action-edit { background-color: #fff8e6; color: #f59e0b; border: 1px solid #ffecb3; border-radius: 10px; transition: 0.3s; }
|
||||
.btn-action-edit:hover { background-color: #f59e0b !important; color: white !important; transform: translateY(-2px); }
|
||||
.btn-action-detail:hover { background-color: #0d6efd !important; color: white !important; transform: translateY(-2px); }
|
||||
.shadow-xs { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); }
|
||||
</style>
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -16,6 +16,20 @@
|
|||
<p class="text-muted small">Lengkapi data identitas dan legalitas SK untuk Pelatih atau Pengurus.</p>
|
||||
</div>
|
||||
|
||||
<!-- TAMPILKAN ERROR VALIDASI -->
|
||||
@if ($errors->any())
|
||||
<div class="alert alert-danger border-0 shadow-sm mb-4" style="border-radius: 15px;">
|
||||
<div class="d-flex">
|
||||
<i class="icon-alert-circle me-2 mt-1"></i>
|
||||
<ul class="mb-0">
|
||||
@foreach ($errors->all() as $error)
|
||||
<li class="small">{{ $error }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<form action="{{ isset($anggota) ? route('anggota.update', $anggota->id) : route('anggota.store') }}"
|
||||
|
|
@ -24,6 +38,9 @@
|
|||
@csrf
|
||||
@if(isset($anggota)) @method('PUT') @endif
|
||||
|
||||
<!-- INPUT HIDDEN UNTUK JABATAN (Penting untuk validasi Controller) -->
|
||||
<input type="hidden" name="jabatan" id="jabatanHidden" value="{{ old('jabatan', $anggota->jabatan ?? '') }}">
|
||||
|
||||
<!-- CARD 1: INFORMASI PRIBADI -->
|
||||
<div class="card border-0 shadow-sm mb-4" style="border-radius: 20px;">
|
||||
<div class="card-header bg-white border-0 pt-4 px-4">
|
||||
|
|
@ -34,24 +51,24 @@
|
|||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">Nama Lengkap</label>
|
||||
<input type="text" name="nama_lengkap" class="form-control {{ isset($anggota) ? 'bg-light' : '' }}"
|
||||
value="{{ $anggota->nama_lengkap ?? '' }}"
|
||||
value="{{ old('nama_lengkap', $anggota->nama_lengkap ?? '') }}"
|
||||
{{ isset($anggota) ? 'readonly' : '' }} required placeholder="Nama lengkap sesuai identitas">
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">No. WhatsApp</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light border-end-0">+62</span>
|
||||
<input type="number" name="no_hp" class="form-control" value="{{ $anggota->no_hp ?? '' }}" placeholder="81234567xxx" required>
|
||||
<input type="number" name="no_hp" class="form-control" value="{{ old('no_hp', $anggota->no_hp ?? '') }}" placeholder="81234567xxx" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">Tempat & Tanggal Lahir</label>
|
||||
<div class="row g-2">
|
||||
<div class="col-7">
|
||||
<input type="text" name="tempat_lahir" class="form-control" value="{{ $anggota->tempat_lahir ?? '' }}" placeholder="Kota" required>
|
||||
<input type="text" name="tempat_lahir" class="form-control" value="{{ old('tempat_lahir', $anggota->tempat_lahir ?? '') }}" placeholder="Kota" required>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
<input type="date" name="tgl_lahir" class="form-control" value="{{ $anggota->tgl_lahir ?? '' }}" required>
|
||||
<input type="date" name="tgl_lahir" class="form-control" value="{{ old('tgl_lahir', $anggota->tgl_lahir ?? '') }}" required>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -59,13 +76,13 @@
|
|||
<label class="form-label fw-bold">Jenis Kelamin</label>
|
||||
<select name="jenis_kelamin" class="form-select" required>
|
||||
<option value="" disabled selected>-- Pilih --</option>
|
||||
<option value="L" {{ (isset($anggota) && $anggota->jenis_kelamin == 'L') ? 'selected' : '' }}>Laki-laki</option>
|
||||
<option value="P" {{ (isset($anggota) && $anggota->jenis_kelamin == 'P') ? 'selected' : '' }}>Perempuan</option>
|
||||
<option value="L" {{ old('jenis_kelamin', $anggota->jenis_kelamin ?? '') == 'L' ? 'selected' : '' }}>Laki-laki</option>
|
||||
<option value="P" {{ old('jenis_kelamin', $anggota->jenis_kelamin ?? '') == 'P' ? 'selected' : '' }}>Perempuan</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<label class="form-label fw-bold">Alamat Lengkap</label>
|
||||
<textarea name="alamat" class="form-control" rows="2" placeholder="Alamat lengkap domisili..." required>{{ $anggota->alamat ?? '' }}</textarea>
|
||||
<textarea name="alamat" class="form-control" rows="2" placeholder="Alamat lengkap domisili..." required>{{ old('alamat', $anggota->alamat ?? '') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -83,36 +100,36 @@
|
|||
<input type="text" class="form-control bg-light fw-bold text-primary" value="{{ $anggota->no_induk ?? 'JB-XXX (Otomatis)' }}" readonly>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-bold">Jabatan</label>
|
||||
<label class="form-label fw-bold">Jabatan / Role</label>
|
||||
<select name="role_id" id="roleSelect" class="form-select border-primary" onchange="toggleSKFields()" required>
|
||||
<option value="" disabled selected>-- Pilih Jabatan --</option>
|
||||
@foreach($data_role as $role)
|
||||
<option value="{{ $role->id }}"
|
||||
{{ (isset($anggota) && $anggota->role_id == $role->id) ? 'selected' : '' }}>
|
||||
{{ old('role_id', $anggota->role_id ?? '') == $role->id ? 'selected' : '' }}>
|
||||
{{ $role->nama_role }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-bold">Status</label>
|
||||
<label class="form-label fw-bold">Status Keanggotaan</label>
|
||||
<select name="status" class="form-select" required>
|
||||
<option value="Aktif" {{ (isset($anggota) && $anggota->status == 'Aktif') ? 'selected' : '' }}>Aktif</option>
|
||||
<option value="Non-Aktif" {{ (isset($anggota) && $anggota->status == 'Non-Aktif') ? 'selected' : '' }}>Non-Aktif</option>
|
||||
<option value="Aktif" {{ old('status', $anggota->status ?? '') == 'Aktif' ? 'selected' : '' }}>Aktif</option>
|
||||
<option value="Non-Aktif" {{ old('status', $anggota->status ?? '') == 'Non-Aktif' ? 'selected' : '' }}>Non-Aktif</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- BOX SK (Legalitas) -->
|
||||
<div id="boxSK" class="col-12 mt-3 p-4 bg-light rounded-4 border border-dashed border-danger" style="display: none;">
|
||||
<h6 class="text-danger fw-bold mb-3"><i class="bi bi-file-earmark-check me-2"></i>Data Legalitas (SK/Lisensi)</h6>
|
||||
<h6 class="text-danger fw-bold mb-3"><i class="icon-file-text me-2"></i>Data Legalitas (Khusus Pelatih/Pengurus)</h6>
|
||||
<div class="row g-3">
|
||||
<div class="col-md-4">
|
||||
<label class="form-label small fw-bold">Nomor SK</label>
|
||||
<input type="text" name="no_sk" class="form-control" value="{{ $anggota->no_sk ?? '' }}">
|
||||
<input type="text" name="no_sk" class="form-control" value="{{ old('no_sk', $anggota->no_sk ?? '') }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label small fw-bold">Masa Berlaku</label>
|
||||
<input type="date" name="masa_berlaku" class="form-control" value="{{ $anggota->masa_berlaku ?? '' }}">
|
||||
<label class="form-label small fw-bold">Masa Berlaku SK</label>
|
||||
<input type="date" name="masa_berlaku" class="form-control" value="{{ old('masa_berlaku', $anggota->masa_berlaku ?? '') }}">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label small fw-bold">Upload SK (Gambar)</label>
|
||||
|
|
@ -123,27 +140,27 @@
|
|||
|
||||
<div class="col-md-6 mt-4">
|
||||
<label class="form-label fw-bold">Asal Kolat</label>
|
||||
<select name="kolat_id" class="form-select" required>
|
||||
<option value="" disabled selected>-- Pilih Kolat --</option>
|
||||
@foreach($data_kolat as $k)
|
||||
<option value="{{ $k->id }}" {{ (isset($anggota) && $anggota->kolat_id == $k->id) ? 'selected' : '' }}>
|
||||
Kolat {{ $k->nama_kolat }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<select name="kolat_id" class="form-select" required>
|
||||
<option value="" disabled selected>-- Pilih Kolat --</option>
|
||||
@foreach($data_kolat as $k)
|
||||
<option value="{{ $k->id }}" {{ old('kolat_id', $anggota->kolat_id ?? '') == $k->id ? 'selected' : '' }}>
|
||||
Kolat {{ $k->nama_kolat }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3 mt-4">
|
||||
<label class="form-label fw-bold">Tingkatan</label>
|
||||
<input type="text" name="tingkatan" class="form-control" value="{{ $anggota->tingkatan ?? '' }}" placeholder="Contoh: Balik I" required>
|
||||
<label class="form-label fw-bold">Tingkatan Sabuk</label>
|
||||
<input type="text" name="tingkatan" class="form-control" value="{{ old('tingkatan', $anggota->tingkatan ?? '') }}" placeholder="Contoh: Balik I" required>
|
||||
</div>
|
||||
<div class="col-md-3 mt-4">
|
||||
<label class="form-label fw-bold">Tanggal Gabung</label>
|
||||
<input type="date" name="tgl_gabung" class="form-control" value="{{ $anggota->tgl_gabung ?? '' }}" required>
|
||||
<input type="date" name="tgl_gabung" class="form-control" value="{{ old('tgl_gabung', $anggota->tgl_gabung ?? '') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="col-12 mt-4">
|
||||
<label class="form-label fw-bold text-danger"><i class="icon-heart me-2"></i>Catatan Medis</label>
|
||||
<textarea name="catatan_medis" class="form-control" rows="3" placeholder="Contoh: Riwayat asma atau cedera fisik.">{{ $anggota->catatan_medis ?? '' }}</textarea>
|
||||
<label class="form-label fw-bold text-danger"><i class="icon-heart me-2"></i>Catatan Medis (Opsional)</label>
|
||||
<textarea name="catatan_medis" class="form-control" rows="3" placeholder="Contoh: Riwayat asma atau cedera fisik.">{{ old('catatan_medis', $anggota->catatan_medis ?? '') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -167,51 +184,56 @@
|
|||
|
||||
<script>
|
||||
function toggleSKFields() {
|
||||
const jabatan = document.getElementById('jabatanSelect').value;
|
||||
const roleSelect = document.getElementById('roleSelect');
|
||||
const boxSK = document.getElementById('boxSK');
|
||||
if (jabatan === 'pelatih' || jabatan === 'pengurus') {
|
||||
boxSK.style.display = 'block';
|
||||
} else {
|
||||
boxSK.style.display = 'none';
|
||||
const jabatanHidden = document.getElementById('jabatanHidden');
|
||||
|
||||
if (roleSelect.selectedIndex > 0) {
|
||||
// 1. Ambil teks asli dari dropdown (Pelatih/Pengurus/Anggota)
|
||||
const selectedText = roleSelect.options[roleSelect.selectedIndex].text;
|
||||
const textLower = selectedText.toLowerCase();
|
||||
|
||||
// 2. Isi hidden input 'jabatan' agar validasi di controller lolos
|
||||
// Kita sesuaikan agar nilainya pas dengan validasi: pengurus, pelatih, anggota
|
||||
if (textLower.includes('pelatih')) {
|
||||
jabatanHidden.value = 'pelatih';
|
||||
boxSK.style.display = 'block';
|
||||
} else if (textLower.includes('pengurus')) {
|
||||
jabatanHidden.value = 'pengurus';
|
||||
boxSK.style.display = 'block';
|
||||
} else {
|
||||
jabatanHidden.value = 'anggota';
|
||||
boxSK.style.display = 'none';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Jalankan fungsi saat halaman selesai dimuat (penting untuk mode Edit & Old Value)
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
toggleSKFields();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/* Styling agar input terlihat modern */
|
||||
.form-control, .form-select {
|
||||
border-radius: 10px;
|
||||
padding: 10px 15px;
|
||||
border: 1px solid #dce1e7;
|
||||
}
|
||||
.form-control:focus, .form-select:focus {
|
||||
border-color: #0d6efd;
|
||||
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.1);
|
||||
}
|
||||
|
||||
/* Perbaikan Button Styling */
|
||||
.btn-cancel {
|
||||
border-radius: 12px;
|
||||
transition: all 0.3s ease;
|
||||
border: 2px solid #6c757d;
|
||||
}
|
||||
.btn-cancel:hover {
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.btn-save {
|
||||
border-radius: 12px;
|
||||
background: (45deg, #0d6efd, #004dc0);
|
||||
background: linear-gradient(45deg, #0d6efd, #004dc0);
|
||||
border: none;
|
||||
transition: all 0.3s ease;
|
||||
color: white;
|
||||
}
|
||||
.btn-save:hover {
|
||||
transform: translateY(-2px);
|
||||
/* box-shadow: 0 5px 15px rgba(13, 110, 253, 0.4) !important; */
|
||||
background:(45deg, #004dc0, #0d6efd);
|
||||
.btn-cancel {
|
||||
border-radius: 12px;
|
||||
}
|
||||
.bg-light { background-color: #f8f9fa !important; }
|
||||
</style>
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -0,0 +1,208 @@
|
|||
@extends('layout.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid py-4">
|
||||
<div class="page-header mb-4 text-start">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb bg-transparent p-0 mb-2">
|
||||
<li class="breadcrumb-item"><a href="#" class="text-muted text-decoration-none small">Home</a></li>
|
||||
<li class="breadcrumb-item active text-primary fw-bold small" aria-current="page">Jadwal Latihan</li>
|
||||
</ol>
|
||||
</nav>
|
||||
<h3 class="fw-bold text-dark">Manajemen Latihan TapakMP</h3>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card border-0 shadow-sm" style="border-radius: 20px;">
|
||||
<div class="card-body p-4">
|
||||
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<div class="text-start">
|
||||
<h5 class="card-title mb-0 fw-bold text-dark">Agenda PPS Merpati Putih</h5>
|
||||
<p class="text-muted small mb-0">Cabang Jember - Kelola jadwal rutin dan pengumuman latihan.</p>
|
||||
</div>
|
||||
<a href="{{ route('jadwal.create') }}" class="btn btn-primary px-4 py-2 shadow-sm"
|
||||
style="border-radius: 12px;">
|
||||
<i class="icon-plus me-1"></i> Buat Jadwal
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle main-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60">No</th>
|
||||
<th>Kegiatan & Deskripsi</th>
|
||||
<th>Kolat</th>
|
||||
<th>Pelatih Bertugas</th>
|
||||
<th>Waktu & Lokasi</th>
|
||||
<th>Tipe</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse ($data_jadwal as $no => $item)
|
||||
<tr>
|
||||
<td class="text-muted small text-center">{{ $no + 1 }}</td>
|
||||
<td>
|
||||
<div class="fw-bold text-dark text-start ps-3">{{ $item->judul_kegiatan }}</div>
|
||||
<small class="text-muted text-start ps-3 d-block">{{ Str::limit($item->deskripsi, 40) }}</small>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="badge bg-light text-dark border px-3" style="border-radius: 8px;">
|
||||
{{ $item->kolat->nama_kolat ?? '-' }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="fw-bold text-dark small">{{ $item->pelatih->nama_lengkap ?? 'Belum Ditentukan' }}</div>
|
||||
<small class="text-muted" style="font-size: 10px;">ID: {{ $item->pelatih->no_induk ?? '-' }}</small>
|
||||
</td>
|
||||
<td class="text-start ps-4">
|
||||
<div class="small fw-bold text-dark">
|
||||
<i class="icon-calendar me-1"></i> {{ \Carbon\Carbon::parse($item->tanggal)->format('d M Y') }}
|
||||
</div>
|
||||
<div class="small text-muted">
|
||||
<i class="icon-clock me-1"></i> {{ substr($item->jam_mulai, 0, 5) }} - {{ $item->jam_selesai ? substr($item->jam_selesai, 0, 5) : 'Selesai' }}
|
||||
</div>
|
||||
<div class="small text-muted text-truncate" style="max-width: 150px;">
|
||||
<i class="icon-map-pin me-1"></i> {{ $item->lokasi }}
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
@php
|
||||
$bg_color = 'bg-secondary-soft text-secondary';
|
||||
if($item->jenis == 'Rutin') $bg_color = 'bg-success-soft text-success border-success';
|
||||
elseif($item->jenis == 'Tambahan') $bg_color = 'bg-info-soft text-info border-info';
|
||||
elseif($item->jenis == 'Pengumuman') $bg_color = 'bg-danger-soft text-danger border-danger';
|
||||
@endphp
|
||||
<span class="badge rounded-pill {{ $bg_color }} px-3 border">
|
||||
{{ $item->jenis }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="d-flex justify-content-center gap-2">
|
||||
<button class="btn btn-sm btn-action-detail fw-bold px-3 shadow-xs"
|
||||
data-bs-toggle="modal"
|
||||
data-bs-target="#modalDetailJadwal{{ $item->id }}">
|
||||
<i class="icon-eye"></i> Detail
|
||||
</button>
|
||||
|
||||
@if($item->jenis != 'Pengumuman')
|
||||
<a href="#" class="btn btn-sm btn-outline-primary fw-bold px-3" style="border-radius: 10px;">
|
||||
<i class="icon-check-square"></i> Absen
|
||||
</a>
|
||||
@endif
|
||||
|
||||
<a href="{{ route('jadwal.edit', $item->id) }}"
|
||||
class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
||||
<i class="icon-pencil"></i>
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{{-- MODAL DETAIL JADWAL (Identik dengan Modal Anggota) --}}
|
||||
<div class="modal fade" id="modalDetailJadwal{{ $item->id }}" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered modal-lg">
|
||||
<div class="modal-content" style="border-radius: 20px; border: none; overflow: hidden;">
|
||||
<div class="modal-header bg-primary text-white border-0 py-3 px-4">
|
||||
<h5 class="modal-title fw-bold">
|
||||
<i class="icon-calendar me-2"></i>Detail Agenda Latihan
|
||||
</h5>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body p-4">
|
||||
<div class="row">
|
||||
<div class="col-md-4 text-center border-end">
|
||||
<div class="mb-3">
|
||||
<div class="bg-light rounded-circle d-inline-flex align-items-center justify-content-center shadow-sm"
|
||||
style="width: 120px; height: 120px; border: 4px solid #f8f9fa;">
|
||||
<i class="icon-clipboard text-primary" style="font-size: 60px;"></i>
|
||||
</div>
|
||||
</div>
|
||||
<h5 class="fw-bold mb-1">{{ $item->judul_kegiatan }}</h5>
|
||||
<p class="text-muted small mb-3">ID Jadwal: #JDL-{{ $item->id }}</p>
|
||||
<span class="badge rounded-pill {{ $bg_color }} px-4 py-2 border shadow-xs">
|
||||
{{ $item->jenis }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="col-md-8 ps-md-4 text-start">
|
||||
<div class="row g-3">
|
||||
<div class="col-12">
|
||||
<h6 class="fw-bold text-primary mb-3 border-bottom pb-2">Informasi Pelaksanaan</h6>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Pelatih Bertugas</small>
|
||||
<span class="fw-bold text-dark">{{ $item->pelatih->nama_lengkap ?? '-' }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Kelompok Latihan (Kolat)</small>
|
||||
<span class="fw-bold text-dark">{{ $item->kolat->nama_kolat ?? '-' }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Hari & Tanggal</small>
|
||||
<span class="fw-bold text-dark">{{ \Carbon\Carbon::parse($item->tanggal)->translatedFormat('l, d F Y') }}</span>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<small class="text-muted d-block">Waktu</small>
|
||||
<span class="fw-bold text-dark">{{ substr($item->jam_mulai, 0, 5) }} - {{ $item->jam_selesai ? substr($item->jam_selesai, 0, 5) : 'Selesai' }} WIB</span>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<small class="text-muted d-block">Lokasi Tempat</small>
|
||||
<span class="fw-bold text-dark"><i class="icon-map-pin me-1 text-danger"></i>{{ $item->lokasi }}</span>
|
||||
</div>
|
||||
|
||||
<div class="col-12 mt-4">
|
||||
<h6 class="fw-bold text-primary mb-3 border-bottom pb-2">Deskripsi & Catatan</h6>
|
||||
<div class="p-3 rounded-3" style="background-color: #f8faff; border: 1px solid #edf2f9;">
|
||||
<p class="mb-0 text-dark small" style="white-space: pre-line;">{{ $item->deskripsi ?? 'Tidak ada deskripsi tambahan untuk agenda ini.' }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer border-0 px-4 pb-4">
|
||||
<button type="button" class="btn btn-light px-4" data-bs-dismiss="modal" style="border-radius: 10px;">Tutup</button>
|
||||
<a href="{{ route('jadwal.edit', $item->id) }}" class="btn btn-warning text-white px-4" style="border-radius: 10px;">Edit Jadwal</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="7" class="text-center py-5 text-muted small">Belum ada jadwal latihan atau pengumuman.</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.main-table thead th { background-color: #f8faff; padding: 18px 10px; font-size: 0.75rem; color: #8c98a5; letter-spacing: 1px; text-transform: uppercase; border-bottom: 2px solid #edf2f9; }
|
||||
.main-table tbody td { padding: 20px 10px; border-bottom: 1px solid #f1f4f8; color: #495057; font-size: 0.9rem; }
|
||||
|
||||
/* Soft Badges */
|
||||
.bg-success-soft { background-color: #e6fffa; color: #38b2ac; }
|
||||
.bg-info-soft { background-color: #e0f2fe; color: #0ea5e9; }
|
||||
.bg-danger-soft { background-color: #fff5f5; color: #e53e3e; }
|
||||
.bg-secondary-soft { background-color: #f3f4f6; color: #6b7280; }
|
||||
|
||||
/* Buttons Action */
|
||||
.btn-action-detail { background-color: #f0f7ff; color: #0d6efd; border: 1px solid #d0e4ff; border-radius: 10px; transition: 0.3s; }
|
||||
.btn-action-edit { background-color: #fff8e6; color: #f59e0b; border: 1px solid #ffecb3; border-radius: 10px; transition: 0.3s; }
|
||||
|
||||
.btn-action-edit:hover { background-color: #f59e0b !important; color: white !important; transform: translateY(-2px); }
|
||||
.btn-action-detail:hover { background-color: #0d6efd !important; color: white !important; transform: translateY(-2px); }
|
||||
|
||||
.shadow-xs { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); }
|
||||
</style>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
@extends('layout.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid py-4">
|
||||
<div class="page-header mb-4 text-start">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb bg-transparent p-0 mb-2">
|
||||
<li class="breadcrumb-item"><a href="{{ route('jadwal.index') }}" class="text-muted text-decoration-none small">Jadwal Latihan</a></li>
|
||||
<li class="breadcrumb-item active text-primary fw-bold small" aria-current="page">Buat Jadwal Baru</li>
|
||||
</ol>
|
||||
</nav>
|
||||
<h3 class="fw-bold text-dark">Tambah Jadwal Latihan</h3>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-8 col-12">
|
||||
<div class="card border-0 shadow-sm" style="border-radius: 20px;">
|
||||
<div class="card-body p-4">
|
||||
<form action="{{ route('jadwal.store') }}" method="POST">
|
||||
@csrf
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-12 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Judul Kegiatan / Agenda</label>
|
||||
<input type="text" name="judul_kegiatan" class="form-control @error('judul_kegiatan') is-invalid @enderror"
|
||||
placeholder="Contoh: Latihan Rutin Sabuk Putih" value="{{ old('judul_kegiatan') }}" required>
|
||||
@error('judul_kegiatan')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Kelompok Latihan (Kolat)</label>
|
||||
<select name="kolat_id" class="form-select @error('kolat_id') is-invalid @enderror" required>
|
||||
<option value="" selected disabled>Pilih Kolat</option>
|
||||
@foreach($data_kolat as $kolat)
|
||||
<option value="{{ $kolat->id }}" {{ old('kolat_id') == $kolat->id ? 'selected' : '' }}>
|
||||
{{ $kolat->nama_kolat }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@error('kolat_id')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Pelatih Bertugas</label>
|
||||
<select name="pelatih_id" class="form-select @error('pelatih_id') is-invalid @enderror" required>
|
||||
<option value="" selected disabled>Pilih Pelatih</option>
|
||||
@foreach($data_pelatih as $pelatih)
|
||||
<option value="{{ $pelatih->id }}" {{ old('pelatih_id') == $pelatih->id ? 'selected' : '' }}>
|
||||
{{ $pelatih->nama_lengkap }} ({{ $pelatih->no_induk }})
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@error('pelatih_id')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Jenis Kegiatan</label>
|
||||
<select name="jenis" class="form-select @error('jenis') is-invalid @enderror" required>
|
||||
<option value="Rutin" {{ old('jenis') == 'Rutin' ? 'selected' : '' }}>Rutin</option>
|
||||
<option value="Tambahan" {{ old('jenis') == 'Tambahan' ? 'selected' : '' }}>Tambahan</option>
|
||||
<option value="Pengumuman" {{ old('jenis') == 'Pengumuman' ? 'selected' : '' }}>Pengumuman</option>
|
||||
</select>
|
||||
@error('jenis')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Tanggal</label>
|
||||
<input type="date" name="tanggal" class="form-control @error('tanggal') is-invalid @enderror"
|
||||
value="{{ old('tanggal') }}" required>
|
||||
@error('tanggal')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Jam Mulai</label>
|
||||
<input type="time" name="jam_mulai" class="form-control @error('jam_mulai') is-invalid @enderror"
|
||||
value="{{ old('jam_mulai') }}" required>
|
||||
@error('jam_mulai')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Jam Selesai (Opsional)</label>
|
||||
<input type="time" name="jam_selesai" class="form-control @error('jam_selesai') is-invalid @enderror"
|
||||
value="{{ old('jam_selesai') }}">
|
||||
@error('jam_selesai')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Lokasi Latihan</label>
|
||||
<input type="text" name="lokasi" class="form-control @error('lokasi') is-invalid @enderror"
|
||||
placeholder="Contoh: Gedung Serbaguna Lt. 2" value="{{ old('lokasi') }}" required>
|
||||
@error('lokasi')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 mb-4">
|
||||
<label class="form-label fw-bold text-dark">Deskripsi / Catatan (Opsional)</label>
|
||||
<textarea name="deskripsi" class="form-control @error('deskripsi') is-invalid @enderror"
|
||||
rows="3" placeholder="Masukkan detail tambahan jika ada...">{{ old('deskripsi') }}</textarea>
|
||||
@error('deskripsi')
|
||||
<div class="invalid-feedback">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-end gap-2 border-top pt-4">
|
||||
<a href="{{ route('jadwal.index') }}" class="btn btn-light px-4 py-2 fw-bold" style="border-radius: 12px;">Batal</a>
|
||||
<button type="submit" class="btn btn-primary px-4 py-2 fw-bold shadow-sm" style="border-radius: 12px;">
|
||||
<i class="icon-save me-1"></i> Simpan Jadwal
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-4 col-12 mt-4 mt-lg-0">
|
||||
<div class="card border-0 bg-primary text-white" style="border-radius: 20px;">
|
||||
<div class="card-body p-4">
|
||||
<h5 class="fw-bold mb-3"><i class="icon-info me-2"></i> Tips Pengisian</h5>
|
||||
<ul class="small opacity-75 ps-3">
|
||||
<li class="mb-2">Pastikan memilih <strong>Pelatih</strong> yang sedang aktif.</li>
|
||||
<li class="mb-2">Pilih jenis <strong>Pengumuman</strong> jika hanya ingin memberikan informasi tanpa perlu presensi.</li>
|
||||
<li class="mb-2">Gunakan lokasi yang spesifik agar anggota tidak kesulitan mencari tempat.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.form-control, .form-select {
|
||||
border: 1px solid #edf2f9;
|
||||
padding: 0.6rem 1rem;
|
||||
border-radius: 12px;
|
||||
background-color: #f8faff;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
.form-control:focus, .form-select:focus {
|
||||
border-color: #0d6efd;
|
||||
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.05);
|
||||
background-color: #fff;
|
||||
}
|
||||
.form-label {
|
||||
font-size: 0.85rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
</style>
|
||||
@endsection
|
||||
|
|
@ -2,15 +2,14 @@
|
|||
|
||||
@section('content')
|
||||
<div class="container-fluid py-4">
|
||||
<!-- Header & Breadcrumb -->
|
||||
<div class="page-header mb-4 text-start">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb bg-transparent p-0 mb-2">
|
||||
<li class="breadcrumb-item"><a href="#" class="text-muted text-decoration-none small">Home</a></li>
|
||||
<li class="breadcrumb-item active text-danger fw-bold small" aria-current="page">Data Pelatih</li>
|
||||
<li class="breadcrumb-item active text-primary fw-bold small" aria-current="page">Manajemen Pelatih</li>
|
||||
</ol>
|
||||
</nav>
|
||||
<h3 class="fw-bold text-dark">Manajemen Pelatih TapakMP</h3>
|
||||
<h3 class="fw-bold text-dark">SDM Merpati Putih</h3>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
|
@ -18,86 +17,63 @@
|
|||
<div class="card border-0 shadow-sm" style="border-radius: 20px;">
|
||||
<div class="card-body p-4">
|
||||
|
||||
<!-- Header Tabel -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<div class="text-start">
|
||||
<h5 class="card-title mb-0 fw-bold text-dark">Daftar Pelatih PPS Merpati Putih</h5>
|
||||
<p class="text-muted small mb-0">Cabang Jember - Kelola informasi lisensi dan tingkatan pelatih.</p>
|
||||
<h5 class="card-title mb-0 fw-bold text-dark">Daftar Pelatih Aktif</h5>
|
||||
<p class="text-muted small mb-0">Kelola sertifikasi dan masa berlaku SK Pelatih Cabang.</p>
|
||||
</div>
|
||||
<a href="#" class="btn btn-danger px-4 py-2 shadow-sm"
|
||||
style="border-radius: 12px; background-color: #b91c1c; border: none; font-size: 14px;">
|
||||
<i class="icon-plus me-1"></i> Tambah Pelatih
|
||||
<!-- Link ke halaman Upgrade -->
|
||||
<a href="{{ route('pelatih.upgrade') }}" class="btn btn-primary px-4 py-2 shadow-sm"
|
||||
style="border-radius: 12px;">
|
||||
<i class="icon-plus me-1"></i> Upgrade Anggota ke Pelatih
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Area Tabel -->
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle main-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="60">No</th>
|
||||
<th>Profil Pelatih</th>
|
||||
<th class="text-center">Tingkatan</th>
|
||||
<th class="text-center">Nomor SK / Lisensi</th>
|
||||
<th class="text-center">Status</th>
|
||||
<th class="text-center">Aksi</th>
|
||||
<th>Identitas Pelatih</th>
|
||||
<th>No. SK & Masa Berlaku</th>
|
||||
<th>Kolat</th>
|
||||
<th>Status SK</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- Contoh Baris 1 -->
|
||||
<tr>
|
||||
<td class="text-muted small text-center">1</td>
|
||||
<td>
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="text-start">
|
||||
<div class="fw-bold text-dark">Agus Setiawan</div>
|
||||
<small class="text-muted">ID: MP-00192</small>
|
||||
@foreach ($data_pelatih as $no => $item)
|
||||
<tr>
|
||||
<td class="text-muted small text-center">{{ $no + 1 }}</td>
|
||||
<td>
|
||||
<div class="fw-bold text-dark text-start">{{ $item->nama_lengkap }}</div>
|
||||
<small class="text-muted text-start d-block">ID: {{ $item->no_induk }}</small>
|
||||
</td>
|
||||
<td class="text-start">
|
||||
<div class="small fw-bold">{{ $item->no_sk }}</div>
|
||||
<div class="text-muted" style="font-size: 11px;">Hingga: {{ \Carbon\Carbon::parse($item->masa_berlaku)->format('d M Y') }}</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="badge bg-info-soft text-info px-3">{{ $item->kolat->nama_kolat ?? '-' }}</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
@php
|
||||
$isExpired = \Carbon\Carbon::now()->gt($item->masa_berlaku);
|
||||
@endphp
|
||||
<span class="badge rounded-pill {{ !$isExpired ? 'bg-success-soft text-success' : 'bg-danger-soft text-danger' }} px-3 border">
|
||||
{{ !$isExpired ? 'Berlaku' : 'Expired' }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="d-flex justify-content-center gap-2">
|
||||
<a href="{{ route('pelatih.edit', $item->id) }}"
|
||||
class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
||||
<i class="icon-pencil"></i> Edit SK
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="badge bg-info-soft text-info px-3">Mandiri</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="text-primary fw-bold small bg-light px-2 py-1 rounded border">SK-JBR-001/2026</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="badge rounded-pill bg-success-soft text-success border border-success px-3">Aktif</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="d-flex justify-content-center gap-2">
|
||||
<button class="btn btn-sm btn-action-detail fw-bold px-3 shadow-xs">Detail</button>
|
||||
<button class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">Edit</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- Contoh Baris 2 -->
|
||||
<tr>
|
||||
<td class="text-muted small text-center">2</td>
|
||||
<td>
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="fw-bold text-dark">Siti Aminah</div>
|
||||
<small class="text-muted">ID: MP-00205</small>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="badge bg-info-soft text-info px-3">Balik II</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="text-primary fw-bold small bg-light px-2 py-1 rounded border">SK-JBR-002/2026</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<span class="badge rounded-pill bg-success-soft text-success border border-success px-3">Aktif</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="d-flex justify-content-center gap-2">
|
||||
<button class="btn btn-sm btn-action-detail fw-bold px-3 shadow-xs">Detail</button>
|
||||
<button class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">Edit</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
|
@ -108,58 +84,15 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Style CSS Khusus Tampilan -->
|
||||
<!-- Gunakan Style yang sama dengan yang kamu berikan sebelumnya -->
|
||||
<style>
|
||||
.main-table thead th {
|
||||
background-color: #f8faff;
|
||||
padding: 18px 10px;
|
||||
font-size: 11px;
|
||||
color: #8c98a5;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
border-bottom: 2px solid #edf2f9;
|
||||
}
|
||||
|
||||
.main-table tbody td {
|
||||
padding: 16px 10px;
|
||||
border-bottom: 1px solid #f1f4f8;
|
||||
color: #495057;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
/* Avatar Bulat */
|
||||
.badge-avatar {
|
||||
width: 38px;
|
||||
height: 38px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
border-radius: 10px; /* Modern Soft Square */
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
/* Warna Soft UI */
|
||||
.main-table thead th { background-color: #f8faff; padding: 18px 10px; font-size: 0.75rem; color: #8c98a5; letter-spacing: 1px; text-transform: uppercase; border-bottom: 2px solid #edf2f9; }
|
||||
.main-table tbody td { padding: 20px 10px; border-bottom: 1px solid #f1f4f8; color: #495057; font-size: 0.9rem; }
|
||||
.bg-success-soft { background-color: #e6fffa; color: #38b2ac; }
|
||||
.bg-info-soft { background-color: #e0f2fe; color: #0ea5e9; }
|
||||
.bg-danger-soft { background-color: #fff5f5; color: #e53e3e; }
|
||||
|
||||
/* Button Styling */
|
||||
.btn-action-detail {
|
||||
background-color: #f0f7ff; color: #0d6efd; border: 1px solid #d0e4ff;
|
||||
border-radius: 8px; transition: 0.2s;
|
||||
}
|
||||
|
||||
.btn-action-edit {
|
||||
background-color: #fff8e6; color: #f59e0b; border: 1px solid #ffecb3;
|
||||
border-radius: 8px; transition: 0.2s;
|
||||
}
|
||||
|
||||
.btn-action-detail:hover { background-color: #0d6efd !important; color: white !important; }
|
||||
.btn-action-edit:hover { background-color: #f59e0b !important; color: white !important; }
|
||||
|
||||
.bg-info-soft { background-color: #e0f2fe; color: #0ea5e9; }
|
||||
.btn-action-edit { background-color: #fff8e6; color: #f59e0b; border: 1px solid #ffecb3; border-radius: 10px; transition: 0.3s; }
|
||||
.btn-action-edit:hover { background-color: #f59e0b !important; color: white !important; transform: translateY(-2px); }
|
||||
.shadow-xs { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); }
|
||||
.table-hover tbody tr:hover { background-color: #fcfcfc; }
|
||||
</style>
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -1,144 +1,83 @@
|
|||
@extends('layout.app')
|
||||
|
||||
@section('content')
|
||||
<div class="container-fluid py-4">
|
||||
<!-- Header & Breadcrumb -->
|
||||
<div class="page-header mb-4 text-start">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb bg-transparent p-0 mb-2">
|
||||
<li class="breadcrumb-item"><a href="#" class="text-muted text-decoration-none small">Home</a></li>
|
||||
<li class="breadcrumb-item active text-primary fw-bold small" aria-current="page">Data Kolat</li>
|
||||
</ol>
|
||||
</nav>
|
||||
<h3 class="fw-bold text-dark">Manajemen Kelompok Latihan</h3>
|
||||
<div class="container-fluid py-4">
|
||||
<div class="page-header mb-4">
|
||||
<h3 class="fw-bold text-dark">Upgrade Anggota ke Pelatih</h3>
|
||||
<p class="text-muted">Proses ini akan mengubah status keanggotaan dan memberikan akses manajemen latihan.</p>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="card border-0 shadow-sm" style="border-radius: 20px;">
|
||||
<div class="card-body p-4">
|
||||
<form action="{{ route('pelatih.store') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
|
||||
<!-- Pilih Anggota -->
|
||||
<div class="mb-4">
|
||||
<label class="form-label fw-bold text-dark">Pilih Anggota</label>
|
||||
<select name="anggota_id" class="form-control select2 shadow-none" style="border-radius: 12px;" required>
|
||||
<option value="">-- Cari Nama atau No Induk --</option>
|
||||
@foreach($calon_pelatih as $anggota)
|
||||
<option value="{{ $anggota->id }}">{{ $anggota->no_induk }} - {{ $anggota->nama_lengkap }} ({{ $anggota->tingkatan }})</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<small class="text-muted">Hanya anggota yang belum memiliki jabatan pelatih yang muncul di sini.</small>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Nomor SK Pelatih</label>
|
||||
<input type="text" name="no_sk" class="form-control shadow-none" placeholder="Contoh: SK-MP/2024/001" style="border-radius: 10px;" required>
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Tanggal Terbit SK</label>
|
||||
<input type="date" name="tgl_sk" class="form-control shadow-none" style="border-radius: 10px;" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label class="form-label fw-bold text-dark">Masa Berlaku Hingga</label>
|
||||
<input type="date" name="masa_berlaku" class="form-control shadow-none" style="border-radius: 10px;" required>
|
||||
</div>
|
||||
<div class="col-md-6 mb-4">
|
||||
<label class="form-label fw-bold text-dark">Upload Scan SK (Gambar)</label>
|
||||
<input type="file" name="foto_sk" class="form-control shadow-none" style="border-radius: 10px;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex gap-2 pt-3">
|
||||
<button type="submit" class="btn btn-primary px-5 shadow-sm" style="border-radius: 12px;">Simpan & Upgrade</button>
|
||||
<a href="{{ route('pelatih.index') }}" class="btn btn-light px-4" style="border-radius: 12px;">Batal</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card border-0 shadow-sm" style="border-radius: 20px;">
|
||||
<div class="card-body p-4">
|
||||
|
||||
<!-- Title & Action Button -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<div class="text-start">
|
||||
hide<h5 class="card-title mb-0 fw-bold text-dark">Daftar Kolat PPS Merpati Putih</h5>
|
||||
<p class="text-muted small mb-0">Cabang Jember - Kelola lokasi dan unit latihan.</p>
|
||||
</div>
|
||||
<a href="{{ route('kolat.create') }}" class="btn btn-primary px-4 py-2 shadow-sm"
|
||||
style="border-radius: 12px;">
|
||||
<i class="icon-plus me-1"></i> Tambah Kolat
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Alert Success -->
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success border-0 shadow-sm mb-4" style="border-radius: 12px;">
|
||||
<i class="icon-check-circle me-2"></i> {{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover align-middle main-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th width="80">ID</th>
|
||||
<th>Nama Kelompok Latihan</th>
|
||||
<th>Alamat Lokasi</th>
|
||||
<th width="200">Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse ($data_kolat as $item)
|
||||
<tr>
|
||||
<td class="text-muted small text-center fw-bold">#{{ $item->id }}</td>
|
||||
<td>
|
||||
<div class="fw-bold text-dark">Kolat {{ $item->nama_kolat }}</div>
|
||||
<small class="text-muted d-block">Pusat Latihan Unit</small>
|
||||
</td>
|
||||
<td class="text-start">
|
||||
<span class="text-muted small">
|
||||
<i class="icon-map-pin me-1"></i> {{ $item->alamat_kolat ?? 'Alamat belum diatur' }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<div class="d-flex justify-content-center gap-2">
|
||||
<!-- Edit Button -->
|
||||
<a href="{{ route('kolat.edit', $item->id) }}"
|
||||
class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
||||
<i class="icon-pencil"></i> Edit
|
||||
</a>
|
||||
|
||||
<!-- Delete Button -->
|
||||
<form action="{{ route('kolat.destroy', $item->id) }}" method="POST"
|
||||
onsubmit="return confirm('Hapus Kolat ini? Anggota di dalamnya mungkin akan terdampak.')">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button type="submit" class="btn btn-sm btn-action-delete fw-bold px-3 shadow-xs">
|
||||
<i class="icon-trash"></i> Hapus
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="4" class="text-center py-5">
|
||||
<p class="text-muted">Belum ada data kolat yang tersedia.</p>
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card border-0 bg-primary text-white p-2 shadow-sm" style="border-radius: 20px;">
|
||||
<div class="card-body">
|
||||
<h5 class="fw-bold mb-3"><i class="icon-info me-2"></i>Informasi Pelatih</h5>
|
||||
<ul class="small opacity-8 text-white ps-3">
|
||||
<li class="mb-2">Anggota akan mendapatkan akses untuk mengelola jadwal latihan.</li>
|
||||
<li class="mb-2">ID Pelatih akan otomatis merujuk pada Nomor Induk Anggota.</li>
|
||||
<li>Pastikan SK yang diupload jelas dan dapat terbaca oleh admin cabang.</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
/* Samakan dengan Style Blade Anggota Anda */
|
||||
.main-table { text-align: center; vertical-align: middle; }
|
||||
.main-table thead th {
|
||||
background-color: #f8faff;
|
||||
padding: 18px 10px;
|
||||
font-size: 0.75rem;
|
||||
color: #8c98a5;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
border-bottom: 2px solid #edf2f9;
|
||||
}
|
||||
.main-table tbody td {
|
||||
padding: 20px 10px;
|
||||
border-bottom: 1px solid #f1f4f8;
|
||||
color: #495057;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
.btn-action-edit {
|
||||
background-color: #fff8e6;
|
||||
color: #f59e0b;
|
||||
border: 1px solid #ffecb3;
|
||||
border-radius: 10px;
|
||||
transition: 0.3s;
|
||||
}
|
||||
.btn-action-edit:hover {
|
||||
background-color: #f59e0b !important;
|
||||
color: white !important;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
.btn-action-delete {
|
||||
background-color: #fff5f5;
|
||||
color: #dc3545;
|
||||
border: 1px solid #ffe5e5;
|
||||
border-radius: 10px;
|
||||
transition: 0.3s;
|
||||
}
|
||||
.btn-action-delete:hover {
|
||||
background-color: #dc3545 !important;
|
||||
color: white !important;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
.shadow-xs { box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); }
|
||||
</style>
|
||||
<!-- Tambahkan script Select2 di layout utama atau di sini -->
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
$('.select2').select2({
|
||||
theme: 'bootstrap-5'
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
<?php
|
||||
|
||||
use App\Http\Controllers\AnggotaController;
|
||||
use App\Http\Controllers\JadwalController;
|
||||
use App\Http\Controllers\KolatController;
|
||||
use App\Http\Controllers\PelatihController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
|
@ -40,8 +41,6 @@
|
|||
Route::get('/anggota/{id}/edit', [AnggotaController::class, 'edit'])->name('anggota.edit');
|
||||
Route::put('/anggota/{id}', [AnggotaController::class, 'update'])->name('anggota.update');
|
||||
|
||||
//pelatih
|
||||
Route::get('/pelatih', [PelatihController::class, 'pelatih'])->name('pelatih.pelatih');
|
||||
|
||||
//kolat
|
||||
Route::get('/kolat', [KolatController::class, 'kolat'])->name('kolat.index');
|
||||
|
|
@ -51,3 +50,25 @@
|
|||
Route::put('/kolat/{id}', [KolatController::class, 'update'])->name('kolat.update');
|
||||
Route::delete('/kolat/{id}', [KolatController::class, 'destroy'])->name('kolat.destroy');
|
||||
|
||||
//pelatih
|
||||
//prefix diguakan untuk mengelompokkan route yang berhubungan dengan pelatih, sehingga URL nya menjadi /manajemen-pelatih/...
|
||||
Route::prefix('manajemen-pelatih')->group(function () {
|
||||
Route::get('/', [PelatihController::class, 'index'])->name('pelatih.index');
|
||||
Route::get('/upgrade', [PelatihController::class, 'create'])->name('pelatih.upgrade');
|
||||
Route::post('/upgrade', [PelatihController::class, 'store'])->name('pelatih.store');
|
||||
Route::get('/{id}/edit', [PelatihController::class, 'edit'])->name('pelatih.edit');
|
||||
Route::put('/{id}', [PelatihController::class, 'update'])->name('pelatih.update');
|
||||
});
|
||||
|
||||
//jadwal
|
||||
//prefix diguakan untuk mengelompokkan route yang berhubungan dengan jadwal
|
||||
Route::prefix('jadwal')->group(function () {
|
||||
Route::get('/', [JadwalController::class, 'index'])->name('jadwal.index');
|
||||
Route::get('/create', [JadwalController::class, 'create'])->name('jadwal.create');
|
||||
Route::get('/{id}/detail', [JadwalController::class, 'show'])->name('jadwal.show');
|
||||
Route::post('/store', [JadwalController::class, 'store'])->name('jadwal.store');
|
||||
Route::get('/{id}/edit', [JadwalController::class, 'edit'])->name('jadwal.edit');
|
||||
Route::put('/{id}/update', [JadwalController::class, 'update'])->name('jadwal.update');
|
||||
Route::delete('/{id}/delete', [JadwalController::class, 'destroy'])->name('jadwal.destroy');
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue