[add] Feature Import Export Train Data

This commit is contained in:
Zhaqian Rouf Alfauzi 2025-02-09 00:43:45 +07:00
parent 5aa5f680ab
commit 72ea9ab707
18 changed files with 613 additions and 410 deletions

View File

@ -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'
];
}
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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.');
}
/**

View File

@ -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']
]
);
}
}

View File

@ -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']);
}
}

24
app/Models/TrainData.php Normal file
View File

@ -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',
];
}

View File

@ -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');
}
};

View File

@ -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');
}
};

View File

@ -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",

View File

@ -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",

View File

@ -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

View File

@ -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

View File

@ -1,102 +1,137 @@
@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>
</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>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11.0.19/dist/sweetalert2.min.js"></script>
<script>
$(document).ready(function () {
$('#dataTable').DataTable({
responsive: true,
scrollX: true,
autoWidth: false,
"language": {
"search": "Cari:",
"lengthMenu": "Tampilkan _MENU_ data",
"info": "Menampilkan _START_ sampai _END_ dari _TOTAL_ data",
"infoEmpty": "Tidak ada data tersedia",
"infoFiltered": "(disaring dari _MAX_ total data)"
}
});
});
</script>
<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!",
text: "Data hanya akan dihapus dari halaman ini, tidak dari database utama!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
@ -104,62 +139,73 @@
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();
$.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'
);
}
})
});
</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">
<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>
$(document).ready(function () {
$('#dataTable').DataTable({
responsive: true, // Aktifkan fitur responsif
"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)"
}
});
});
</script>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
$(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

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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');
});