[add] Feature Import Export Train Data
This commit is contained in:
parent
5aa5f680ab
commit
72ea9ab707
|
@ -0,0 +1,46 @@
|
|||
<?php
|
||||
|
||||
namespace App\Exports;
|
||||
|
||||
use App\Models\Riwayat;
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
|
||||
namespace App\Exports;
|
||||
|
||||
use App\Models\TrainData;
|
||||
use Maatwebsite\Excel\Concerns\FromCollection;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadings;
|
||||
|
||||
class SantrisExport implements FromCollection, WithHeadings
|
||||
{
|
||||
public function collection()
|
||||
{
|
||||
return TrainData::all()->map(function ($trainData) {
|
||||
return [
|
||||
'Nama' => $trainData->nama,
|
||||
'Jenis Kelamin' => $trainData->jenis_kelamin,
|
||||
'NIS' => $trainData->nis,
|
||||
'Asal Daerah' => $trainData->asal_daerah,
|
||||
'Tahun Angkatan' => $trainData->tahun_angkatan,
|
||||
'Capaian Al Qur\'an' => $trainData->alquran,
|
||||
'Capaian Hadis' => $trainData->alhadis,
|
||||
'Status' => $trainData->status,
|
||||
];
|
||||
});
|
||||
}
|
||||
|
||||
public function headings(): array
|
||||
{
|
||||
return [
|
||||
'Nama',
|
||||
'Jenis Kelamin',
|
||||
'NIS',
|
||||
'Asal Daerah',
|
||||
'Tahun Angkatan',
|
||||
'Capaian Al Qur\'an',
|
||||
'Capaian Hadis',
|
||||
'Target'
|
||||
];
|
||||
}
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ClassifiactionController extends Controller
|
||||
{
|
||||
/**
|
||||
* Menampilkan data ujian (examData)
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function examData()
|
||||
{
|
||||
// Tambahkan logika untuk mengambil data ujian dari database jika diperlukan
|
||||
// Contoh: $data = Exam::all();
|
||||
|
||||
// Return view dengan data yang diperlukan
|
||||
return view('pages.admin.exam-data'); // Pastikan view ini telah dibuat
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan data pelatihan (trainData)
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function trainData()
|
||||
{
|
||||
// Tambahkan logika untuk mengambil data pelatihan
|
||||
// Contoh: $data = Train::all();
|
||||
|
||||
return view('pages.admin.train-data'); // Pastikan view ini telah dibuat
|
||||
}
|
||||
|
||||
/**
|
||||
* Menampilkan hasil klasifikasi (classificationResult)
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function classificationResult()
|
||||
{
|
||||
// Tambahkan logika untuk mengolah dan menampilkan hasil klasifikasi
|
||||
// Misalnya, menjalankan algoritma atau mengambil data dari model
|
||||
|
||||
return view('pages.admin.class-result'); // Pastikan view ini telah dibuat
|
||||
}
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Imports\SantrisImport;
|
||||
use App\Exports\SantrisExport;
|
||||
use App\Models\Riwayat;
|
||||
use App\Models\TrainData;
|
||||
use Maatwebsite\Excel\Facades\Excel;
|
||||
|
||||
class ClassificationController extends Controller
|
||||
{
|
||||
|
||||
public function showTrainData()
|
||||
{
|
||||
// Jika train_data kosong, otomatis ambil dari riwayat
|
||||
if (TrainData::count() == 0) {
|
||||
$this->resetTrainData();
|
||||
}
|
||||
|
||||
$santris = TrainData::orderBy('created_at', 'desc')->get();
|
||||
return view('pages.admin.train-data', compact('santris'));
|
||||
}
|
||||
|
||||
public function importExcel(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'file' => 'required|file|mimes:xlsx,csv'
|
||||
]);
|
||||
|
||||
Excel::import(new SantrisImport, $request->file('file'));
|
||||
|
||||
return back()->with('success', 'Data latih berhasil diimpor!');
|
||||
}
|
||||
|
||||
public function exportExcel()
|
||||
{
|
||||
return Excel::download(new SantrisExport, 'data-latih.xlsx');
|
||||
}
|
||||
|
||||
public function deleteTrainData($id)
|
||||
{
|
||||
TrainData::findOrFail($id)->delete();
|
||||
return response()->json(['success' => 'Data berhasil dihapus dari tampilan halaman ini.']);
|
||||
}
|
||||
|
||||
public function resetTrainData()
|
||||
{
|
||||
// Hapus semua data train_data
|
||||
TrainData::truncate();
|
||||
|
||||
// Ambil data dari riwayats dan simpan ke train_data
|
||||
$riwayats = Riwayat::with('user')->get();
|
||||
|
||||
foreach ($riwayats as $riwayat) {
|
||||
TrainData::create([
|
||||
'nama' => $riwayat->user->name ?? '—',
|
||||
'jenis_kelamin' => $riwayat->user->jenis_kelamin ?? '—',
|
||||
'nis' => $riwayat->user->nis ?? '—',
|
||||
'asal_daerah' => $riwayat->user->asal_daerah ?? '—',
|
||||
'tahun_angkatan' => $riwayat->tahun_angkatan,
|
||||
'alquran' => $riwayat->alquran,
|
||||
'alhadis' => $riwayat->alhadis,
|
||||
'status' => $riwayat->status,
|
||||
]);
|
||||
}
|
||||
|
||||
return back()->with('success', 'Data latih direset!');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Menampilkan hasil klasifikasi (classificationResult)
|
||||
*
|
||||
* @return \Illuminate\View\View
|
||||
*/
|
||||
public function classificationResult()
|
||||
{
|
||||
// Tambahkan logika untuk mengolah dan menampilkan hasil klasifikasi
|
||||
// Misalnya, menjalankan algoritma atau mengambil data dari model
|
||||
|
||||
return view('pages.admin.class-result'); // Pastikan view ini telah dibuat
|
||||
}
|
||||
}
|
|
@ -12,7 +12,7 @@ public function destroy($id)
|
|||
{
|
||||
$riwayat = Riwayat::findOrFail($id);
|
||||
$riwayat->delete();
|
||||
return redirect()->back()->with('success', 'Data riwayat berhasil dihapus.');
|
||||
return redirect()->back()->with('success', 'Data Munaqosah berhasil dihapus.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
namespace App\Imports;
|
||||
|
||||
use App\Models\TrainData;
|
||||
use Maatwebsite\Excel\Concerns\ToModel;
|
||||
use Maatwebsite\Excel\Concerns\WithHeadingRow;
|
||||
|
||||
class SantrisImport implements ToModel, WithHeadingRow
|
||||
{
|
||||
public function model(array $row)
|
||||
{
|
||||
return TrainData::updateOrCreate(
|
||||
['nis' => $row['nis']], // Jika NIS sudah ada, perbarui data
|
||||
[
|
||||
'nama' => $row['nama'],
|
||||
'jenis_kelamin' => $row['jenis_kelamin'],
|
||||
'asal_daerah' => $row['asal_daerah'],
|
||||
'tahun_angkatan' => $row['tahun_angkatan'],
|
||||
'alquran' => $row['capaian_al_quran'],
|
||||
'alhadis' => $row['capaian_hadis'],
|
||||
'status' => $row['status']
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
|
@ -22,12 +22,9 @@ class Riwayat extends Model
|
|||
'admin_id',
|
||||
'munaqosah_status',
|
||||
];
|
||||
|
||||
/**
|
||||
* Relasi ke model User (jika diperlukan)
|
||||
*/
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(User::class, 'user_id');
|
||||
return $this->belongsTo(User::class, 'user_id')
|
||||
->select(['id', 'name', 'jenis_kelamin', 'nis', 'asal_daerah']);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class TrainData extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $table = 'train_data';
|
||||
|
||||
protected $fillable = [
|
||||
'nama',
|
||||
'jenis_kelamin',
|
||||
'nis',
|
||||
'asal_daerah',
|
||||
'tahun_angkatan',
|
||||
'alquran',
|
||||
'alhadis',
|
||||
'status',
|
||||
];
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
<?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('santris', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('santris');
|
||||
}
|
||||
};
|
|
@ -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 {
|
||||
public function up()
|
||||
{
|
||||
Schema::create('train_data', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('nama');
|
||||
$table->string('jenis_kelamin');
|
||||
$table->string('nis')->unique();
|
||||
$table->string('asal_daerah');
|
||||
$table->string('tahun_angkatan');
|
||||
$table->string('alquran')->nullable();
|
||||
$table->string('alhadis')->nullable();
|
||||
$table->string('status')->nullable();
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('train_data');
|
||||
}
|
||||
};
|
|
@ -28,6 +28,7 @@
|
|||
</div>
|
||||
@endif
|
||||
{{-- Tabel Admin --}}
|
||||
<div class="table-responsive">
|
||||
<table id="addAdminTable" class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -42,10 +43,12 @@
|
|||
<td>{{ $index+1 }}</td>
|
||||
<td>{{ $admin->email }}</td>
|
||||
<td>
|
||||
<form action="{{ route('admin.delete', $admin->id) }}" method="POST" id="deleteForm{{ $admin->id }}">
|
||||
<form action="{{ route('admin.delete', $admin->id) }}" method="POST"
|
||||
id="deleteForm{{ $admin->id }}">
|
||||
@csrf
|
||||
@method('DELETE')
|
||||
<button class="btn btn-danger btn-sm" type="button" onclick="confirmDelete({{ $admin->id }})">
|
||||
<button class="btn btn-danger btn-sm" type="button"
|
||||
onclick="confirmDelete({{ $admin->id }})">
|
||||
<i class='bx bx-trash'></i>
|
||||
</button>
|
||||
</form>
|
||||
|
@ -72,17 +75,23 @@ function confirmDelete(adminId) {
|
|||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- DataTables CSS & JS (bisa diletakkan di layout umum juga) -->
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css">
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
|
||||
<!-- SweetAlert2 CSS & JS -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js"></script>
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js">
|
||||
</script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#addAdminTable').DataTable({
|
||||
responsive: true,
|
||||
scrollX: true,
|
||||
autoWidth: false,
|
||||
"language": {
|
||||
"search": "Cari:",
|
||||
"lengthMenu": "Tampilkan _MENU_ data",
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
@endif
|
||||
|
||||
{{-- Tabel Data Santri --}}
|
||||
<div class="table-responsive">
|
||||
<table id="addSantriTable" class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
|
@ -61,11 +62,14 @@
|
|||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- DataTables CSS & JS -->
|
||||
<!-- SweetAlert2 CSS & JS -->
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js"></script>
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js">
|
||||
</script>
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css">
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
|
@ -73,6 +77,9 @@
|
|||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#addSantriTable').DataTable({
|
||||
responsive: true,
|
||||
scrollX: true,
|
||||
autoWidth: false,
|
||||
"language": {
|
||||
"search": "Cari:",
|
||||
"lengthMenu": "Tampilkan _MENU_ data",
|
||||
|
|
|
@ -32,8 +32,9 @@
|
|||
<table id="dataTable" class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nama Santri</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Nama Santri</th>
|
||||
<th>NIS</th>
|
||||
<th>Tahun Angkatan</th>
|
||||
<th>Al-Qur'an Isi</th>
|
||||
<th>Al-Hadis Isi</th>
|
||||
|
@ -45,8 +46,9 @@
|
|||
<tbody>
|
||||
@foreach($riwayat as $item)
|
||||
<tr>
|
||||
<td>{{ $item->user->name ?? '—' }}</td>
|
||||
<td>{{ $item->created_at->format('Y-m-d') }}</td>
|
||||
<td>{{ $item->user->name ?? '—' }}</td>
|
||||
<td>{{ $item->user->nis ?? '—' }}</td>
|
||||
<td>{{ $item->tahun_angkatan }}</td>
|
||||
<td>{{ $item->alquran }}</td>
|
||||
<td>{{ $item->alhadis }}</td>
|
||||
|
@ -57,7 +59,8 @@
|
|||
<!-- Jika belum ada keputusan, tampilkan tombol Verifikasi, Tolak, dan Delete -->
|
||||
|
||||
<!-- Tombol Verifikasi -->
|
||||
<form action="{{ route('munaqosah.verify', $item->id) }}" method="POST" style="display:inline;">
|
||||
<form action="{{ route('munaqosah.verify', $item->id) }}" method="POST"
|
||||
style="display:inline;">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-success btn-sm">
|
||||
<i class='bx bxs-check-circle'></i> Verifikasi
|
||||
|
@ -65,7 +68,8 @@
|
|||
</form>
|
||||
|
||||
<!-- Tombol Tolak -->
|
||||
<form action="{{ route('munaqosah.reject', $item->id) }}" method="POST" style="display:inline;">
|
||||
<form action="{{ route('munaqosah.reject', $item->id) }}" method="POST"
|
||||
style="display:inline;">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-warning btn-sm">
|
||||
<i class='bx bxs-x-circle'></i> Tolak
|
||||
|
|
|
@ -1,70 +0,0 @@
|
|||
@extends('layouts.app-admin')
|
||||
@section('content')
|
||||
<main id="main" class="main">
|
||||
<div class="row">
|
||||
<div class="pagetitle">
|
||||
<h1>Data Latih</h1>
|
||||
<nav>
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="#">Admin</a></li>
|
||||
<li class="breadcrumb-item active">Data Latih</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
<!-- Import & Export Buttons -->
|
||||
<div class="col-lg-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Tindakan</h5>
|
||||
<form action="{{ route('data-latih.import') }}" method="POST" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<input type="file" name="file" required>
|
||||
<button type="submit" class="btn btn-primary">Import Excel</button>
|
||||
</form>
|
||||
<a href="{{ route('data-latih.export') }}" class="btn btn-success">Export Excel</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Data Table -->
|
||||
<div class="col-lg-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Data Latih</h5>
|
||||
<table id="dataTable" class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nama</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>NIS</th>
|
||||
<th>Asal Daerah</th>
|
||||
<th>Tahun Angkatan</th>
|
||||
<th>Capaian Hadis</th>
|
||||
<th>Capaian Al Qur'an</th>
|
||||
<th>Status</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($data as $santri)
|
||||
<tr>
|
||||
<td>{{ $santri->nama }}</td>
|
||||
<td>{{ $santri->jenis_kelamin }}</td>
|
||||
<td>{{ $santri->nis }}</td>
|
||||
<td>{{ $santri->asal_daerah }}</td>
|
||||
<td>{{ $santri->tahun_angkatan }}</td>
|
||||
<td>{{ $santri->capaian_hadis }}</td>
|
||||
<td>{{ $santri->capaian_quran }}</td>
|
||||
<td>{{ $santri->status }}</td>
|
||||
<td>
|
||||
<!-- Aksi buttons -->
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
@endsection
|
|
@ -1,152 +1,121 @@
|
|||
@extends('layouts.app-admin')
|
||||
<title>Data Munaqosah | SR Klasifikasi</title>
|
||||
<title>Data Latih | SR Klasifikasi</title>
|
||||
|
||||
@section('content')
|
||||
<main id="main" class="main">
|
||||
<div class="row">
|
||||
<div class="pagetitle">
|
||||
<h1>Munaqosah</h1>
|
||||
<div class="pagetitle d-flex justify-content-between align-items-center">
|
||||
<h1>Data Latih</h1>
|
||||
</div>
|
||||
<nav>
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="#">Admin</a></li>
|
||||
<li class="breadcrumb-item active">Munaqosah Santri</li>
|
||||
<li class="breadcrumb-item active">Data Latih</li>
|
||||
</ol>
|
||||
</nav>
|
||||
|
||||
<div class="col-lg-12">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Tindakan</h5>
|
||||
<div class="d-flex gap-2 align-items-center">
|
||||
<form action="{{ route('trainData.import') }}" method="POST" enctype="multipart/form-data"
|
||||
class="d-flex gap-2 flex-grow-1">
|
||||
@csrf
|
||||
<div class="input-group">
|
||||
<input type="file" name="file" class="form-control" required>
|
||||
<button type="submit" class="btn btn-primary d-flex gap-1">
|
||||
<i class="bx bxs-file-import"></i> Import
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<a href="{{ route('trainData.export') }}" class="btn btn-success d-flex gap-1"
|
||||
style="margin-block-end: 1em">
|
||||
<i class="bx bxs-file-export"></i> Export
|
||||
</a>
|
||||
<form action="{{ route('trainData.reset') }}" method="POST" class="d-inline reset-form">
|
||||
@csrf
|
||||
<button type="button" class="btn btn-warning d-flex gap-1 btn-reset">
|
||||
<i class="bx bx-reset"></i> Reset Data
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-12 dashboard">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Munaqosah Santri</h5>
|
||||
<h5 class="card-title">Data Latih</h5>
|
||||
|
||||
<!-- Tabel Riwayat -->
|
||||
<div class="table-responsive">
|
||||
<table id="dataTable" class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nama Santri</th>
|
||||
<th>Tanggal</th>
|
||||
<th>Nama</th>
|
||||
<th>Jenis Kelamin</th>
|
||||
<th>NIS</th>
|
||||
<th>Asal Daerah</th>
|
||||
<th>Tahun Angkatan</th>
|
||||
<th>Al-Qur'an Isi</th>
|
||||
<th>Al-Hadis Isi</th>
|
||||
<th>Nilai N</th>
|
||||
<th>Status</th>
|
||||
<th>Capaian Hadis</th>
|
||||
<th>Capaian Al Qur'an</th>
|
||||
<th>Target</th>
|
||||
<th>Aksi</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($riwayat as $item)
|
||||
@foreach ($santris as $item)
|
||||
<tr>
|
||||
<td>{{ $item->user->name ?? '—' }}</td>
|
||||
<td>{{ $item->created_at->format('Y-m-d') }}</td>
|
||||
<td>{{ $item->nama ?? '—' }}</td>
|
||||
<td>{{ $item->jenis_kelamin ?? '—' }}</td>
|
||||
<td>{{ $item->nis ?? '—' }}</td>
|
||||
<td>{{ $item->asal_daerah ?? '—' }}</td>
|
||||
<td>{{ $item->tahun_angkatan }}</td>
|
||||
<td>{{ $item->alquran }}</td>
|
||||
<td>{{ $item->alhadis }}</td>
|
||||
<td>{{ number_format($item->nilai_n, 2) }}</td>
|
||||
<td>
|
||||
{{ $item->alhadis >= 1997 ? 'Khatam' : 'Belum Khatam' }}
|
||||
</td>
|
||||
<td>
|
||||
{{ $item->alquran >= 606 ? 'Khatam' : 'Belum Khatam' }}
|
||||
</td>
|
||||
<td>{{ $item->status }}</td>
|
||||
<td>
|
||||
@if($item->munaqosah_status === 'Sedang di Verifikasi')
|
||||
<!-- Jika belum ada keputusan, tampilkan tombol Verifikasi, Tolak, dan Delete -->
|
||||
|
||||
<!-- Tombol Verifikasi -->
|
||||
<form action="{{ route('munaqosah.verify', $item->id) }}" method="POST"
|
||||
style="display:inline;">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-success btn-sm">
|
||||
<i class='bx bxs-check-circle'></i> Verifikasi
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- Tombol Tolak -->
|
||||
<form action="{{ route('munaqosah.reject', $item->id) }}" method="POST"
|
||||
style="display:inline;">
|
||||
@csrf
|
||||
<button type="submit" class="btn btn-warning btn-sm">
|
||||
<i class='bx bxs-x-circle'></i> Tolak
|
||||
</button>
|
||||
</form>
|
||||
|
||||
<!-- Tombol Delete dengan SweetAlert -->
|
||||
<button class="btn btn-danger btn-sm btn-delete" data-id="{{ $item->id }}">
|
||||
<button class="btn btn-danger btn-sm btn-delete"
|
||||
data-id="{{ $item->id }}">
|
||||
<i class='bx bxs-trash'></i> Delete
|
||||
</button>
|
||||
@else
|
||||
<!-- Jika sudah ada keputusan (verified atau ditolak), tampilkan badge "Selesai" -->
|
||||
<span class="badge bg-info">Selesai</span>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- Sertakan SweetAlert2 -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).on('click', '.btn-delete', function(e){
|
||||
e.preventDefault();
|
||||
var id = $(this).data('id');
|
||||
Swal.fire({
|
||||
title: 'Apakah Anda yakin?',
|
||||
text: "Data akan dihapus permanen!",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Ya, hapus!'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
// Buat form secara dinamis untuk melakukan request DELETE
|
||||
var form = $('<form>', {
|
||||
'method': 'POST',
|
||||
'action': '/admin/munaqosah/' + id
|
||||
});
|
||||
var token = '{{ csrf_token() }}';
|
||||
var hiddenInput = $('<input>', {
|
||||
'name': '_token',
|
||||
'value': token,
|
||||
'type': 'hidden'
|
||||
});
|
||||
var hiddenMethod = $('<input>', {
|
||||
'name': '_method',
|
||||
'value': 'DELETE',
|
||||
'type': 'hidden'
|
||||
});
|
||||
form.append(hiddenInput, hiddenMethod).appendTo('body').submit();
|
||||
}
|
||||
})
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- DataTables CSS & JS -->
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css">
|
||||
<!-- Tambahkan CSS Responsive -->
|
||||
<link rel="stylesheet"
|
||||
href="https://cdn.datatables.net/responsive/2.4.1/css/responsive.dataTables.min.css">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- DataTables & SweetAlert -->
|
||||
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.css">
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
|
||||
<!-- Tambahkan JS Responsive -->
|
||||
<script src="https://cdn.datatables.net/responsive/2.4.1/js/dataTables.responsive.min.js">
|
||||
</script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js"></script>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('#dataTable').DataTable({
|
||||
responsive: true, // Aktifkan fitur responsif
|
||||
responsive: true,
|
||||
scrollX: true,
|
||||
autoWidth: false,
|
||||
"language": {
|
||||
"search": "Cari:",
|
||||
"lengthMenu": "Tampilkan _MENU_ data",
|
||||
"zeroRecords": "Tidak ada data yang cocok",
|
||||
"info": "Menampilkan _START_ sampai _END_ dari _TOTAL_ data",
|
||||
"infoEmpty": "Tidak ada data tersedia",
|
||||
"infoFiltered": "(disaring dari _MAX_ total data)"
|
||||
|
@ -155,11 +124,88 @@
|
|||
});
|
||||
</script>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<script>
|
||||
$(document).on('click', '.btn-delete', function(e){
|
||||
e.preventDefault();
|
||||
var id = $(this).data('id');
|
||||
|
||||
Swal.fire({
|
||||
title: 'Apakah Anda yakin?',
|
||||
text: "Data hanya akan dihapus dari halaman ini, tidak dari database utama!",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Ya, hapus!'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
$.ajax({
|
||||
url: "/admin/trainData/" + id,
|
||||
type: "DELETE",
|
||||
data: {
|
||||
_token: "{{ csrf_token() }}"
|
||||
},
|
||||
success: function(response) {
|
||||
Swal.fire(
|
||||
'Terhapus!',
|
||||
'Data berhasil dihapus dari tampilan halaman ini.',
|
||||
'success'
|
||||
);
|
||||
location.reload(); // Refresh tabel setelah dihapus
|
||||
},
|
||||
error: function(response) {
|
||||
Swal.fire(
|
||||
'Gagal!',
|
||||
'Terjadi kesalahan saat menghapus data.',
|
||||
'error'
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on('click', '.btn-reset', function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
Swal.fire({
|
||||
title: 'Apakah Anda yakin?',
|
||||
text: "Data latih akan diambil ulang dari data riwayat!",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonColor: '#3085d6',
|
||||
cancelButtonColor: '#d33',
|
||||
confirmButtonText: 'Ya, reset!'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
var resetUrl = $(".reset-form").attr("action"); // Ambil URL dari form reset
|
||||
|
||||
$.ajax({
|
||||
url: resetUrl,
|
||||
type: "POST",
|
||||
data: {
|
||||
_token: "{{ csrf_token() }}"
|
||||
},
|
||||
success: function(response) {
|
||||
Swal.fire(
|
||||
'Reset Berhasil!',
|
||||
'Data latih telah diambil ulang dari data riwayat.',
|
||||
'success'
|
||||
).then(() => {
|
||||
location.reload(); // Refresh tabel setelah reset
|
||||
});
|
||||
},
|
||||
error: function(response) {
|
||||
Swal.fire(
|
||||
'Gagal!',
|
||||
'Terjadi kesalahan saat mereset data.',
|
||||
'error'
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
@endsection
|
|
@ -83,7 +83,8 @@
|
|||
</form>
|
||||
|
||||
<!-- Tombol Kirim hanya muncul di data terakhir -->
|
||||
@if($loop->first)
|
||||
@if($loop->first && ($item->munaqosah_status === null ||
|
||||
$item->munaqosah_status === 'Belum Diverifikasi'))
|
||||
<button type="button" class="btn btn-primary btn-sm btn-send"
|
||||
data-id="{{ $item->id }}">
|
||||
<i class='bx bxs-send'></i> Kirim
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
@endphp
|
||||
|
||||
<header id="header" class="header fixed-top d-flex align-items-center">
|
||||
|
||||
<div class="d-flex align-items-center justify-content-between">
|
||||
<a href="#" class="logo d-flex align-items-center">
|
||||
<img src="{{ asset('img/logo.png') }}" alt="">
|
||||
|
@ -19,8 +18,33 @@
|
|||
|
||||
<nav class="header-nav ms-auto">
|
||||
<ul class="d-flex align-items-center">
|
||||
<li class="nav-item dropdown pe-3">
|
||||
<li class="nav-item dropdown pe-3 d-flex align-items-center">
|
||||
|
||||
<!-- Ikon Info -->
|
||||
<i class="bi bi-info-circle mx-2 text-primary info-icon" style="font-size: 24px; cursor: pointer;"></i>
|
||||
|
||||
<!-- Card Info (Hidden by default) -->
|
||||
<div class="info-card">
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
<h6 class="card-title text-center">📜 Info Target</h6>
|
||||
<table class="table table-bordered text-center mb-0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><i class="bi bi-book text-success"></i> <b>Quran</b></td>
|
||||
<td>606 Halaman</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><i class="bi bi-book-half text-warning"></i> <b>Hadis</b></td>
|
||||
<td>1997 Halaman</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Profile Icon -->
|
||||
<a class="nav-link nav-profile d-flex align-items-center pe-0" href="#" data-bs-toggle="dropdown">
|
||||
<i class='bx bxs-user-circle' style="font-size: 40px; color: #0d6efd;"></i>
|
||||
<span class="d-none d-md-block dropdown-toggle ps-2"></span>
|
||||
|
@ -28,7 +52,6 @@
|
|||
|
||||
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-arrow profile">
|
||||
<li class="dropdown-header">
|
||||
<!-- Tampilkan role & email user yang sedang login -->
|
||||
<h6>{{ $user ? ucfirst($user->role) : 'Guest' }}</h6>
|
||||
<span>{{ $user ? $user->email : 'No Email' }}</span>
|
||||
</li>
|
||||
|
@ -53,10 +76,49 @@
|
|||
<span>Sign Out</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
</ul><!-- End Profile Dropdown Items -->
|
||||
</li><!-- End Profile Nav -->
|
||||
</ul>
|
||||
</nav><!-- End Icons Navigation -->
|
||||
|
||||
</header><!-- End Header -->
|
||||
|
||||
<!-- CSS Styling -->
|
||||
<style>
|
||||
.info-card {
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
right: 70px;
|
||||
display: none;
|
||||
z-index: 999;
|
||||
width: 220px;
|
||||
}
|
||||
|
||||
.info-card .card {
|
||||
border-radius: 10px;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- JavaScript -->
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
const infoIcon = document.querySelector(".info-icon");
|
||||
const infoCard = document.querySelector(".info-card");
|
||||
|
||||
infoIcon.addEventListener("click", function() {
|
||||
if (infoCard.style.display === "none" || infoCard.style.display === "") {
|
||||
infoCard.style.display = "block";
|
||||
} else {
|
||||
infoCard.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Klik di luar card untuk menutup
|
||||
document.addEventListener("click", function(event) {
|
||||
if (!infoIcon.contains(event.target) && !infoCard.contains(event.target)) {
|
||||
infoCard.style.display = "none";
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
|
@ -38,14 +38,15 @@
|
|||
<li class="nav-heading">Klasifikasi</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ Route::is('examData') ? '' : 'collapsed' }}" href="{{ route('examData') }}">
|
||||
<a class="nav-link {{ Route::is('trainData.show') ? '' : 'collapsed' }}"
|
||||
href="{{ route('trainData.show') }}">
|
||||
<i class='bx bx-data'></i>
|
||||
<span>Data Latih</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {{ Route::is('trainData') ? '' : 'collapsed' }}" href="{{ route('trainData') }}">
|
||||
<a class="nav-link {{ Route::is('examData') ? '' : 'collapsed' }}" href="{{ route('examData') }}">
|
||||
<i class='bx bx-test-tube'></i>
|
||||
<span>Data Uji</span>
|
||||
</a>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
use App\Http\Controllers\SantriController;
|
||||
use App\Http\Controllers\HitungController;
|
||||
use App\Http\Controllers\MunaqosahController;
|
||||
use App\Http\Controllers\ClassifiactionController;
|
||||
use App\Http\Controllers\ClassificationController;
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Web Routes
|
||||
|
@ -67,10 +67,21 @@
|
|||
->name('munaqosah.reject');
|
||||
Route::delete('/admin/munaqosah/{id}', [MunaqosahController::class, 'destroy'])
|
||||
->name('munaqosah.destroy');
|
||||
Route::get('/admin/examData', [ClassifiactionController::class, 'examData'])
|
||||
Route::post('/admin/trainData/import', [ClassificationController::class, 'importExcel'])->name('trainData.import');
|
||||
Route::get(
|
||||
'/admin/trainData/export',
|
||||
[ClassificationController::class, 'exportExcel']
|
||||
)->name('trainData.export');
|
||||
Route::get(
|
||||
'/admin/trainData',
|
||||
[ClassificationController::class, 'showTrainData']
|
||||
)->name('trainData.show');
|
||||
Route::get('/admin/examData', [ClassificationController::class, 'examData'])
|
||||
->name('examData');
|
||||
Route::get('/admin/trainData', [ClassifiactionController::class, 'trainData'])
|
||||
->name('trainData');
|
||||
Route::get('/admin/classificationResult', [ClassifiactionController::class, 'classificationResult'])
|
||||
Route::get('/admin/classificationResult', [ClassificationController::class, 'classificationResult'])
|
||||
->name('classificationResult');
|
||||
Route::delete('/admin/trainData/{id}', [ClassificationController::class, 'deleteTrainData'])
|
||||
->name('trainData.delete');
|
||||
Route::post('/admin/trainData/reset', [ClassificationController::class, 'resetTrainData'])
|
||||
->name('trainData.reset');
|
||||
});
|
||||
|
|
Loading…
Reference in New Issue