login + register, update view anggota
This commit is contained in:
parent
65bc2458ac
commit
e28efe700b
|
|
@ -5,7 +5,11 @@
|
|||
use App\Models\Anggota;
|
||||
use App\Models\Kolat; // Import model Kolat
|
||||
use App\Models\Role;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class AnggotaController extends Controller
|
||||
{
|
||||
|
|
@ -31,45 +35,73 @@ public function create()
|
|||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
// 1. Validasi diperbaiki (Hapus jabatan dari required karena kita isi manual)
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|email|unique:users,email',
|
||||
'nama_lengkap' => 'required',
|
||||
'no_hp' => 'required',
|
||||
'role_id' => 'required|exists:role,id', // pastikan nama tabel benar
|
||||
'role_id' => 'required|exists:role,id',
|
||||
'kolat_id' => 'required|exists:kolat,id',
|
||||
'jenis_kelamin'=> 'required',
|
||||
'jenis_kelamin' => 'required',
|
||||
'tempat_lahir' => 'required',
|
||||
'tgl_lahir' => 'required|date',
|
||||
'tingkatan' => 'required',
|
||||
'tgl_gabung' => 'required|date',
|
||||
]);
|
||||
|
||||
// 2. Ambil nama role untuk mengisi kolom jabatan secara otomatis
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// A. Buat Akun Login di tabel Users
|
||||
$user = User::create([
|
||||
'email' => $request->email,
|
||||
'password' => Hash::make('tapakmp123'), // Password default
|
||||
'role_id' => $request->role_id,
|
||||
]);
|
||||
|
||||
// B. Cari nama jabatan berdasarkan role
|
||||
$role = Role::find($request->role_id);
|
||||
$nama_jabatan = strtolower($role->nama_role);
|
||||
|
||||
// 3. Logika No Induk
|
||||
// C. Logika No Induk (JB-001)
|
||||
$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;
|
||||
|
||||
// 4. Gabungkan semua data
|
||||
$data = $request->all();
|
||||
$data['no_induk'] = $no_induk_baru;
|
||||
$data['jabatan'] = $nama_jabatan; // Mengisi kolom jabatan otomatis
|
||||
|
||||
// 5. Simpan (Pastikan fillable di Model sudah lengkap)
|
||||
Anggota::create($data);
|
||||
// D. Simpan Profil di tabel Anggotas
|
||||
Anggota::create([
|
||||
'user_id' => $user->id,
|
||||
'no_induk' => $no_induk_baru,
|
||||
'nama_lengkap' => $request->nama_lengkap,
|
||||
'role_id' => $request->role_id,
|
||||
'jenis_kelamin' => $request->jenis_kelamin,
|
||||
'tempat_lahir' => $request->tempat_lahir,
|
||||
'tgl_lahir' => $request->tgl_lahir,
|
||||
'no_hp' => $request->no_hp,
|
||||
'kolat_id' => $request->kolat_id,
|
||||
'tingkatan' => $request->tingkatan,
|
||||
'tgl_gabung' => $request->tgl_gabung,
|
||||
'alamat' => $request->alamat,
|
||||
'catatan_medis' => $request->catatan_medis,
|
||||
'jabatan' => $nama_jabatan,
|
||||
'status' => 'aktif', // Input admin otomatis aktif
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
return redirect()->route('anggota.anggota')
|
||||
->with('success', 'Anggota berhasil terdaftar!');
|
||||
}
|
||||
->with('success', 'Data berhasil ditambah! Password login: tapakmp123');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
Log::error("Gagal tambah anggota: " . $e->getMessage());
|
||||
return back()->withInput()->with('error', 'Terjadi kesalahan sistem.');
|
||||
}
|
||||
}
|
||||
|
||||
// 4. Menampilkan Form Edit
|
||||
public function edit($id)
|
||||
{
|
||||
$anggota = Anggota::findOrFail($id);
|
||||
$anggota = Anggota::with('user')->findOrFail($id);
|
||||
$data_kolat = Kolat::all(); // Ambil daftar kolat lagi untuk pilihan saat edit
|
||||
$data_role = Role::all();
|
||||
|
||||
|
|
@ -80,20 +112,45 @@ public function edit($id)
|
|||
public function update(Request $request, $id)
|
||||
{
|
||||
$anggota = Anggota::findOrFail($id);
|
||||
$user = User::findOrFail($anggota->user_id);
|
||||
|
||||
$request->validate([
|
||||
'no_induk' => 'required|unique:anggotas,no_induk,' . $id,
|
||||
'email' => 'required|email|unique:users,email,' . $user->id,
|
||||
'nama_lengkap' => 'required',
|
||||
'no_hp' => 'required',
|
||||
'jabatan' => 'required|in:pengurus,pelatih,anggota',
|
||||
'role_id' => 'required|exists:role,id',
|
||||
'kolat_id' => 'required|exists:kolat,id',
|
||||
'status' => 'required|in:aktif,Non-Aktif',
|
||||
]);
|
||||
|
||||
// Update data menggunakan data yang sudah divalidasi
|
||||
$anggota->update($request->all());
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// A. Update tabel User (email & role)
|
||||
$user->update([
|
||||
'email' => $request->email,
|
||||
'role_id' => $request->role_id
|
||||
]);
|
||||
|
||||
// B. Update jabatan berdasarkan role baru
|
||||
$role = Role::find($request->role_id);
|
||||
$nama_jabatan = strtolower($role->nama_role);
|
||||
|
||||
// C. Update tabel Anggota
|
||||
$data_anggota = $request->all();
|
||||
$data_anggota['jabatan'] = $nama_jabatan;
|
||||
|
||||
$anggota->update($data_anggota);
|
||||
|
||||
DB::commit();
|
||||
return redirect()->route('anggota.anggota')
|
||||
->with('success', 'Data ' . $anggota->nama_lengkap . ' Berhasil Diperbarui!');
|
||||
->with('success', 'Data ' . $anggota->nama_lengkap . ' berhasil diperbarui!');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
Log::error("Gagal update anggota: " . $e->getMessage());
|
||||
return back()->with('error', 'Terjadi kesalahan saat memperbarui data.');
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,145 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Anggota;
|
||||
use App\Models\Kolat;
|
||||
use App\Models\Role;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class AuthController extends Controller
|
||||
{
|
||||
/**
|
||||
* Menampilkan Halaman Login
|
||||
*/
|
||||
public function showLogin()
|
||||
{
|
||||
return view('login-register.login');
|
||||
}
|
||||
|
||||
/**
|
||||
* Proses Login
|
||||
*/
|
||||
public function login(Request $request)
|
||||
{
|
||||
$credentials = $request->validate([
|
||||
'email' => 'required|email',
|
||||
'password' => 'required',
|
||||
]);
|
||||
|
||||
if (Auth::attempt($credentials)) {
|
||||
$user = Auth::user();
|
||||
|
||||
// Proteksi Status: Jika belum diaktifkan admin, tidak boleh masuk
|
||||
if ($user->anggota && $user->anggota->status !== 'Aktif') {
|
||||
Auth::logout();
|
||||
return back()->with('error', 'Akun Anda sedang dalam tahap verifikasi admin. Mohon tunggu.');
|
||||
}
|
||||
|
||||
$request->session()->regenerate();
|
||||
|
||||
// Redirect sesuai role jika diperlukan, atau ke dashboard utama
|
||||
return redirect()->intended('/dashboard')->with('success', 'Selamat datang kembali!');
|
||||
}
|
||||
|
||||
return back()->withErrors([
|
||||
'email' => 'Email atau password yang Anda masukkan salah.',
|
||||
])->onlyInput('email');
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan Halaman Register
|
||||
*/
|
||||
public function showRegister()
|
||||
{
|
||||
$data_kolat = Kolat::all();
|
||||
return view('login-register.register', compact('data_kolat'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Proses Register (User & Anggota)
|
||||
*/
|
||||
public function register(Request $request)
|
||||
{
|
||||
// 1. Validasi Input
|
||||
$request->validate([
|
||||
'email' => 'required|email|unique:users,email',
|
||||
'password' => 'required|min:6|confirmed',
|
||||
'nama_lengkap' => 'required|string|max:255',
|
||||
'no_hp' => 'required',
|
||||
'jenis_kelamin' => 'required|in:L,P',
|
||||
'tempat_lahir' => 'required',
|
||||
'tgl_lahir' => 'required|date',
|
||||
'alamat' => 'required',
|
||||
'kolat_id' => 'required|exists:kolat,id',
|
||||
'tingkatan' => 'required',
|
||||
'tgl_gabung' => 'required|date',
|
||||
]);
|
||||
|
||||
// Cari ID Role "Anggota"
|
||||
$role = Role::where('nama_role', 'Anggota')->first();
|
||||
$role_id = $role ? $role->id : 2;
|
||||
|
||||
// Gunakan Transaction agar data User & Anggota sinkron
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
// 2. Buat Akun User
|
||||
$user = User::create([
|
||||
'email' => $request->email,
|
||||
'password' => Hash::make($request->password),
|
||||
'role_id' => $role_id,
|
||||
]);
|
||||
|
||||
// 3. Logika Penomoran Induk JB-xxx
|
||||
$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;
|
||||
|
||||
// 4. Buat Profil Anggota
|
||||
Anggota::create([
|
||||
'user_id' => $user->id,
|
||||
'no_induk' => $no_induk_baru,
|
||||
'nama_lengkap' => $request->nama_lengkap,
|
||||
'role_id' => $role_id,
|
||||
'jenis_kelamin' => $request->jenis_kelamin,
|
||||
'tempat_lahir' => $request->tempat_lahir,
|
||||
'tgl_lahir' => $request->tgl_lahir,
|
||||
'no_hp' => $request->no_hp,
|
||||
'kolat_id' => $request->kolat_id,
|
||||
'tingkatan' => $request->tingkatan,
|
||||
'tgl_gabung' => $request->tgl_gabung,
|
||||
'alamat' => $request->alamat,
|
||||
'catatan_medis' => $request->catatan_medis,
|
||||
'jabatan' => 'anggota',
|
||||
'status' => 'Non-Aktif', // Default sesuai permintaanmu
|
||||
]);
|
||||
|
||||
DB::commit();
|
||||
|
||||
return redirect()->route('login')->with('success', 'Registrasi Berhasil! Akun Anda akan segera diverifikasi oleh Admin.');
|
||||
|
||||
} catch (\Exception $e) {
|
||||
DB::rollBack();
|
||||
Log::error("Register Error: " . $e->getMessage());
|
||||
return back()->withInput()->with('error', 'Terjadi kesalahan sistem saat mendaftar.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Proses Logout
|
||||
*/
|
||||
public function logout(Request $request)
|
||||
{
|
||||
Auth::logout();
|
||||
$request->session()->invalidate();
|
||||
$request->session()->regenerateToken();
|
||||
|
||||
return redirect('/login')->with('success', 'Anda telah berhasil keluar.');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class DashboardController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return view('dashboard.dashboard');
|
||||
}
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ class Anggota extends Model
|
|||
protected $table = 'anggotas';
|
||||
|
||||
protected $fillable = [
|
||||
'no_induk', 'nama_lengkap', 'role_id', 'jenis_kelamin',
|
||||
'user_id', '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'
|
||||
|
|
@ -48,4 +48,10 @@ public function evaluasiMasuk()
|
|||
return $this->hasMany(Penilaian::class, 'pelatih_id');
|
||||
}
|
||||
|
||||
// Anggota.php
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(User::class, 'user_id');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ class User extends Authenticatable
|
|||
* @var array<int, string>
|
||||
*/
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'role_id',
|
||||
'email',
|
||||
'password',
|
||||
];
|
||||
|
|
@ -42,4 +42,16 @@ class User extends Authenticatable
|
|||
'email_verified_at' => 'datetime',
|
||||
'password' => 'hashed',
|
||||
];
|
||||
|
||||
public function anggota()
|
||||
{
|
||||
// Setiap User memiliki satu data profil Anggota
|
||||
return $this->hasOne(Anggota::class, 'user_id');
|
||||
}
|
||||
|
||||
// Relasi ke tabel Role
|
||||
public function role()
|
||||
{
|
||||
return $this->belongsTo(Role::class, 'role_id');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
<?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::table('users', function (Blueprint $table) {
|
||||
$table->foreignId('role_id')->after('id')->constrained('role')->onDelete('cascade');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->dropForeign(['role_id']);
|
||||
$table->dropColumn('role_id');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
<?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::table('anggotas', function (Blueprint $table) {
|
||||
$table->foreignId('user_id')
|
||||
->nullable()
|
||||
->after('id')
|
||||
->constrained('users')
|
||||
->onDelete('cascade');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('anggotas', function (Blueprint $table) {
|
||||
$table->dropForeign(['user_id']);
|
||||
$table->dropColumn('user_id');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?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::table('users', function (Blueprint $table) {
|
||||
$table->dropColumn('name');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('users', function (Blueprint $table) {
|
||||
$table->string('name')->after('id')->nullable();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -21,5 +21,8 @@ public function run(): void
|
|||
// 'name' => 'Test User',
|
||||
// 'email' => 'test@example.com',
|
||||
// ]);
|
||||
$this->call([
|
||||
RoleSeeder::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@
|
|||
<tr>
|
||||
<th width="60">No</th>
|
||||
<th>Identitas Anggota</th>
|
||||
<th>Email</th>
|
||||
<th>JK</th>
|
||||
<th>Tingkatan & Kolat</th>
|
||||
<th>Jabatan</th>
|
||||
|
|
@ -46,24 +47,34 @@
|
|||
<tr>
|
||||
<td class="text-muted small text-center">{{ $no + 1 }}</td>
|
||||
<td>
|
||||
<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>
|
||||
<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-start">
|
||||
<div class="text-dark small fw-medium">{{ $item->user->email ?? '-' }}</div>
|
||||
</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->kolat->nama_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">
|
||||
{{-- Karena di filter 'anggota', maka jabatan otomatis Anggota --}}
|
||||
<span class="badge bg-light text-dark border px-3" style="border-radius: 8px;">Anggota</span>
|
||||
<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>
|
||||
|
|
@ -84,14 +95,17 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
|||
</tr>
|
||||
|
||||
{{-- MODAL DETAIL --}}
|
||||
<div class="modal fade" id="modalDetail{{ $item->id }}" tabindex="-1" aria-hidden="true">
|
||||
<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">
|
||||
<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">
|
||||
|
|
@ -99,12 +113,15 @@ 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>
|
||||
</div>
|
||||
|
|
@ -112,46 +129,69 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
|||
<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->kolat->nama_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</small>
|
||||
<span class="fw-bold text-primary text-uppercase">{{ $item->role->nama_role ?? 'ANGGOTA' }}</span>
|
||||
<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>
|
||||
<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-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 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>
|
||||
|
|
@ -159,14 +199,17 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
|||
</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>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="7" class="text-center py-5 text-muted small">Belum ada data anggota terdaftar.</td>
|
||||
<td colspan="7" class="text-center py-5 text-muted small">Belum ada data
|
||||
anggota terdaftar.</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
|
|
@ -180,16 +223,80 @@ class="btn btn-sm btn-action-edit fw-bold px-3 shadow-xs">
|
|||
</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; }
|
||||
.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); }
|
||||
.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
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
@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">
|
||||
|
|
@ -16,7 +15,6 @@
|
|||
<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">
|
||||
|
|
@ -38,22 +36,29 @@
|
|||
@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">
|
||||
<h5 class="fw-bold text-primary mb-0"><i class="icon-user me-2"></i>Informasi Pribadi</h5>
|
||||
<h5 class="fw-bold text-primary mb-0"><i class="icon-user me-2"></i>Informasi Pribadi & Akun</h5>
|
||||
</div>
|
||||
<div class="card-body p-4">
|
||||
<div class="row g-3">
|
||||
<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' : '' }}"
|
||||
<input type="text" name="nama_lengkap" class="form-control"
|
||||
value="{{ old('nama_lengkap', $anggota->nama_lengkap ?? '') }}"
|
||||
{{ isset($anggota) ? 'readonly' : '' }} required placeholder="Nama lengkap sesuai identitas">
|
||||
required placeholder="Nama lengkap sesuai identitas">
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">Alamat Email (Untuk Login)</label>
|
||||
<input type="email" name="email" class="form-control {{ isset($anggota) ? 'bg-light' : '' }}"
|
||||
value="{{ old('email', $anggota->user->email ?? '') }}"
|
||||
{{ isset($anggota) ? 'readonly' : '' }} required placeholder="email@contoh.com">
|
||||
@if(!isset($anggota))
|
||||
<small class="text-muted">Password default: <strong>tapakmp123</strong></small>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">No. WhatsApp</label>
|
||||
<div class="input-group">
|
||||
|
|
@ -80,15 +85,14 @@
|
|||
<option value="P" {{ old('jenis_kelamin', $anggota->jenis_kelamin ?? '') == 'P' ? 'selected' : '' }}>Perempuan</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">Alamat Lengkap</label>
|
||||
<textarea name="alamat" class="form-control" rows="2" placeholder="Alamat lengkap domisili..." required>{{ old('alamat', $anggota->alamat ?? '') }}</textarea>
|
||||
<textarea name="alamat" class="form-control" rows="1" placeholder="Alamat lengkap domisili..." required>{{ old('alamat', $anggota->alamat ?? '') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- CARD 2: INFORMASI ORGANISASI -->
|
||||
<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">
|
||||
<h5 class="fw-bold text-success mb-0"><i class="icon-badge me-2"></i>Informasi Organisasi</h5>
|
||||
|
|
@ -114,12 +118,11 @@
|
|||
<div class="col-md-4">
|
||||
<label class="form-label fw-bold">Status Keanggotaan</label>
|
||||
<select name="status" class="form-select" required>
|
||||
<option value="Aktif" {{ old('status', $anggota->status ?? '') == 'Aktif' ? 'selected' : '' }}>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="icon-file-text me-2"></i>Data Legalitas (Khusus Pelatih/Pengurus)</h6>
|
||||
<div class="row g-3">
|
||||
|
|
@ -160,12 +163,11 @@
|
|||
|
||||
<div class="col-12 mt-4">
|
||||
<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>
|
||||
<textarea name="catatan_medis" class="form-control" rows="2" placeholder="Contoh: Riwayat asma atau cedera fisik.">{{ old('catatan_medis', $anggota->catatan_medis ?? '') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- FOOTER CARD UNTUK BUTTON -->
|
||||
<div class="card-footer bg-light border-0 p-4" style="border-radius: 0 0 20px 20px;">
|
||||
<div class="d-flex justify-content-end align-items-center gap-3">
|
||||
<a href="{{ route('anggota.anggota') }}" class="btn btn-outline-secondary px-4 fw-bold btn-cancel">
|
||||
|
|
@ -186,36 +188,25 @@
|
|||
function toggleSKFields() {
|
||||
const roleSelect = document.getElementById('roleSelect');
|
||||
const boxSK = document.getElementById('boxSK');
|
||||
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();
|
||||
const selectedText = roleSelect.options[roleSelect.selectedIndex].text.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';
|
||||
// Tampilkan box SK jika role mengandung kata Pelatih atau Pengurus
|
||||
if (selectedText.includes('pelatih') || selectedText.includes('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;
|
||||
|
|
|
|||
|
|
@ -2,7 +2,10 @@
|
|||
|
||||
@section('content')
|
||||
<div class="container-fluid py-4">
|
||||
<<<<<<< Updated upstream
|
||||
<!-- Header & Breadcrumb -->
|
||||
=======
|
||||
>>>>>>> Stashed changes
|
||||
<div class="page-header mb-4 text-start">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb bg-transparent p-0 mb-2">
|
||||
|
|
@ -17,11 +20,15 @@ class="text-muted text-decoration-none small">Daftar Anggota</a></li>
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<<<<<<< Updated upstream
|
||||
<!-- Form Start - Pastikan enctype ada untuk upload foto SK -->
|
||||
=======
|
||||
>>>>>>> Stashed changes
|
||||
<form action="{{ route('anggota.update', $anggota->id) }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
<!-- 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">
|
||||
|
|
@ -157,11 +164,139 @@ class="btn btn-outline-secondary px-4 fw-bold btn-cancel">
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
=======
|
||||
<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">
|
||||
<h5 class="fw-bold text-primary mb-0"><i class="icon-user me-2"></i>Informasi Pribadi & Akun</h5>
|
||||
</div>
|
||||
<div class="card-body p-4">
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">No Induk</label>
|
||||
<input type="text" class="form-control bg-light fw-bold text-primary"
|
||||
value="{{ $anggota->no_induk }}" readonly>
|
||||
<small class="text-muted" style="font-size: 11px;">* No. induk permanen</small>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">Nama Lengkap</label>
|
||||
<input type="text" name="nama_lengkap" class="form-control"
|
||||
value="{{ old('nama_lengkap', $anggota->nama_lengkap) }}" required>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">Alamat Email (Login)</label>
|
||||
<input type="email" name="email" class="form-control"
|
||||
value="{{ old('email', $anggota->user->email ?? '') }}" required>
|
||||
<small class="text-muted" style="font-size: 11px;">* Email digunakan untuk masuk ke sistem</small>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<label class="form-label fw-bold">No. WhatsApp (HP)</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="{{ old('no_hp', $anggota->no_hp) }}" placeholder="81234567xxx" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<label class="form-label fw-bold">Alamat Lengkap</label>
|
||||
<textarea name="alamat" class="form-control" rows="2" required>{{ old('alamat', $anggota->alamat) }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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">
|
||||
<h5 class="fw-bold text-success mb-0"><i class="icon-badge me-2"></i>Informasi Organisasi</h5>
|
||||
</div>
|
||||
<div class="card-body p-4">
|
||||
<div class="row g-3">
|
||||
<div class="col-md-4">
|
||||
<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>-- Pilih Jabatan --</option>
|
||||
@foreach ($data_role as $role)
|
||||
<option value="{{ $role->id }}"
|
||||
{{ 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">Tingkatan Sabuk</label>
|
||||
<input type="text" name="tingkatan" class="form-control"
|
||||
value="{{ old('tingkatan', $anggota->tingkatan) }}" required>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<label class="form-label fw-bold">Status Anggota</label>
|
||||
<select name="status" class="form-select" required>
|
||||
<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>
|
||||
|
||||
<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="icon-certificate me-2"></i>Data Legalitas SK</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="{{ old('no_sk', $anggota->no_sk) }}" placeholder="Contoh: SK/001/2026">
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<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">Update File SK (Opsional)</label>
|
||||
<input type="file" name="foto_sk" class="form-control">
|
||||
@if ($anggota->foto_sk)
|
||||
<small class="text-primary mt-1 d-block"><i class="icon-eye"></i> File saat ini: {{ $anggota->foto_sk }}</small>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-12 mt-3">
|
||||
<label class="form-label fw-bold">Asal Kolat</label>
|
||||
<select name="kolat_id" class="form-select" required>
|
||||
<option value="" disabled>-- Pilih Kolat --</option>
|
||||
@foreach ($data_kolat as $kolat)
|
||||
<option value="{{ $kolat->id }}"
|
||||
{{ old('kolat_id', $anggota->kolat_id) == $kolat->id ? 'selected' : '' }}>
|
||||
{{ $kolat->nama_kolat }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-footer bg-light border-0 p-4" style="border-radius: 0 0 20px 20px;">
|
||||
<div class="d-flex justify-content-end align-items-center gap-3">
|
||||
<a href="{{ route('anggota.anggota') }}"
|
||||
class="btn btn-outline-secondary px-4 fw-bold btn-cancel">
|
||||
<i class="icon-x me-1"></i> Batal
|
||||
</a>
|
||||
<button type="submit" class="btn btn-primary px-5 fw-bold btn-save shadow">
|
||||
<i class="icon-check me-1"></i> Simpan Perubahan
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
>>>>>>> Stashed changes
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<<<<<<< Updated upstream
|
||||
<!-- JAVASCRIPT TOGGLE -->
|
||||
<script>
|
||||
function toggleSKFields() {
|
||||
|
|
@ -176,12 +311,31 @@ function toggleSKFields() {
|
|||
}
|
||||
|
||||
// Jalankan saat pertama kali halaman dimuat
|
||||
=======
|
||||
<script>
|
||||
function toggleSKFields() {
|
||||
const roleSelect = document.getElementById('roleSelect');
|
||||
const boxSK = document.getElementById('boxSK');
|
||||
|
||||
if (roleSelect.selectedIndex >= 0) {
|
||||
const selectedText = roleSelect.options[roleSelect.selectedIndex].text.toLowerCase();
|
||||
|
||||
if (selectedText.includes('pelatih') || selectedText.includes('pengurus')) {
|
||||
boxSK.style.display = 'block';
|
||||
} else {
|
||||
boxSK.style.display = 'none';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>>>>>>> Stashed changes
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
toggleSKFields();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style>
|
||||
<<<<<<< Updated upstream
|
||||
.form-control,
|
||||
.form-select {
|
||||
border-radius: 10px;
|
||||
|
|
@ -190,12 +344,22 @@ function toggleSKFields() {
|
|||
|
||||
.form-control:focus,
|
||||
.form-select:focus {
|
||||
=======
|
||||
.form-control, .form-select {
|
||||
border-radius: 10px;
|
||||
padding: 10px 15px;
|
||||
border: 1px solid #dce1e7;
|
||||
}
|
||||
|
||||
.form-control:focus, .form-select:focus {
|
||||
>>>>>>> Stashed changes
|
||||
border-color: #0d6efd;
|
||||
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.1);
|
||||
}
|
||||
|
||||
.btn-cancel {
|
||||
border-radius: 12px;
|
||||
<<<<<<< Updated upstream
|
||||
transition: all 0.3s ease;
|
||||
border: 2px solid #6c757d;
|
||||
}
|
||||
|
|
@ -216,6 +380,16 @@ function toggleSKFields() {
|
|||
.btn-save:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 5px 15px rgba(13, 110, 253, 0.4) !important;
|
||||
=======
|
||||
border: 2px solid #6c757d;
|
||||
}
|
||||
|
||||
.btn-save {
|
||||
border-radius: 12px;
|
||||
background: linear-gradient(45deg, #0d6efd, #004dc0);
|
||||
border: none;
|
||||
color: white;
|
||||
>>>>>>> Stashed changes
|
||||
}
|
||||
</style>
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
@extends('layout.app')
|
||||
|
||||
@section('content')
|
||||
<p>Halo aku afi</p>
|
||||
@endsection
|
||||
|
|
@ -0,0 +1,148 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="id">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
||||
<title>Login - TapakMP</title>
|
||||
|
||||
<link href="{{ asset('assets/img/favicon.png') }}" rel="icon">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link href="{{ asset('assets/vendor/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
|
||||
<link href="{{ asset('assets/vendor/bootstrap-icons/bootstrap-icons.css') }}" rel="stylesheet">
|
||||
<link href="{{ asset('assets/css/main.css') }}" rel="stylesheet">
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--accent-color: #feb900;
|
||||
--dark-blue: #06163a;
|
||||
}
|
||||
body {
|
||||
background: linear-gradient(rgba(6, 22, 58, 0.8), rgba(6, 22, 58, 0.8)), url('{{ asset("assets/img/construction/mpfoto.jpeg") }}') center/cover no-repeat;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
}
|
||||
.auth-card {
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 15px 35px rgba(0,0,0,0.2);
|
||||
border-top: 5px solid var(--accent-color);
|
||||
}
|
||||
.auth-header {
|
||||
background: var(--dark-blue);
|
||||
padding: 30px;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
}
|
||||
.auth-header h2 {
|
||||
font-family: 'Ubuntu', sans-serif;
|
||||
font-weight: 700;
|
||||
margin: 0;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
.auth-body { padding: 40px; }
|
||||
.form-control:focus {
|
||||
border-color: var(--accent-color);
|
||||
box-shadow: 0 0 0 0.25rem rgba(254, 185, 0, 0.1);
|
||||
}
|
||||
.btn-auth {
|
||||
background-color: var(--accent-color);
|
||||
border: none;
|
||||
color: var(--dark-blue);
|
||||
font-weight: 700;
|
||||
padding: 12px;
|
||||
transition: 0.3s;
|
||||
}
|
||||
.btn-auth:hover {
|
||||
background-color: #e5a700;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
.back-home {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.back-home:hover { color: var(--accent-color); }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-5">
|
||||
<a href="/" class="back-home"><i class="bi bi-arrow-left"></i> Kembali ke Beranda</a>
|
||||
|
||||
<div class="auth-card">
|
||||
<div class="auth-header">
|
||||
<h1 class="h3 mb-1" style="color: var(--accent-color)">TapakMP</h1>
|
||||
<p class="small mb-0 text-white-50 text-uppercase">Portal Anggota Cabang Jember</p>
|
||||
</div>
|
||||
|
||||
<div class="auth-body">
|
||||
<form action="{{ route('login') }}" method="POST">
|
||||
@csrf
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-bold">Alamat Email</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light"><i class="bi bi-envelope"></i></span>
|
||||
<input type="email" name="email" class="form-control" placeholder="nama@email.com" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-4">
|
||||
<div class="d-flex justify-content-between">
|
||||
<label class="form-label fw-bold">Kata Sandi</label>
|
||||
<a href="#" class="small text-muted text-decoration-none">Lupa Password?</a>
|
||||
</div>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light"><i class="bi bi-lock"></i></span>
|
||||
<input type="password" name="password" class="form-control" placeholder="••••••••" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-grid">
|
||||
<button type="submit" class="btn btn-auth mb-3">MASUK SEKARANG</button>
|
||||
</div>
|
||||
|
||||
<div class="text-center">
|
||||
<p class="small mb-0">Belum punya akun? <a href="/register" class="text-primary fw-bold text-decoration-none">Daftar di sini</a></p>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Popup jika berhasil register atau pesan sukses lainnya
|
||||
@if(session('success'))
|
||||
Swal.fire({
|
||||
icon: 'success',
|
||||
title: 'Berhasil!',
|
||||
text: "{{ session('success') }}",
|
||||
confirmButtonColor: '#06163a'
|
||||
});
|
||||
@endif
|
||||
|
||||
// Popup jika gagal login atau akun non-aktif
|
||||
@if(session('error'))
|
||||
Swal.fire({
|
||||
icon: 'warning',
|
||||
title: 'Perhatian',
|
||||
text: "{{ session('error') }}",
|
||||
confirmButtonColor: '#06163a'
|
||||
});
|
||||
@endif
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,246 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="id">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport">
|
||||
<title>Daftar Anggota - TapakMP</title>
|
||||
|
||||
<link href="{{ asset('assets/img/favicon.png') }}" rel="icon">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link href="{{ asset('assets/vendor/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet">
|
||||
<link href="{{ asset('assets/vendor/bootstrap-icons/bootstrap-icons.css') }}" rel="stylesheet">
|
||||
<link href="{{ asset('assets/css/main.css') }}" rel="stylesheet">
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--accent-color: #feb900;
|
||||
--dark-blue: #06163a;
|
||||
}
|
||||
|
||||
body {
|
||||
background: linear-gradient(rgba(6, 22, 58, 0.8), rgba(6, 22, 58, 0.8)),
|
||||
url('{{ asset("assets/img/construction/mpfoto.jpeg") }}') center/cover no-repeat;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
.auth-card {
|
||||
background: #fff;
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2);
|
||||
border-top: 5px solid var(--accent-color);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
max-height: 90vh;
|
||||
}
|
||||
|
||||
.auth-header {
|
||||
background: var(--dark-blue);
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.auth-body-scroll {
|
||||
padding: 25px 30px;
|
||||
overflow-y: auto;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.auth-footer {
|
||||
padding: 15px 30px;
|
||||
background: #f8f9fa;
|
||||
border-top: 1px solid #eee;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.section-title {
|
||||
color: var(--dark-blue);
|
||||
border-left: 4px solid var(--accent-color);
|
||||
padding-left: 12px;
|
||||
margin: 20px 0 15px 0;
|
||||
font-size: 0.85rem;
|
||||
text-transform: uppercase;
|
||||
font-weight: 700;
|
||||
letter-spacing: 1px;
|
||||
display: table;
|
||||
line-height: 1;
|
||||
padding-top: 2px;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.form-control:focus, .form-select:focus {
|
||||
border-color: var(--accent-color);
|
||||
box-shadow: 0 0 0 0.25rem rgba(254, 185, 0, 0.1);
|
||||
}
|
||||
|
||||
.btn-auth {
|
||||
background-color: var(--accent-color);
|
||||
border: none;
|
||||
color: var(--dark-blue);
|
||||
font-weight: 700;
|
||||
padding: 12px;
|
||||
transition: 0.3s;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.btn-auth:hover {
|
||||
background-color: #e5a700;
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.back-home {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
margin-bottom: 15px;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.back-home:hover { color: var(--accent-color); }
|
||||
|
||||
.auth-body-scroll::-webkit-scrollbar { width: 5px; }
|
||||
.auth-body-scroll::-webkit-scrollbar-thumb { background: #ddd; border-radius: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8 col-lg-6">
|
||||
<a href="/" class="back-home"><i class="bi bi-arrow-left"></i> Kembali ke Beranda</a>
|
||||
|
||||
<div class="auth-card">
|
||||
<div class="auth-header">
|
||||
<h1 class="h4 mb-1" style="color: var(--accent-color); font-family: 'Ubuntu', sans-serif; font-weight: 700;">TapakMP</h1>
|
||||
<p class="small mb-0 text-white-50 text-uppercase" style="font-size: 0.7rem; letter-spacing: 1px;">Pendaftaran Anggota Baru</p>
|
||||
</div>
|
||||
|
||||
<form action="{{ route('register') }}" method="POST" class="d-flex flex-column" style="overflow: hidden;">
|
||||
@csrf
|
||||
|
||||
<div class="auth-body-scroll">
|
||||
<div class="section-title" style="margin-top: 0;">1. Informasi Akun</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-bold small">Alamat Email</label>
|
||||
<div class="input-group">
|
||||
<span class="input-group-text bg-light text-muted"><i class="bi bi-envelope"></i></span>
|
||||
<input type="email" name="email" class="form-control" value="{{ old('email') }}" placeholder="nama@email.com" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-2">
|
||||
<div class="col-6 mb-3">
|
||||
<label class="form-label fw-bold small">Kata Sandi</label>
|
||||
<input type="password" name="password" class="form-control" placeholder="••••••••" required>
|
||||
</div>
|
||||
<div class="col-6 mb-3">
|
||||
<label class="form-label fw-bold small">Konfirmasi</label>
|
||||
<input type="password" name="password_confirmation" class="form-control" placeholder="••••••••" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section-title">2. Data Pribadi</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-bold small">Nama Lengkap</label>
|
||||
<input type="text" name="nama_lengkap" class="form-control" value="{{ old('nama_lengkap') }}" placeholder="Sesuai KTP/KTA" required>
|
||||
</div>
|
||||
|
||||
<div class="row g-2">
|
||||
<div class="col-6 mb-3">
|
||||
<label class="form-label fw-bold small">No. WhatsApp</label>
|
||||
<input type="text" name="no_hp" class="form-control" value="{{ old('no_hp') }}" placeholder="0812..." required>
|
||||
</div>
|
||||
<div class="col-6 mb-3">
|
||||
<label class="form-label fw-bold small">Jenis Kelamin</label>
|
||||
<select name="jenis_kelamin" class="form-select" required>
|
||||
<option value="" selected disabled>Pilih...</option>
|
||||
<option value="L" {{ old('jenis_kelamin') == 'L' ? 'selected' : '' }}>Laki-laki</option>
|
||||
<option value="P" {{ old('jenis_kelamin') == 'P' ? 'selected' : '' }}>Perempuan</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-2">
|
||||
<div class="col-7 mb-3">
|
||||
<label class="form-label fw-bold small">Tempat Lahir</label>
|
||||
<input type="text" name="tempat_lahir" class="form-control" value="{{ old('tempat_lahir') }}" required>
|
||||
</div>
|
||||
<div class="col-5 mb-3">
|
||||
<label class="form-label fw-bold small">Tgl Lahir</label>
|
||||
<input type="date" name="tgl_lahir" class="form-control" value="{{ old('tgl_lahir') }}" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-bold small">Alamat Lengkap</label>
|
||||
<textarea name="alamat" class="form-control" rows="2" placeholder="Alamat domisili saat ini..." required>{{ old('alamat') }}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="section-title">3. Organisasi & Medis</div>
|
||||
|
||||
<div class="row g-2">
|
||||
<div class="col-6 mb-3">
|
||||
<label class="form-label fw-bold small">Asal Kolat</label>
|
||||
<select name="kolat_id" class="form-select" required>
|
||||
@foreach($data_kolat as $kolat)
|
||||
<option value="{{ $kolat->id }}" {{ old('kolat_id') == $kolat->id ? 'selected' : '' }}>{{ $kolat->nama_kolat }}</option>
|
||||
@endforeach
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-6 mb-3">
|
||||
<label class="form-label fw-bold small">Tingkatan Sabuk</label>
|
||||
<input type="text" name="tingkatan" class="form-control" value="{{ old('tingkatan') }}" placeholder="Contoh: Dasar I" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label class="form-label fw-bold small">Tanggal Gabung</label>
|
||||
<input type="date" name="tgl_gabung" class="form-control" value="{{ old('tgl_gabung') }}" required>
|
||||
</div>
|
||||
|
||||
<div class="mb-0">
|
||||
<label class="form-label fw-bold small">Catatan Medis (Opsional)</label>
|
||||
<textarea name="catatan_medis" class="form-control" rows="2" placeholder="Riwayat cedera atau penyakit...">{{ old('catatan_medis') }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="auth-footer">
|
||||
<button type="submit" class="btn btn-auth mb-3 shadow-sm">DAFTAR SEKARANG</button>
|
||||
<div class="text-center">
|
||||
<p class="small mb-0">Sudah punya akun? <a href="/login" class="text-primary fw-bold text-decoration-none">Masuk di sini</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Popup jika ada error validasi dari Laravel
|
||||
@if($errors->any())
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Ups...',
|
||||
html: '{!! implode("<br>", $errors->all()) !!}',
|
||||
confirmButtonColor: '#06163a'
|
||||
});
|
||||
@endif
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
<?php
|
||||
|
||||
use App\Http\Controllers\AnggotaController;
|
||||
use App\Http\Controllers\AuthController;
|
||||
use App\Http\Controllers\DashboardController;
|
||||
use App\Http\Controllers\JadwalController;
|
||||
use App\Http\Controllers\KolatController;
|
||||
use App\Http\Controllers\PelatihController;
|
||||
|
|
@ -35,6 +37,22 @@
|
|||
return view('anggota.anggota');
|
||||
});
|
||||
|
||||
Route::middleware('guest')->group(function () {
|
||||
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
|
||||
Route::post('/login', [AuthController::class, 'login']); // Sesuaikan nama method
|
||||
|
||||
Route::get('/register', [AuthController::class, 'showRegister'])->name('register');
|
||||
Route::post('/register', [AuthController::class, 'register']); // Sesuaikan nama method
|
||||
});
|
||||
|
||||
// Route untuk user yang SUDAH login
|
||||
Route::middleware('auth')->group(function () {
|
||||
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
|
||||
|
||||
// Route dashboard atau menu lainnya masukkan di sini
|
||||
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
|
||||
});
|
||||
|
||||
//anggota
|
||||
Route::get('/anggota', [AnggotaController::class, 'anggota'])->name('anggota.anggota');
|
||||
Route::get('/anggota/tambah', [AnggotaController::class, 'create'])->name('anggota.create');
|
||||
|
|
|
|||
Loading…
Reference in New Issue