updte
This commit is contained in:
parent
bba0721da7
commit
6fd286d3af
|
@ -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',
|
||||
]);
|
||||
|
||||
|
|
|
@ -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.');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
|
@ -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 © Your Website 2020</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- End of Footer -->
|
||||
|
||||
</div>
|
||||
|
|
|
@ -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;">
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue