This commit is contained in:
gitaysn 2025-05-26 05:40:15 +07:00
parent bba0721da7
commit 6fd286d3af
10 changed files with 552 additions and 234 deletions

View File

@ -36,7 +36,7 @@ class KriteriaController extends Controller
$request->validate([
'kode_kriteria' => 'required',
'nama_kriteria' => 'required',
'bobot' => 'required',
'bobot' => ['required', 'regex:/^\d+\.\d+$/'],
'jenis' => 'required',
]);

View File

@ -15,23 +15,19 @@ class PakaianController extends Controller
{
$kriteria = Kriteria::all();
// Ambil relasi pakaian dan subkriteria dengan kriteria-nya
$query = Pakaian::with(['subKriterias.kriteria']);
// Filter search nama pakaian
if ($request->filled('search')) {
$query->where('nama_pakaian', 'like', '%' . $request->search . '%');
}
$perPage = $request->input('entries', 10);
$alternatif = $query->paginate($perPage)->appends($request->query());
$search = $request->input('search');
$alternatif = Pakaian::with(['subKriterias.kriteria'])
->when($search, function ($query, $search) {
$query->where('nama_pakaian', 'like', '%' . $search . '%');
})
->paginate($perPage)
->appends($request->query());
return view('admin.pages.pakaian.index', compact('kriteria', 'alternatif'));
}
/**
* Show the form for creating a new resource.
*/
@ -124,6 +120,19 @@ class PakaianController extends Controller
*/
public function destroy(string $id)
{
//
$pakaian = Pakaian::findOrFail($id);
// Hapus gambar dari storage jika ada
if ($pakaian->img && file_exists(public_path($pakaian->img))) {
unlink(public_path($pakaian->img));
}
// Hapus relasi subkriteria (pivot table)
$pakaian->subKriterias()->detach();
// Hapus data pakaian dari database
$pakaian->delete();
return redirect()->route('admin.pakaian.index')->with('success', 'Data pakaian berhasil dihapus.');
}
}

View File

@ -0,0 +1,129 @@
<?php
namespace App\Http\Controllers;
use App\Models\Pakaian;
use App\Models\Kriteria;
use Illuminate\Http\Request;
class PenilaianController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$query = Pakaian::with('subKriterias.kriteria');
// Filter berdasarkan nama_pakaian jika ada pencarian
if ($request->has('search') && $request->search != '') {
$query->where('nama_pakaian', 'like', '%' . $request->search . '%');
}
// Ambil jumlah per halaman dari parameter 'perPage' atau default ke 10
$perPage = $request->get('perPage', 10);
// Ambil data pakaian dengan pagination
$pakaians = $query->paginate($perPage);
// Ambil semua data kriteria
$kriterias = Kriteria::all();
// Return ke view dengan data yang dibutuhkan
return view('admin.pages.penilaian.index', compact('pakaians', 'kriterias'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
// Ambil data pakaian dengan relasi subKriterias beserta kriteria-nya
$pakaian = Pakaian::with('subKriterias.kriteria')->findOrFail($id);
// Ambil semua kriteria, supaya bisa ditampilkan di form edit untuk memilih/mengubah subkriteria
$kriterias = Kriteria::with('subKriteria')->get();
// Kirim data ke view edit
return view('admin.pages.penilaian.edit', compact('pakaian', 'kriterias'));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id)
{
$pakaian = Pakaian::findOrFail($id);
// Ambil list kriteria yang multiple select (jenis acara, lokasi, cuaca)
$multiSelectKriteria = Kriteria::whereIn('nama_kriteria', ['Jenis Acara', 'Lokasi', 'Cuaca'])->pluck('id')->toArray();
$rules = [];
$messages = [];
foreach ($request->input('nilai') as $kriteriaId => $value) {
if (in_array($kriteriaId, $multiSelectKriteria)) {
// Kriteria yang multiple select wajib berupa array dengan minimal 1 elemen
$rules["nilai.$kriteriaId"] = 'required|array|min:1';
$messages["nilai.$kriteriaId.required"] = 'Harap pilih minimal satu subkriteria untuk kriteria ' . Kriteria::find($kriteriaId)->nama_kriteria;
$messages["nilai.$kriteriaId.min"] = 'Harap pilih minimal satu subkriteria untuk kriteria ' . Kriteria::find($kriteriaId)->nama_kriteria;
} else {
// Kriteria yang single select wajib ada (string / integer)
$rules["nilai.$kriteriaId"] = 'required';
$messages["nilai.$kriteriaId.required"] = 'Harap pilih satu subkriteria untuk kriteria ' . Kriteria::find($kriteriaId)->nama_kriteria;
}
}
$validated = $request->validate($rules, $messages);
// Flatten semua subkriteria dari array nilai (baik single select maupun multi)
$subKriteriaIds = [];
foreach ($validated['nilai'] as $kriteriaId => $sub) {
if (is_array($sub)) {
$subKriteriaIds = array_merge($subKriteriaIds, $sub);
} else {
$subKriteriaIds[] = $sub;
}
}
$subKriteriaIds = array_unique($subKriteriaIds);
// Sync relasi many-to-many
$pakaian->subKriterias()->sync($subKriteriaIds);
return redirect()->route('admin.penilaian.index')->with('success', 'Penilaian berhasil diperbarui.');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@ -24,12 +24,28 @@
<style>
.sidebar {
position: relative;
}
.bg-gradient-green {
background-color: #43a047 !important;
/* hijau medium */
background-image: linear-gradient(180deg, #388e3c 10%, #4caf50 100%) !important;
background-size: cover;
}
/* Hilangkan jarak antar item sidebar */
#accordionSidebar .nav-item {
margin-bottom: 2px !important;
}
/* Kurangi padding di dalam link */
#accordionSidebar .nav-link {
padding-top: 8px !important;
padding-bottom: 8px !important;
}
</style>
</head>
@ -43,9 +59,8 @@
<ul class="navbar-nav bg-gradient-green sidebar sidebar-dark accordion" id="accordionSidebar">
<!-- Sidebar - Brand -->
<a class="sidebar-brand d-flex align-items-center logo-custom" href="index.html">
<div class="sidebar-brand-icon rotate-n-15">
</div>
<a class="sidebar-brand d-flex align-items-center logo-custom mt-3 mb-3" href="index.html">
<div class="sidebar-brand-icon rotate-n-15"></div>
<div class="sidebar-brand-text">SPK V-Person Assistant</div>
</a>
@ -56,7 +71,8 @@
<li class="nav-item {{ request()->is('dashboard') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('admin.dashboard') }}">
<i class="bi bi-house-door-fill"></i>
<span>Dashboard</span></a>
<span>Dashboard</span>
</a>
</li>
<!-- Divider -->
@ -87,7 +103,7 @@
</a>
<div id="collapseSubkriteria" class="collapse {{ request()->is('admin/kriteria/subkriteria/*') ? 'show' : '' }}">
<div class="bg-white ps-3 py-2 rounded-2">
<div class="bg-white ps-2 py-1 rounded-2">
@php
use App\Models\Kriteria;
$kriterias = Kriteria::with('subKriteria')->get();
@ -95,8 +111,8 @@
@foreach ($kriterias as $kriteria)
<a href="{{ route('admin.kriteria.subkriteria.index', ['nama_kriteria' => $kriteria->nama_kriteria]) }}"
class="d-block py-1 px-2 nav-link text-dark {{ request()->is('admin/kriteria/subkriteria/' . $kriteria->nama_kriteria) ? 'fw-semibold text-primary' : 'text-muted' }}"
style="font-size: 0.85rem;">
class="d-block nav-link {{ request()->is('admin/kriteria/subkriteria/' . $kriteria->nama_kriteria) ? 'fw-bold text-dark' : 'text-dark' }}"
style="font-size: 0.82rem; padding: 3px 6px; line-height: 1.2;">
<i class="bi bi-chevron-right small me-1"></i>{{ $kriteria->nama_kriteria }}
</a>
@endforeach
@ -136,17 +152,21 @@
<span>Data Pakaian</span></a>
</li>
<!-- Nav Item - Penilaian -->
<li class="nav-item {{ request()->is('admin/penilaian') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('admin.penilaian.index') }}">
<i class="bi bi-calculator"></i>
<span>Penilaian</span></a>
</li>
<!-- Nav Item - Hasil Akhir -->
<li class="nav-item {{ request()->is('admin/riwayat') ? 'active' : '' }}">
<a class="nav-link" href="#">
<i class="bi bi-hourglass-split"></i>
<span>Riwayat</span>
<span>Riwayat User</span>
</a>
</li>
<!-- Divider -->
<hr class="sidebar-divider">
@ -223,13 +243,6 @@
<!-- End of Main Content -->
<!-- Footer -->
<footer class="sticky-footer bg-white">
<div class="container my-auto">
<div class="copyright text-center my-auto">
<span>Copyright &copy; Your Website 2020</span>
</div>
</div>
</footer>
<!-- End of Footer -->
</div>

View File

@ -64,8 +64,6 @@
<!-- Content Row -->
<div class="row">
<div class="row">
<!-- Data Kriteria -->
<div class="col-xl-4 col-md-6 mb-4">
<a href="#">
@ -114,6 +112,22 @@
</a>
</div>
<!-- Card Area Chart -->
<div class="col-xl-12 mb-4">
<div class="card shadow h-100">
<div class="card-header d-flex align-items-center py-2">
<h6 class="m-0 font-weight-bold text-dark">Statistik Pengunjung</h6>
</div>
<div class="card-body">
<div class="chart-area">
<canvas id="myAreaChart"></canvas>
</div>
<hr>
</div>
</div>
</div>
{{-- <!-- Data Penilaian -->
<div class="col-xl-4 col-md-6 mb-4">
<a href="{{ route('admin.penilaian.index') }}" style="text-decoration: none;">

View File

@ -41,7 +41,7 @@
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center">{{ $item->kode_kriteria }}</td>
<td class="text-center">{{ $item->nama_kriteria }}</td>
<td class="text-center">{{ $item->bobot }}</td>
<td class="text-center">{{ number_format($item->bobot, 2) }}</td>
<td class="text-center">{{ $item->jenis }}</td>
<td class="text-center">
<div class="d-flex justify-content-center">

View File

@ -1,10 +1,56 @@
@extends('admin.layouts.base')
@section('title', 'Data Alternatif')
@section('title', 'Data Pakaian')
@section('content')
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<style>
.search-input {
width: 200px;
}
.btn-biru {
background-color: #007bff; /* biru Bootstrap */
color: white;
border: none;
padding: 6px 16px;
border-radius: 4px;
cursor: pointer;
}
.btn-biru:hover {
background-color: #0069d9;
}
.search-box {
display: flex;
gap: 8px;
align-items: center;
margin-bottom: 12px;
}
.search-box input[type="text"] {
padding: 6px;
border: 1px solid #ccc;
border-radius: 4px;
}
.modern-select {
padding: 6px 12px;
border-radius: 8px;
border: 1px solid #ccc;
font-size: 14px;
background-color: #fff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
transition: border 0.2s ease-in-out;
}
.modern-select:focus {
border-color: #0d6efd;
outline: none;
}
</style>
@if (session('success'))
<script>
Swal.fire({
@ -18,14 +64,14 @@
@endif
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Alternatif
<i class="bi bi-boxes"></i> Data Pakaian
</h1>
</div>
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold" style="color: #064E3B;">
<i class="bi bi-table"></i> Daftar Data Alternatif
<i class="bi bi-table"></i> Daftar Data Pakaian
</h6>
<button type="button" class="btn" style="background-color: #064E3B; color: white;" data-bs-toggle="modal"
data-bs-target="#modalTambah">
@ -35,134 +81,137 @@
<div class="card-body">
<form method="GET" id="entriesForm" action="{{ route('admin.pakaian.index') }}"
class="d-flex justify-content-between align-items-center mb-3 flex-wrap">
class="d-flex justify-content-between align-items-center mb-3 flex-wrap">
{{-- KIRI --}}
<div class="d-flex align-items-center">
<label for="entriesPerPage" class="me-2 mb-0">Show</label>
<select name="entries" id="entriesPerPage" class="form-select form-select-sm me-2"
onchange="document.getElementById('entriesForm').submit()">
<option value="10" {{ request('entries') == 10 ? 'selected' : '' }}>10</option>
<option value="25" {{ request('entries') == 25 ? 'selected' : '' }}>25</option>
<option value="50" {{ request('entries') == 50 ? 'selected' : '' }}>50</option>
</select>
<span class="mb-0">entries</span>
</div>
{{-- KANAN --}}
<div class="d-flex align-items-center">
<label for="search" class="me-2 mb-0">Search:</label>
<input type="text" name="search" id="search" class="form-control form-control-sm me-3" placeholder="Search..."
value="{{ request('search') }}">
<button type="submit" class="btn btn-sm btn-primary">Cari</button>
</div>
</form>
<div class="table-responsive">
<table class="table table-bordered">
<thead class="table-light text-center">
<tr>
<th>No</th>
<th>Gambar</th>
<th>Nama Pakaian</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@php $no = ($alternatif->currentPage() - 1) * $alternatif->perPage() + 1; @endphp
@foreach ($alternatif as $item)
<tr class="text-center">
<td>{{ $no++ }}</td>
<td class="text-center">
@if ($item->img)
<img src="{{ asset($item->img) }}" alt="Gambar"
class="img-fluid rounded object-fit-cover"
style="width: 100px; height: 100px; object-fit: cover;">
@else
Tidak ada gambar
@endif
</td>
<td>{{ $item->nama_pakaian }}</td>
<td class="text-center">
<!-- Tombol Info -->
<button class="btn btn-info btn-sm" data-bs-toggle="modal"
data-bs-target="#infoModal{{ $item->id }}">
<i class="bi bi-info-circle-fill"></i>
</button>
<!-- Tombol Edit -->
<button class="btn btn-warning btn-sm" data-bs-toggle="modal"
data-bs-target="#modalEdit{{ $item->id }}">
<i class="bi bi-pencil"></i>
</button>
@foreach ($alternatif as $item)
<!-- Modal Info -->
<div class="modal fade" id="infoModal{{ $item->id }}" tabindex="-1"
aria-labelledby="infoModalLabel{{ $item->id }}" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="infoModalLabel{{ $item->id }}">
Detail Subkriteria - {{ $item->nama_pakaian }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Kriteria</th>
<th>Subkriteria</th>
<th>Nilai</th>
<th>Range Harga</th>
</tr>
</thead>
<tbody>
@foreach ($item->subKriterias as $sub)
<tr>
<td>{{ $sub->kriteria->nama_kriteria ?? '-' }}</td>
<td>{{ $sub->nama_sub }}</td>
<td>{{ $sub->nilai }}</td>
<td>
@if ($sub->kriteria->nama_kriteria === 'Harga')
Rp{{ number_format($sub->min_harga, 0, ',', '.') }}
-
Rp{{ number_format($sub->max_harga, 0, ',', '.') }}
@else
-
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>
@endforeach
</td>
{{-- KIRI --}}
<div class="d-flex align-items-center gap-2 mb-2 mb-md-0">
<label for="entriesPerPage" class="mb-0 text-muted fw-semibold" style="margin-right: 8px;">Show</label>
<select name="entries" id="entriesPerPage" class="modern-select" style="margin-right: 8px;"
onchange="document.getElementById('entriesForm').submit()">
<option value="10" {{ request('entries') == 10 ? 'selected' : '' }}>10</option>
<option value="25" {{ request('entries') == 25 ? 'selected' : '' }}>25</option>
<option value="50" {{ request('entries') == 50 ? 'selected' : '' }}>50</option>
</select>
<span class="text-muted fw-semibold">entries</span>
</div>
{{-- KANAN --}}
<div class="d-flex align-items-center" style="gap: 10px;">
<input type="text" name="search" value="{{ request('search') }}"
class="form-control form-control-sm" placeholder="Cari nama pakaian...">
<button type="submit" class="btn btn-success btn-sm" style="background-color: #14532d; border-color: #14532d;">
Cari
</button>
</div>
</form>
</div>
<div class="table-responsive">
<table class="table table-bordered border-secondary table-striped align-middle text-center">
<thead class="table-light">
<tr>
<th scope="col">No</th>
<th scope="col">Gambar</th>
<th scope="col">Nama Pakaian</th>
<th scope="col">Harga</th>
<th scope="col">Aksi</th>
</tr>
@endforeach
</tbody>
</table>
</thead>
<tbody>
@foreach ($alternatif as $index => $item)
<tr>
<td>{{ $loop->iteration }}</td>
<td>
@if ($item->img)
<img src="{{ asset($item->img) }}" alt="Gambar" class="img-thumbnail" style="width: 100px; height: 100px;">
@else
<span class="text-muted">Tidak ada gambar</span>
@endif
</td>
<td>{{ $item->nama_pakaian }}</td>
<td>Rp{{ number_format($item->harga, 0, ',', '.') }}</td>
<td>
<button type="button" class="btn btn-info btn-sm" data-bs-toggle="modal" data-bs-target="#infoModal{{ $item->id }}">
<i class="bi bi-info-circle"></i>
</button>
<a href="{{ route('admin.pakaian.edit', $item->id) }}" class="btn btn-warning btn-sm">
<i class="bi bi-pencil-square"></i>
</a>
<button type="button" class="btn btn-danger btn-sm btn-delete" data-id="{{ $item->id }}" data-nama="{{ $item->nama_pakaian }}">
<i class="bi bi-trash"></i>
</button>
<!-- Form Hapus (disembunyikan) -->
<form id="delete-form-{{ $item->id }}" action="{{ route('admin.pakaian.destroy', $item->id) }}" method="POST" style="display: none;">
@csrf
@method('DELETE')
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- Pagination -->
<div class="d-flex justify-content-end">
{{ $alternatif->appends(request()->query())->links('vendor.pagination.bootstrap-5') }}
</div>
<!-- Modal Info -->
@foreach ($alternatif as $item)
<div class="modal fade" id="infoModal{{ $item->id }}" tabindex="-1"
aria-labelledby="infoModalLabel{{ $item->id }}" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="infoModalLabel{{ $item->id }}">
Detail Subkriteria - {{ $item->nama_pakaian }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Kriteria</th>
<th>Subkriteria</th>
<th>Nilai</th>
<th>Range Harga</th>
</tr>
</thead>
<tbody>
@foreach ($item->subKriterias as $sub)
<tr>
<td>{{ $sub->kriteria->nama_kriteria ?? '-' }}</td>
<td>{{ $sub->nama_sub }}</td>
<td>{{ $sub->nilai }}</td>
<td>
@if ($sub->kriteria->nama_kriteria === 'Harga')
Rp{{ number_format($sub->min_harga, 0, ',', '.') }}
-
Rp{{ number_format($sub->max_harga, 0, ',', '.') }}
@else
-
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>
@endforeach
<!-- Pagination -->
<div class="d-flex justify-content-end">
{{ $alternatif->appends(request()->query())->links('vendor.pagination.bootstrap-5') }}
</div>
</div>
</div>
</div>
<!-- Modal Tambah Data Pakaian -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
@ -367,4 +416,35 @@
background-color: #0056b3;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
document.addEventListener("DOMContentLoaded", function () {
const deleteButtons = document.querySelectorAll(".btn-delete");
deleteButtons.forEach(button => {
button.addEventListener("click", function () {
const id = this.getAttribute("data-id");
const nama = this.getAttribute("data-nama");
Swal.fire({
title: 'Hapus Data?',
text: `Data pakaian "${nama}" akan dihapus!`,
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#d33',
cancelButtonColor: '#3085d6',
confirmButtonText: 'Ya, hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
if (result.isConfirmed) {
document.getElementById(`delete-form-${id}`).submit();
}
});
});
});
});
</script>
@endsection

View File

@ -9,6 +9,49 @@
</h1>
</div>
<style>
.checkbox-group {
display: flex;
flex-direction: column;
gap: 10px;
border: 1px solid #ccc;
border-radius: 8px;
padding: 15px;
max-height: 200px;
overflow-y: auto;
background-color: #f9f9f9;
}
.checkbox-item {
display: flex;
align-items: center;
background-color: white;
border: 1px solid #ddd;
border-radius: 5px;
padding: 10px;
transition: background-color 0.2s;
}
.checkbox-item input[type="checkbox"] {
margin-right: 10px;
transform: scale(1.2);
}
.checkbox-item:hover {
background-color: #f0f0f0;
}
.form-text.text-muted {
font-size: 0.85rem;
color: #6c757d;
margin-top: 5px;
}
label.cursor-pointer {
cursor: pointer;
}
</style>
<div class="card shadow mb-4">
<div class="card-body">
@if ($errors->any())
@ -22,33 +65,54 @@
@endif
<!-- Form untuk update penilaian -->
<form action="{{ route('admin.penilaian.update', $alternatif->id) }}" method="POST">
<form action="{{ route('admin.penilaian.update', $pakaian->id) }}" method="POST">
@csrf
@method('PUT')
<!-- Nama Alternatif -->
<div class="mb-3">
<label class="form-label">Nama Alternatif</label>
<input type="text" class="form-control" value="{{ $alternatif->nama_alternatif }}" readonly>
<label class="form-label">Nama Pakaian</label>
<input type="text" class="form-control" value="{{ $pakaian->nama_pakaian }}" readonly>
</div>
<div class="row">
@foreach ($kriteria as $k)
<div class="col-md-6 mb-3">
<label class="form-label">{{ $k->nama_kriteria }}</label>
<select class="form-control" name="subkriteria_{{ $k->id }}" required>
<option value="">-- Pilih --</option>
@foreach ($k->subkriteria as $subkriteria)
<option value="{{ $subkriteria->id }}"
{{ isset($nilai[$k->id]) && $nilai[$k->id] == $subkriteria->id ? 'selected' : '' }}>
{{ $subkriteria->nama_subkriteria }}
</option>
@foreach ($kriterias as $kriteria)
<div class="col-md-6 mb-3">
<label class="form-label fw-semibold">{{ $kriteria->nama_kriteria }}</label>
@if(in_array($kriteria->nama_kriteria, ['Jenis Acara', 'Lokasi', 'Cuaca']))
{{-- Checkbox group untuk multiple select --}}
<div class="checkbox-group d-flex flex-wrap gap-2">
@foreach ($kriteria->subKriteria as $subkriteria)
<div class="form-check">
<input type="checkbox"
name="nilai[{{ $kriteria->id }}][]"
value="{{ $subkriteria->id }}"
id="sub_{{ $kriteria->id }}_{{ $subkriteria->id }}"
class="form-check-input"
{{ (isset($nilai[$kriteria->id]) && in_array($subkriteria->id, (array) $nilai[$kriteria->id])) ? 'checked' : '' }}>
<label for="sub_{{ $kriteria->id }}_{{ $subkriteria->id }}" class="form-check-label cursor-pointer">
{{ $subkriteria->nama_sub }}
</label>
</div>
@endforeach
</select>
</div>
<small class="form-text text-muted">Pilih satu atau lebih</small>
@else
{{-- Dropdown biasa untuk single select --}}
<select class="form-control" name="nilai[{{ $kriteria->id }}]" required>
<option value="">-- Pilih --</option>
@foreach ($kriteria->subKriteria as $subkriteria)
<option value="{{ $subkriteria->id }}"
{{ isset($nilai[$kriteria->id]) && $nilai[$kriteria->id] == $subkriteria->id ? 'selected' : '' }}>
{{ $subkriteria->nama_sub }}
</option>
@endforeach
</select>
@endif
</div>
@endforeach
</div>
<button type="submit" class="btn" style="background-color: #064E3B; color: white;">
Simpan
</button>

View File

@ -1,11 +1,11 @@
@extends('admin.layouts.base')
@section('title', 'Penilaian Alternatif')
@section('title', 'Penilaian Pakaian')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-box"></i> Penilaian Alternatif
<i class="bi bi-box"></i> Penilaian Pakaian
</h1>
</div>
@ -53,7 +53,7 @@
}
.btn-biru {
background-color: #007bff; /* biru Bootstrap */
background-color: #007bff;
color: white;
border: none;
padding: 6px 16px;
@ -69,70 +69,93 @@
display: flex;
gap: 8px;
align-items: center;
margin-bottom: 12px;
}
.search-box input[type="text"] {
padding: 6px;
.modern-select {
padding: 6px 12px;
border-radius: 8px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
background-color: #fff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
transition: border 0.2s ease-in-out;
}
.modern-select:focus {
border-color: #0d6efd;
outline: none;
}
</style>
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold" style="color: #064E3B;">
<i class="bi bi-table"></i> Daftar Penilaian Alternatif
<i class="bi bi-table"></i> Daftar Penilaian Pakaian
</h6>
</div>
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-3">
<form method="GET" class="d-flex align-items-center gap-2">
<label for="entriesPerPage" class="mb-0">Show</label>
<select name="perPage" id="entriesPerPage" class="form-select form-select-sm w-auto" onchange="this.form.submit()">
<option value="10" {{ request('perPage') == 10 ? 'selected' : '' }}>10</option>
<option value="30" {{ request('perPage') == 30 ? 'selected' : '' }}>30</option>
<option value="50" {{ request('perPage') == 50 ? 'selected' : '' }}>50</option>
{{-- GABUNGKAN FORM --}}
<form method="GET" action="{{ route('admin.penilaian.index') }}" class="d-flex justify-content-between align-items-center flex-wrap gap-3 mb-3">
<div class="d-flex align-items-center gap-2 mb-2 mb-md-0">
<label for="entriesPerPage" class="mb-0 text-muted fw-semibold" style="margin-right: 12px;">Show</label>
<select name="entries" id="entriesPerPage" class="modern-select" onchange="this.form.submit()">
<option value="10" {{ request('entries') == 10 ? 'selected' : '' }}>10</option>
<option value="25" {{ request('entries') == 25 ? 'selected' : '' }}>25</option>
<option value="50" {{ request('entries') == 50 ? 'selected' : '' }}>50</option>
</select>
<span class="mb-0">entries</span>
</form>
<span class="text-muted fw-semibold" style="margin-left: 12px;">entries</span>
</div>
<form action="{{ route('admin.penilaian.index') }}" method="GET" class="search-box">
<input type="text" name="search" value="{{ request('search') }}" placeholder="Cari nama alternatif...">
<button type="submit" class="btn-biru">Cari</button>
</form>
</div>
<div class="search-box">
<input type="text" name="search" value="{{ request('search') }}" placeholder="Cari nama alternatif..." class="form-control form-control-sm search-input">
<button type="submit" class="btn btn-sm" style="background-color: #14532d; color: white;">Cari</button>
</div>
</form>
<div class="table-responsive">
<table class="table table-bordered" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Alternatif</th>
<th class="text-center">C1</th>
<th class="text-center">C2</th>
<th class="text-center">C3</th>
<th class="text-center">C4</th>
<th class="text-center">C5</th>
<th class="text-center">C6</th>
<th class="text-center">Nama Pakaian</th>
{{-- Header Kriteria --}}
@foreach ($kriterias as $kriteria)
<th class="text-center">{{ $kriteria->nama_kriteria }}</th>
@endforeach
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@forelse ($data as $key => $item)
@forelse ($pakaians as $item)
<tr>
<td class="text-center">{{ $data->firstItem() + $key }}</td>
<td class="text-center">{{ $item->nama_alternatif ?? '-' }}</td>
<td class="text-center">{{ $loop->iteration }}</td>
<td class="text-center">{{ $item->nama_pakaian ?? '-' }}</td>
@for ($i = 1; $i <= 6; $i++)
{{-- Subkriteria --}}
@foreach ($kriterias as $kriteria)
@php
$penilaian = $item->penilaian->firstWhere('kriteria_id', $i);
$nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->nilai : '-';
$subKriterias = $item->subKriterias->where('kriteria_id', $kriteria->id);
$namaSubs = $subKriterias->pluck('nama_sub')->toArray();
@endphp
<td class="text-center">{{ $nilai }}</td>
@endfor
<td class="text-center">
@if (count($namaSubs))
@if ($kriteria->nama_kriteria === 'Jenis Acara')
<div class="d-flex flex-wrap justify-content-center gap-2">
@foreach ($namaSubs as $nama)
<span class="rounded-pill px-3 py-1 bg-light border text-dark small shadow-sm">
{{ $nama }}
</span>
@endforeach
</div>
@else
{{ $namaSubs[0] ?? '-' }}
@endif
@else
<span class="text-muted">-</span>
@endif
</td>
@endforeach
<td class="text-center">
<a href="{{ route('admin.penilaian.edit', $item->id) }}" class="btn btn-warning btn-sm">
@ -142,7 +165,7 @@
</tr>
@empty
<tr>
<td colspan="10" class="text-center">Belum ada data penilaian.</td>
<td colspan="{{ 3 + $kriterias->count() }}" class="text-center">Belum ada data penilaian.</td>
</tr>
@endforelse
</tbody>
@ -150,7 +173,8 @@
</div>
<div class="mt-3">
{{ $data->appends(['perPage' => request('perPage')])->links('pagination::bootstrap-4') }}
{{-- BAWA PARAMETER PAGINATION --}}
{{ $pakaians->appends(['entries' => request('entries'), 'search' => request('search')])->links('pagination::bootstrap-4') }}
</div>
</div>
</div>
@ -170,21 +194,4 @@
</script>
@endif
<script>
function searchFunction() {
var input, filter, table, tr, td, i, txtValue;
input = document.getElementById('search');
filter = input.value.toUpperCase();
table = document.querySelector("table");
tr = table.getElementsByTagName("tr");
for (i = 1; i < tr.length; i++) { // Start from 1 to skip the header
td = tr[i].getElementsByTagName("td")[1]; // Column 2 = Nama Alternatif
if (td) {
txtValue = td.textContent || td.innerText;
tr[i].style.display = txtValue.toUpperCase().indexOf(filter) > -1 ? "" : "none";
}
}
}
</script>
@endsection

View File

@ -2,14 +2,15 @@
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\KriteriaController;
use App\Http\Controllers\Admin\AuthController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Landingpage\HomeController;
use App\Http\Controllers\SubKriteriaController;
use App\Http\Controllers\Admin\ResetPasswordController;
use App\Http\Controllers\PakaianController;
use App\Http\Controllers\KriteriaController;
use App\Http\Controllers\PenilaianController;
use App\Http\Controllers\Admin\AuthController;
use App\Http\Controllers\SubKriteriaController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\SubKriteriaShowController;
use App\Http\Controllers\Landingpage\HomeController;
use App\Http\Controllers\Admin\ResetPasswordController;
/*
|--------------------------------------------------------------------------
@ -65,6 +66,7 @@ Route::prefix('admin')->middleware(['auth'])->as('admin.')->group(function () {
Route::get('kriteria/subkriteria/{nama_kriteria}', [SubKriteriaShowController::class, 'indexShow'])->name('kriteria.subkriteria.index');
Route::resource('pakaian', PakaianController::class);
Route::resource('penilaian', PenilaianController::class);
});
// // Kriteria