Perbaikan

This commit is contained in:
HANIF FEBRIANSYAH 2025-05-27 12:43:35 +07:00
parent d31dc31bce
commit 9bb045671f
10 changed files with 843 additions and 566 deletions

View File

@ -15,6 +15,90 @@ class HomeController extends Controller
{ {
public function index() public function index()
{ {
// // Ambil semua sub kriteria dan relasinya dengan kriteria
$subKriteria = SubKriteria::with('kriteria')->get()->groupBy(function ($item) {
return $item->kriteria->nama_kriteria;
});
return view('landingpage.master', [
'subKriteria' => $subKriteria
]);
} }
public function prosesRekomendasi(Request $request)
{
$sub_kriterias = $request->input('sub_kriteria'); // [kriteria_id => sub_kriteria_id]
if (!$sub_kriterias) {
return back()->with('error', 'Harap pilih semua preferensi terlebih dahulu.');
}
$selectedSubs = SubKriteria::whereIn('id', array_values($sub_kriterias))->get()->keyBy('id');
$allPakaian = Pakaian::with('subKriterias')->get();
// Step 1: Filter berdasarkan preferensi user
$filteredPakaian = $allPakaian->filter(function ($pakaian) use ($sub_kriterias, $selectedSubs) {
foreach ($sub_kriterias as $kriteria_id => $sub_id) {
if ($kriteria_id == 2) { // Harga (range)
$harga = $pakaian->harga;
$sub = $selectedSubs[$sub_id];
if ($harga < $sub->min_harga || $harga > $sub->max_harga) {
return false;
}
} elseif ($kriteria_id == 3) { // Jenis Pakaian (C3) WAJIB SAMA
$match = $pakaian->subKriterias->contains(function ($item) use ($kriteria_id, $sub_id) {
return $item->kriteria_id == $kriteria_id && $item->id == $sub_id;
});
if (!$match) return false;
} else {
// Untuk kriteria lain, cukup memiliki salah satu sub_kriteria
$match = $pakaian->subKriterias->where('kriteria_id', $kriteria_id)->isNotEmpty();
if (!$match) return false;
}
}
return true;
});
if ($filteredPakaian->isEmpty()) {
return back()->with('error', 'Tidak ada pakaian yang sesuai dengan preferensi Anda.');
}
// Step 2: Siapkan bobot & maksimum nilai
$kriterias = Kriteria::all()->keyBy('id');
$maxPerKriteria = [];
foreach ($kriterias as $kriteria_id => $kriteria) {
$maxPerKriteria[$kriteria_id] = SubKriteria::where('kriteria_id', $kriteria_id)->max('nilai') ?: 1;
}
// Step 3: Hitung skor SAW
$matrix = [];
foreach ($filteredPakaian as $pakaian) {
$score = 0;
foreach ($kriterias as $kriteria_id => $kriteria) {
$bobot = $kriteria->bobot;
$jenis = $kriteria->jenis;
// Ambil sub_kriteria tertinggi untuk kriteria ini
$subs = $pakaian->subKriterias->where('kriteria_id', $kriteria_id);
$sub = $subs->sortByDesc('nilai')->first();
if ($sub) {
$nilai = $sub->nilai;
$max = $maxPerKriteria[$kriteria_id];
$normal = $jenis == 'COST' ? ($nilai ? $max / $nilai : 0) : $nilai / $max;
$score += $normal * $bobot;
}
}
$matrix[] = [
'pakaian' => $pakaian,
'score' => round($score, 3),
];
}
$rekomendasi = collect($matrix)->sortByDesc('score')->values();
return view('landingpage.hasil', compact('rekomendasi'));
}
} }

View File

@ -2,9 +2,12 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Kriteria;
use App\Models\Pakaian; use App\Models\Pakaian;
use App\Models\Kriteria;
use App\Models\SubKriteria;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class PakaianController extends Controller class PakaianController extends Controller
{ {
@ -31,11 +34,14 @@ class PakaianController extends Controller
/** /**
* Show the form for creating a new resource. * Show the form for creating a new resource.
*/ */
public function create() public function create()
{ {
// $kriterias = Kriteria::with('subKriteria')->get(); // load kriteria + sub_kriterias
return view('admin.pages.pakaian.create', compact('kriterias'));
} }
/** /**
* Store a newly created resource in storage. * Store a newly created resource in storage.
*/ */
@ -45,23 +51,44 @@ class PakaianController extends Controller
'nama_pakaian' => 'required|string|max:255', 'nama_pakaian' => 'required|string|max:255',
'harga' => 'required|numeric', 'harga' => 'required|numeric',
'img' => 'nullable|image|max:2048', 'img' => 'nullable|image|max:2048',
'sub_kriterias' => 'array|nullable',
]); ]);
$imgPath = null; DB::beginTransaction();
if ($request->hasFile('img')) {
$imgPath = $request->file('img')->store('uploads/pakaian', 'public'); try {
// Upload image jika ada
$path = null;
if ($request->hasFile('img')) {
$path = $request->file('img')->store('pakaian', 'public');
}
// Simpan pakaian
$pakaian = Pakaian::create([
'nama_pakaian' => $request->nama_pakaian,
'harga' => $request->harga,
'img' => $path,
]);
// Simpan relasi sub kriteria
if ($request->filled('sub_kriterias')) {
$pakaian->subKriterias()->sync($request->sub_kriterias);
}
DB::commit();
return redirect()->route('admin.pakaian.index')->with('success', 'Pakaian berhasil ditambahkan.');
} catch (\Exception $e) {
// Rollback semua jika ada error
DB::rollBack();
// Hapus file yang sudah di-upload jika perlu
if ($path && Storage::disk('public')->exists($path)) {
Storage::disk('public')->delete($path);
}
return redirect()->back()->with('error', 'Gagal menambahkan pakaian: ' . $e->getMessage());
} }
$pakaian = Pakaian::create([
'nama_pakaian' => $request->nama_pakaian,
'harga' => $request->harga,
'img' => $imgPath ? 'storage/' . $imgPath : null,
]);
// Simpan relasi subkriteria (many-to-many)
$pakaian->subKriterias()->sync($request->subkriterias);
return redirect()->route('admin.pakaian.index')->with('success', 'Data pakaian berhasil ditambahkan.');
} }
@ -76,42 +103,58 @@ class PakaianController extends Controller
/** /**
* Show the form for editing the specified resource. * Show the form for editing the specified resource.
*/ */
public function edit(string $id) public function edit($id)
{ {
// $pakaian = Pakaian::with('subKriterias')->findOrFail($id);
$kriterias = Kriteria::with('subKriteria')->get();
return view('admin.pages.pakaian.edit', compact('pakaian', 'kriterias'));
} }
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id) public function update(Request $request, $id)
{ {
$request->validate([ $request->validate([
'nama_pakaian' => 'required|string|max:255', 'nama_pakaian' => 'required|string|max:255',
'harga' => 'required|numeric|min:0', 'harga' => 'required|numeric',
'gambar' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', 'img' => 'nullable|image|max:2048',
'sub_kriterias' => 'array|nullable',
]); ]);
$pakaian = Pakaian::findOrFail($id); DB::beginTransaction();
$pakaian->nama_pakaian = $request->nama_pakaian;
$pakaian->harga = $request->harga;
// Jika upload gambar baru try {
if ($request->hasFile('gambar')) { $pakaian = Pakaian::findOrFail($id);
if ($pakaian->img && file_exists(public_path($pakaian->img))) { $path = $pakaian->img;
unlink(public_path($pakaian->img));
// Update gambar jika ada file baru
if ($request->hasFile('img')) {
if ($path && Storage::disk('public')->exists($path)) {
Storage::disk('public')->delete($path);
}
$path = $request->file('img')->store('pakaian', 'public');
} }
$file = $request->file('gambar'); $pakaian->update([
$path = 'uploads/pakaian/'; 'nama_pakaian' => $request->nama_pakaian,
$filename = time() . '_' . $file->getClientOriginalName(); 'harga' => $request->harga,
$file->move(public_path($path), $filename); 'img' => $path,
$pakaian->img = $path . $filename; ]);
// Update relasi sub_kriterias
$pakaian->subKriterias()->sync($request->sub_kriterias ?? []);
DB::commit();
return redirect()->route('admin.pakaian.index')->with('success', 'Pakaian berhasil diperbarui.');
} catch (\Exception $e) {
DB::rollBack();
if (isset($path) && $request->hasFile('img') && Storage::disk('public')->exists($path)) {
Storage::disk('public')->delete($path);
}
return redirect()->back()->with('error', 'Gagal memperbarui pakaian: ' . $e->getMessage());
} }
$pakaian->save();
return redirect()->back()->with('success', 'Data pakaian berhasil diperbarui!');
} }

View File

@ -11,14 +11,13 @@ return new class extends Migration
*/ */
public function up(): void public function up(): void
{ {
Schema::create('pakaian_sub_kriterias', function (Blueprint $table) { Schema::create('pakaian_sub_kriterias', function (Blueprint $table) {
$table->id(); $table->id();
$table->foreignId('pakaian_id')->constrained()->onDelete('cascade'); $table->foreignId('pakaian_id')->constrained()->onDelete('cascade');
$table->foreignId('sub_kriteria_id')->constrained()->onDelete('cascade'); $table->foreignId('sub_kriteria_id')->constrained()->onDelete('cascade');
$table->timestamps(); $table->timestamps();
$table->unique(['pakaian_id', 'sub_kriteria_id']);
$table->unique(['pakaian_id', 'sub_kriteria_id']); });
});
} }
/** /**

View File

@ -25,9 +25,10 @@
<style> <style>
.sidebar { .sidebar {
position: relative; position: relative;
}
}
.bg-gradient-green { .bg-gradient-green {
background-color: #43a047 !important; background-color: #43a047 !important;
/* hijau medium */ /* hijau medium */
@ -45,7 +46,6 @@
padding-top: 8px !important; padding-top: 8px !important;
padding-bottom: 8px !important; padding-bottom: 8px !important;
} }
</style> </style>
</head> </head>
@ -92,33 +92,35 @@
<!-- Nav Item - Data Sub Kriteria (Collapse) --> <!-- Nav Item - Data Sub Kriteria (Collapse) -->
<li class="nav-item"> <li class="nav-item">
<a class="nav-link d-flex justify-content-between align-items-center {{ request()->is('admin/kriteria/subkriteria/*') ? '' : 'collapsed' }}" <a class="nav-link d-flex justify-content-between align-items-center {{ request()->is('admin/kriteria/subkriteria/*') ? '' : 'collapsed' }}"
href="#" data-bs-toggle="collapse" data-bs-target="#collapseSubkriteria" aria-expanded="{{ request()->is('admin/kriteria/subkriteria/*') ? 'true' : 'false' }}" href="#" data-bs-toggle="collapse" data-bs-target="#collapseSubkriteria"
aria-controls="collapseSubkriteria" style="font-size: 0.9rem; padding: 0.5rem 1rem;"> aria-expanded="{{ request()->is('admin/kriteria/subkriteria/*') ? 'true' : 'false' }}"
<div> aria-controls="collapseSubkriteria" style="font-size: 0.9rem; padding: 0.5rem 1rem;">
<i class="bi bi-boxes me-2"></i> <div>
<span>Data Sub Kriteria</span> <i class="bi bi-boxes me-2"></i>
</div> <span>Data Sub Kriteria</span>
<i class="bi bi-chevron-down small"></i> </div>
</a> <i class="bi bi-chevron-down small"></i>
</a>
<div id="collapseSubkriteria" class="collapse {{ request()->is('admin/kriteria/subkriteria/*') ? 'show' : '' }}"> <div id="collapseSubkriteria"
<div class="bg-white ps-2 py-1 rounded-2"> class="collapse {{ request()->is('admin/kriteria/subkriteria/*') ? 'show' : '' }}">
@php <div class="bg-white ps-2 py-1 rounded-2">
use App\Models\Kriteria; @php
$kriterias = Kriteria::with('subKriteria')->get(); use App\Models\Kriteria;
@endphp $kriterias = Kriteria::with('subKriteria')->get();
@endphp
@foreach ($kriterias as $kriteria) @foreach ($kriterias as $kriteria)
<a href="{{ route('admin.kriteria.subkriteria.index', ['nama_kriteria' => $kriteria->nama_kriteria]) }}" <a href="{{ route('admin.kriteria.subkriteria.index', ['nama_kriteria' => $kriteria->nama_kriteria]) }}"
class="d-block nav-link {{ request()->is('admin/kriteria/subkriteria/' . $kriteria->nama_kriteria) ? 'fw-bold text-dark' : 'text-dark' }}" 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;"> 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 }} <i class="bi bi-chevron-right small me-1"></i>{{ $kriteria->nama_kriteria }}
</a> </a>
@endforeach @endforeach
</div>
</div> </div>
</div> </li>
</li>
<script> <script>
document.addEventListener("DOMContentLoaded", function() { document.addEventListener("DOMContentLoaded", function() {
@ -213,10 +215,10 @@
<!-- Profile Link --> <!-- Profile Link -->
<a class="dropdown-item" href="{{ route('admin.user.show', Auth::user()->id) }}"> <a class="dropdown-item" href="{{ route('admin.user.show', Auth::user()->id) }}">
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i> <i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
Profile Profile
</a> </a>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
<!-- Logout Link --> <!-- Logout Link -->

View File

@ -0,0 +1,100 @@
@extends('admin.layouts.base')
@section('title', 'Tambah Pakaian')
@section('content')
<div class=" py-4">
<div class="card shadow-sm border-0 mx-auto">
<div class="card-header bg-success text-white d-flex align-items-center">
<i class="bi bi-plus-circle me-2 fs-5"></i>
<h5 class="mb-0">Tambah Pakaian</h5>
</div>
<div class="card-body">
<form action="{{ route('admin.pakaian.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="mb-3">
<label for="nama_pakaian" class="form-label fw-semibold">Nama Pakaian</label>
<input type="text" name="nama_pakaian" id="nama_pakaian" class="form-control" required>
</div>
<div class="mb-3">
<label for="harga" class="form-label fw-semibold">Harga</label>
<div class="input-group">
<span class="input-group-text">Rp</span>
<input type="number" name="harga" id="harga" class="form-control" required>
</div>
</div>
<div class="mb-3">
<label for="img" class="form-label fw-semibold">Upload Gambar</label>
<input type="file" name="img" id="img" class="form-control" accept="image/*">
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Pilih Sub Kriteria</label>
<div class="border rounded px-3 py-2" style="max-height: 300px; overflow-y: auto;">
@foreach ($kriterias as $kriteria)
<div class="mb-3">
<h6 class="text-primary">{{ $kriteria->nama_kriteria }}</h6>
@foreach ($kriteria->subKriteria as $sub)
<div class="form-check mb-2 ms-3">
<input class="form-check-input" type="checkbox" name="sub_kriterias[]"
value="{{ $sub->id }}" id="sub_{{ $sub->id }}"
data-kriteria="{{ $kriteria->nama_kriteria }}"
onclick="handleSingleChoice(this)">
<label class="form-check-label" for="sub_{{ $sub->id }}">
<strong>{{ $sub->nama_sub }}</strong>
@if ($kriteria->nama_kriteria === 'Harga')
<div class="text-muted small">
Min: Rp {{ number_format($sub->min_harga, 0, ',', '.') }},
Max: Rp {{ number_format($sub->max_harga, 0, ',', '.') }}
</div>
@else
<div class="text-muted small">Nilai: {{ $sub->nilai }}</div>
@endif
</label>
</div>
@endforeach
</div>
@endforeach
{{-- SCRIPT UNTUK MEMILIH 1 checkbox --}}
@push('scripts')
<script>
function handleSingleChoice(checkbox) {
const singleChoiceKriterias = ['Harga', 'Jenis Pakaian'];
const kriteria = checkbox.getAttribute('data-kriteria');
if (singleChoiceKriterias.includes(kriteria)) {
const checkboxes = document.querySelectorAll(`input[data-kriteria="${kriteria}"]`);
checkboxes.forEach(cb => {
if (cb !== checkbox) cb.checked = false;
});
}
}
</script>
@endpush
@stack('scripts')
</div>
</div>
<div class="d-flex justify-content-between pt-3">
<a href="{{ route('admin.pakaian.index') }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left"></i> Batal
</a>
<button type="submit" class="btn btn-success">
<i class="bi bi-check-circle"></i> Simpan
</button>
</div>
</form>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,107 @@
@extends('admin.layouts.base')
@section('title', 'Edit Pakaian')
@section('content')
<div class="py-4">
<div class="card shadow-sm border-0 mx-auto">
<div class="card-header bg-warning text-white d-flex align-items-center">
<i class="bi bi-pencil-square me-2 fs-5"></i>
<h5 class="mb-0">Edit Pakaian</h5>
</div>
<div class="card-body">
<form action="{{ route('admin.pakaian.update', $pakaian->id) }}" method="POST" enctype="multipart/form-data">
@csrf
@method('PUT')
<div class="mb-3">
<label class="form-label fw-semibold">Nama Pakaian</label>
<input type="text" name="nama_pakaian" class="form-control"
value="{{ old('nama_pakaian', $pakaian->nama_pakaian) }}" required>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Harga</label>
<div class="input-group">
<span class="input-group-text">Rp</span>
<input type="number" name="harga" class="form-control"
value="{{ old('harga', $pakaian->harga) }}" required>
</div>
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Gambar Lama</label><br>
@if ($pakaian->img && Storage::disk('public')->exists($pakaian->img))
<img src="{{ asset('storage/' . $pakaian->img) }}" alt="Gambar Lama"
style="width: 100px; height: 100px; object-fit: cover;" class="border rounded">
@else
<p class="text-muted">Tidak ada gambar</p>
@endif
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Upload Gambar Baru</label>
<input type="file" name="img" class="form-control" accept="image/*">
</div>
<div class="mb-3">
<label class="form-label fw-semibold">Pilih Sub Kriteria</label>
<div class="border rounded px-3 py-2" style="max-height: 300px; overflow-y: auto;">
@foreach ($kriterias as $kriteria)
<div class="mb-3">
<h6 class="text-primary">{{ $kriteria->nama_kriteria }}</h6>
@foreach ($kriteria->subKriteria as $sub)
<div class="form-check mb-2 ms-3">
<input class="form-check-input" type="checkbox" name="sub_kriterias[]"
value="{{ $sub->id }}" id="sub_{{ $sub->id }}"
data-kriteria="{{ $kriteria->nama_kriteria }}"
onclick="handleSingleChoice(this)"
{{ in_array($sub->id, $pakaian->subKriterias->pluck('id')->toArray()) ? 'checked' : '' }}>
<label class="form-check-label" for="sub_{{ $sub->id }}">
<strong>{{ $sub->nama_sub }}</strong>
@if ($kriteria->nama_kriteria === 'Harga')
<div class="text-muted small">
Min: Rp {{ number_format($sub->min_harga, 0, ',', '.') }},
Max: Rp {{ number_format($sub->max_harga, 0, ',', '.') }}
</div>
@else
<div class="text-muted small">Nilai: {{ $sub->nilai }}</div>
@endif
</label>
</div>
@endforeach
</div>
@endforeach
</div>
</div>
@push('scripts')
<script>
function handleSingleChoice(checkbox) {
const singleChoiceKriterias = ['Harga', 'Jenis Pakaian'];
const kriteria = checkbox.getAttribute('data-kriteria');
if (singleChoiceKriterias.includes(kriteria)) {
const checkboxes = document.querySelectorAll(`input[data-kriteria="${kriteria}"]`);
checkboxes.forEach(cb => {
if (cb !== checkbox) cb.checked = false;
});
}
}
</script>
@endpush
@stack('scripts')
<div class="d-flex justify-content-between pt-3">
<a href="{{ route('admin.pakaian.index') }}" class="btn btn-outline-secondary">
<i class="bi bi-arrow-left"></i> Batal
</a>
<button type="submit" class="btn btn-warning text-white">
<i class="bi bi-save"></i> Perbarui
</button>
</div>
</form>
</div>
</div>
</div>
@endsection

View File

@ -7,49 +7,50 @@
<style> <style>
.search-input { .search-input {
width: 200px; width: 200px;
} }
.btn-biru { .btn-biru {
background-color: #007bff; /* biru Bootstrap */ background-color: #007bff;
color: white; /* biru Bootstrap */
border: none; color: white;
padding: 6px 16px; border: none;
border-radius: 4px; padding: 6px 16px;
cursor: pointer; border-radius: 4px;
} cursor: pointer;
}
.btn-biru:hover { .btn-biru:hover {
background-color: #0069d9; background-color: #0069d9;
} }
.search-box { .search-box {
display: flex; display: flex;
gap: 8px; gap: 8px;
align-items: center; align-items: center;
margin-bottom: 12px; margin-bottom: 12px;
} }
.search-box input[type="text"] { .search-box input[type="text"] {
padding: 6px; padding: 6px;
border: 1px solid #ccc; border: 1px solid #ccc;
border-radius: 4px; border-radius: 4px;
} }
.modern-select { .modern-select {
padding: 6px 12px; padding: 6px 12px;
border-radius: 8px; border-radius: 8px;
border: 1px solid #ccc; border: 1px solid #ccc;
font-size: 14px; font-size: 14px;
background-color: #fff; background-color: #fff;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
transition: border 0.2s ease-in-out; transition: border 0.2s ease-in-out;
} }
.modern-select:focus { .modern-select:focus {
border-color: #0d6efd; border-color: #0d6efd;
outline: none; outline: none;
} }
</style> </style>
@if (session('success')) @if (session('success'))
<script> <script>
@ -73,10 +74,10 @@
<h6 class="m-0 font-weight-bold" style="color: #064E3B;"> <h6 class="m-0 font-weight-bold" style="color: #064E3B;">
<i class="bi bi-table"></i> Daftar Data Pakaian <i class="bi bi-table"></i> Daftar Data Pakaian
</h6> </h6>
<button type="button" class="btn" style="background-color: #064E3B; color: white;" data-bs-toggle="modal"
data-bs-target="#modalTambah"> <a href="{{ route('admin.pakaian.create') }}" class="btn" style="background-color: #064E3B; color: white;">
<i></i> Tambah Data <i></i> Tambah Data
</button> </a>
</div> </div>
<div class="card-body"> <div class="card-body">
@ -99,348 +100,311 @@
<div class="d-flex align-items-center" style="gap: 10px;"> <div class="d-flex align-items-center" style="gap: 10px;">
<input type="text" name="search" value="{{ request('search') }}" <input type="text" name="search" value="{{ request('search') }}"
class="form-control form-control-sm" placeholder="Cari nama pakaian..."> 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;"> <button type="submit" class="btn btn-success btn-sm"
style="background-color: #14532d; border-color: #14532d;">
Cari Cari
</button> </button>
</div> </div>
</form> </form>
</div> </div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-bordered border-secondary table-striped align-middle text-center"> <table class="table table-bordered border-secondary table-striped align-middle text-center">
<thead class="table-light"> <thead class="table-light">
<tr> <tr>
<th scope="col">No</th> <th scope="col">No</th>
<th scope="col">Gambar</th> <th scope="col">Gambar</th>
<th scope="col">Nama Pakaian</th> <th scope="col">Nama Pakaian</th>
<th scope="col">Harga</th> <th scope="col">Harga</th>
<th scope="col">Aksi</th> <th scope="col">Aksi</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach ($alternatif as $index => $item) @foreach ($alternatif as $index => $item)
<tr> <tr>
<td>{{ $loop->iteration }}</td> <td>{{ $loop->iteration }}</td>
<td> <td>
@if ($item->img) @if ($item->img)
<img src="{{ asset($item->img) }}" alt="Gambar" style="width: 100px; height: 100px;"> <img src="{{ asset('storage/' . $item->img) }}" alt="Gambar"
@else style="width: 100px; height: 100px;">
<span class="text-muted">Tidak ada gambar</span> @else
@endif <span class="text-muted">Tidak ada gambar</span>
</td> @endif
<td>{{ $item->nama_pakaian }}</td> </td>
<td>Rp{{ number_format($item->harga, 0, ',', '.') }}</td> <td>{{ $item->nama_pakaian }}</td>
<td> <td>Rp{{ number_format($item->harga, 0, ',', '.') }}</td>
<button type="button" class="btn btn-info btn-sm" data-bs-toggle="modal" data-bs-target="#infoModal{{ $item->id }}"> <td>
<i class="bi bi-info-circle"></i> <button type="button" class="btn btn-info btn-sm" data-bs-toggle="modal"
</button> data-bs-target="#infoModal{{ $item->id }}">
<a href="#" class="btn btn-warning btn-sm edit-button" data-id="{{ $item->id }}" data-bs-toggle="modal" data-bs-target="#modalEdit{{ $item->id }}"> <i class="bi bi-info-circle"></i>
<i class="bi bi-pencil-square"></i> </button>
</a> <a href="{{ route('admin.pakaian.edit', $item->id) }}" class="btn btn-warning btn-sm">
<button type="button" class="btn btn-danger btn-sm btn-delete" data-id="{{ $item->id }}" data-nama="{{ $item->nama_pakaian }}"> <i class="bi bi-pencil-square"></i>
<i class="bi bi-trash"></i> </a>
</button>
<!-- Form Hapus (disembunyikan) --> <button type="button" class="btn btn-danger btn-sm btn-delete"
<form id="delete-form-{{ $item->id }}" action="{{ route('admin.pakaian.destroy', $item->id) }}" method="POST" style="display: none;"> data-id="{{ $item->id }}" data-nama="{{ $item->nama_pakaian }}">
@csrf <i class="bi bi-trash"></i>
@method('DELETE') </button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- Modal Info --> <!-- Form Hapus (disembunyikan) -->
@foreach ($alternatif as $item) <form id="delete-form-{{ $item->id }}"
<div class="modal fade" id="infoModal{{ $item->id }}" tabindex="-1" action="{{ route('admin.pakaian.destroy', $item->id) }}" method="POST"
aria-labelledby="infoModalLabel{{ $item->id }}" aria-hidden="true"> style="display: none;">
<div class="modal-dialog modal-lg"> @csrf
<div class="modal-content"> @method('DELETE')
<div class="modal-header"> </form>
<h5 class="modal-title" id="infoModalLabel{{ $item->id }}"> </td>
Detail Subkriteria - {{ $item->nama_pakaian }} </tr>
</h5> @endforeach
<button type="button" class="btn-close" data-bs-dismiss="modal" </tbody>
aria-label="Close"></button> </table>
</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>
<!-- Modal Tambah Data Pakaian -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered"> <!-- Centered vertically -->
<div class="modal-content rounded-3 shadow-sm border-0">
<!-- Header -->
<div class="modal-header border-bottom-0">
<h5 class="modal-title fw-semibold" id="modalTambahLabel">
<i class="bi bi-plus-circle me-1"></i> Tambah Pakaian
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Tutup"></button>
</div>
<!-- Body -->
<div class="modal-body pt-0">
<form action="{{ route('admin.pakaian.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="mb-3">
<label for="nama_pakaian" class="form-label">Nama Pakaian</label>
<input type="text" class="form-control" name="nama_pakaian" required>
</div>
<div class="mb-3">
<label for="harga" class="form-label">Harga</label>
<input type="number" class="form-control" name="harga" required>
</div>
<div class="mb-3">
<label for="img" class="form-label">Upload Gambar</label>
<input type="file" class="form-control" name="img" accept="image/*">
</div>
<!-- Footer Buttons -->
<div class="modal-footer border-top-0 d-flex justify-content-end gap-2 pt-0">
<button type="button" class="btn" style="background-color: #90ee90; color: black; border-radius: 5px; padding: 6px 20px;" data-bs-dismiss="modal">
<i></i> Batal
</button>
<button type="submit" class="btn" style="background-color: #064e3b; color: white; border-radius: 5px; padding: 6px 20px;">
<i></i> Simpan
</button>
</div>
</form>
</div>
</div>
</div> </div>
</div>
@foreach ($alternatif as $item)
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit{{ $item->id }}" tabindex="-1"
aria-labelledby="modalEdit{{ $item->id }}" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEdit{{ $item->id }}">Edit Data Pakaian</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form method="POST" action="{{ route('admin.pakaian.update', $item->id) }}"
enctype="multipart/form-data">
@csrf
@method('PUT')
<!-- 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"> <div class="modal-body">
<!-- Nama Pakaian --> <table class="table table-bordered">
<div class="mb-3"> <thead>
<label for="edit_nama_pakaian{{ $item->id }}" class="form-label">Nama Pakaian</label> <tr>
<input type="text" class="form-control" id="edit_nama_pakaian{{ $item->id }}" <th>Kriteria</th>
name="nama_pakaian" value="{{ $item->nama_pakaian }}" required> <th>Subkriteria</th>
</div> <th>Nilai</th>
<!-- Harga --> <th>Range Harga</th>
<div class="mb-3"> </tr>
<label for="edit_harga{{ $item->id }}" class="form-label">Harga</label> </thead>
<input type="number" id="edit_harga{{ $item->id }}" name="harga" <tbody>
class="form-control" value="{{ $item->harga }}" required> @foreach ($item->subKriterias as $sub)
</div> <tr>
<td>{{ $sub->kriteria->nama_kriteria ?? '-' }}</td>
<!-- Upload Gambar Baru --> <td>{{ $sub->nama_sub }}</td>
<div class="mb-3"> <td>{{ $sub->nilai }}</td>
<label for="edit_gambar{{ $item->id }}" class="form-label">Gambar Baru</label> <td>
<input type="file" class="form-control" name="gambar" @if ($sub->kriteria->nama_kriteria === 'Harga')
id="edit_gambar{{ $item->id }}" accept="image/*"> Rp{{ number_format($sub->min_harga, 0, ',', '.') }}
</div> -
Rp{{ number_format($sub->max_harga, 0, ',', '.') }}
<!-- Preview Gambar Lama --> @else
<div class="mb-3"> -
<label class="form-label">Gambar Lama:</label><br> @endif
<img src="{{ asset($item->img) }}" alt="Gambar Lama" </td>
style="width: 100px; height: 100px; object-fit: cover;" class="border rounded"> </tr>
</div> @endforeach
</tbody>
</table>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn" style="background-color: #90ee90; color: black;" <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn"
style="background-color: #064E3B; color: white;">Simpan</button>
</div> </div>
</form> </div>
</div> </div>
</div> </div>
@endforeach
<!-- Pagination -->
<div class="d-flex justify-content-end">
{{ $alternatif->appends(request()->query())->links('vendor.pagination.bootstrap-5') }}
</div> </div>
@endforeach
<style>
.label-spacing {
margin-right: 0.3rem;
/* Jarak antara label dan select */
}
.search-input { @foreach ($alternatif as $item)
width: 200px; <!-- Modal Edit -->
/* Lebar input search */ <div class="modal fade" id="modalEdit{{ $item->id }}" tabindex="-1"
} aria-labelledby="modalEdit{{ $item->id }}" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEdit{{ $item->id }}">Edit Data Pakaian</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
.justify-between { <form method="POST" action="{{ route('admin.pakaian.update', $item->id) }}"
justify-content: space-between; enctype="multipart/form-data">
} @csrf
@method('PUT')
.pagination { <div class="modal-body">
display: flex; <!-- Nama Pakaian -->
justify-content: flex-end; <div class="mb-3">
/* Geser ke pojok kanan */ <label for="edit_nama_pakaian{{ $item->id }}" class="form-label">Nama
align-items: center; Pakaian</label>
padding: 10px; <input type="text" class="form-control" id="edit_nama_pakaian{{ $item->id }}"
} name="nama_pakaian" value="{{ $item->nama_pakaian }}" required>
</div>
<!-- Harga -->
<div class="mb-3">
<label for="edit_harga{{ $item->id }}" class="form-label">Harga</label>
<input type="number" id="edit_harga{{ $item->id }}" name="harga"
class="form-control" value="{{ $item->harga }}" required>
</div>
.pagination .page-item .page-link { <!-- Upload Gambar Baru -->
font-size: 14px; <div class="mb-3">
padding: 6px 12px; <label for="edit_gambar{{ $item->id }}" class="form-label">Gambar Baru</label>
border-radius: 5px; <input type="file" class="form-control" name="gambar"
border: none; id="edit_gambar{{ $item->id }}" accept="image/*">
color: white; </div>
background-color: #064E3B;
/* Warna biru */
margin: 0 2px;
transition: 0.3s ease-in-out;
}
.pagination .page-item.active .page-link { <!-- Preview Gambar Lama -->
background-color: #053B2D; <div class="mb-3">
/* Biru lebih gelap */ <label class="form-label">Gambar Lama:</label><br>
font-weight: bold; <img src="{{ asset('storage/' . $item->img) }}" alt="Gambar Lama"
} style="width: 100px; height: 100px; object-fit: cover;" class="border rounded">
.pagination .page-item .page-link:hover { </div>
background-color: #046C4E; </div>
}
.pagination .page-item.disabled .page-link { <div class="modal-footer">
background-color: #e9ecef; <button type="button" class="btn" style="background-color: #90ee90; color: black;"
color: #6c757d; data-bs-dismiss="modal">Batal</button>
cursor: not-allowed; <button type="submit" class="btn"
} style="background-color: #064E3B; color: white;">Simpan</button>
</div>
</form>
</div>
</div>
</div>
@endforeach
.entries-form {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 1rem;
margin-bottom: 1rem;
}
.entries-left, <style>
.entries-right { .label-spacing {
display: flex; margin-right: 0.3rem;
align-items: center; /* Jarak antara label dan select */
gap: 0.5rem; }
font-size: 14px;
}
.entries-left label, .search-input {
.entries-right label { width: 200px;
margin: 0; /* Lebar input search */
line-height: 1; }
}
.entries-left select, .justify-between {
.entries-right input[type="text"] { justify-content: space-between;
padding: 4px 8px; }
height: 32px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
}
.entries-right button { .pagination {
height: 32px; display: flex;
padding: 0 12px; justify-content: flex-end;
font-size: 14px; /* Geser ke pojok kanan */
background-color: #007bff; align-items: center;
color: #fff; padding: 10px;
border: none; }
border-radius: 4px;
cursor: pointer;
}
.entries-right button:hover { .pagination .page-item .page-link {
background-color: #0056b3; font-size: 14px;
} padding: 6px 12px;
</style> border-radius: 5px;
border: none;
color: white;
background-color: #064E3B;
/* Warna biru */
margin: 0 2px;
transition: 0.3s ease-in-out;
}
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> .pagination .page-item.active .page-link {
background-color: #053B2D;
/* Biru lebih gelap */
font-weight: bold;
}
<script> .pagination .page-item .page-link:hover {
document.addEventListener("DOMContentLoaded", function () { background-color: #046C4E;
const deleteButtons = document.querySelectorAll(".btn-delete"); }
deleteButtons.forEach(button => { .pagination .page-item.disabled .page-link {
button.addEventListener("click", function () { background-color: #e9ecef;
const id = this.getAttribute("data-id"); color: #6c757d;
const nama = this.getAttribute("data-nama"); cursor: not-allowed;
}
Swal.fire({ .entries-form {
title: 'Hapus Data?', display: flex;
text: `Data pakaian "${nama}" akan dihapus!`, justify-content: space-between;
icon: 'warning', align-items: center;
showCancelButton: true, flex-wrap: wrap;
confirmButtonColor: '#d33', gap: 1rem;
cancelButtonColor: '#3085d6', margin-bottom: 1rem;
confirmButtonText: 'Ya, hapus!', }
cancelButtonText: 'Batal'
}).then((result) => { .entries-left,
if (result.isConfirmed) { .entries-right {
document.getElementById(`delete-form-${id}`).submit(); display: flex;
} align-items: center;
gap: 0.5rem;
font-size: 14px;
}
.entries-left label,
.entries-right label {
margin: 0;
line-height: 1;
}
.entries-left select,
.entries-right input[type="text"] {
padding: 4px 8px;
height: 32px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
}
.entries-right button {
height: 32px;
padding: 0 12px;
font-size: 14px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
}
.entries-right button:hover {
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>
});
</script>
@endsection @endsection

View File

@ -0,0 +1,69 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hasil Rekomendasi</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet">
<style>
body {
background-color: #f8f9fa;
}
.card {
border-radius: 1rem;
overflow: hidden;
}
.card-img {
object-fit: cover;
height: 100%;
}
.card-body h5 {
font-weight: 600;
}
.card-body p {
margin-bottom: 0.5rem;
}
</style>
</head>
<body>
<div class="container py-5">
<h2 class="text-center mb-4 fw-bold">Hasil Rekomendasi Pakaian</h2>
@if ($rekomendasi->isEmpty())
<div class="alert alert-warning text-center">
Tidak ada pakaian yang cocok dengan preferensimu.
</div>
@else
@foreach ($rekomendasi as $item)
<div class="card mb-4 shadow-sm">
<div class="row g-0">
<div class="col-md-4">
<img src="{{ asset('storage/' . $item['pakaian']->img) }}" class="img-fluid card-img"
alt="Gambar {{ $item['pakaian']->nama_pakaian }}">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">{{ $item['pakaian']->nama_pakaian }}</h5>
<p class="card-text">Harga: <strong>Rp
{{ number_format($item['pakaian']->harga, 0, ',', '.') }}</strong></p>
<p class="card-text">Skor Kecocokan: <span
class="badge bg-primary">{{ number_format($item['score'], 3) }}</span></p>
</div>
</div>
</div>
</div>
@endforeach
@endif
</div>
<script src="{{ asset('js/bootstrap.bundle.min.js') }}"></script>
</body>
</html>

View File

@ -1,147 +1,65 @@
<section class="py-5" id="pilihpakaian"> <section class="py-5" id="pilihpakaian">
<div class="bg-holder d-none d-sm-block" style="background-image:url(assets/img/illustrations/bg.png);background-position:top left;background-size:225px 755px;margin-top:-17.5rem;"></div>
<div class="container my-5"> <div class="container my-5">
<form action="{{ route('proses.rekomendasi') }}" method="POST"> <form method="POST" action="{{ route('proses.rekomendasi') }}">
@csrf @csrf
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-lg-8"> <div class="col-lg-8">
<div class="text-center mb-4"> <div class="text-center mb-4">
<h5 class="fw-bold fs-3 fs-lg-5 lh-sm">Pilih Pakaian Anda</h5> <h5 class="fw-bold fs-3 fs-lg-5 lh-sm">Pilih Pakaian Anda</h5>
<p class="text-muted">Untuk mendapatkan rekomendasi pakaian yang paling sesuai dengan gaya dan kebutuhan Anda, silakan isi beberapa pertanyaan berikut.</p> <p class="text-muted">Untuk mendapatkan rekomendasi pakaian yang sesuai dengan preferensi Anda.
</p>
</div> </div>
<div class="card shadow-lg border-0 rounded-4"> <div class="card shadow-lg border-0 rounded-4">
<div class="card-body p-5 bg-light"> <div class="card-body p-5 bg-light">
<!-- Progress Bar --> <!-- Progress Bar -->
<div class="progress mb-4"> <div class="progress mb-4">
<div class="progress-bar bg-primary" role="progressbar" style="width: 20%;" id="progressBar"></div> <div class="progress-bar bg-primary" role="progressbar" style="width: 20%;"
id="progressBar"></div>
</div> </div>
<!-- STEP 1 --> @php
<div class="step active" id="step-1"> $steps = [
<h5 class="fw-bold mb-3">Pilih jenis acara yang akan kamu hadiri...</h5> 'Jenis Pakaian' => $subKriteria['Jenis Pakaian'] ?? [],
<div class="form-check mb-2"> 'Harga' => $subKriteria['Harga'] ?? [],
<input class="form-check-input" type="radio" id="acara1" value="Formal" name="jenis_acara"> 'Jenis Acara' => $subKriteria['Jenis Acara'] ?? [],
<label class="form-check-label" for="acara1">Formal</label> 'Warna Pakaian' => $subKriteria['Warna Pakaian'] ?? [],
</div> 'Cuaca Acara' => $subKriteria['Cuaca Acara'] ?? [],
<div class="form-check mb-2"> 'Lokasi Acara' => $subKriteria['Lokasi Acara'] ?? [],
<input class="form-check-input" type="radio" id="acara2" value="NonFormal" name="jenis_acara"> ];
<label class="form-check-label" for="acara2">Non Formal</label> $stepIndex = 1;
</div> @endphp
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="acara3" value="Casual" name="jenis_acara">
<label class="form-check-label" for="acara3">Casual</label>
</div>
<button type="button" class="btn btn-primary" onclick="nextStep()">Selanjutnya</button>
</div>
<!-- STEP 2 --> @foreach ($steps as $label => $subs)
<div class="step" id="step-2"> <div class="step {{ $stepIndex === 1 ? 'active' : '' }}" id="step-{{ $stepIndex }}">
<h5 class="fw-bold mb-3">Tentukan rentang harga pakaian...</h5> <h5 class="fw-bold mb-3">Pilih {{ strtolower($label) }}...</h5>
<div class="form-check mb-2"> @foreach ($subs as $sub)
<input class="form-check-input" type="radio" id="harga1" value="80000-100000" name="harga"> <div class="form-check mb-2">
<label class="form-check-label" for="harga1">Rp80.000 - 100.000</label> <input class="form-check-input" type="radio" id="sub_{{ $sub->id }}"
</div> value="{{ $sub->id }}"
<div class="form-check mb-2"> name="sub_kriteria[{{ $sub->kriteria_id }}]">
<input class="form-check-input" type="radio" id="harga2" value="101000-150000" name="harga"> <label class="form-check-label" for="sub_{{ $sub->id }}">
<label class="form-check-label" for="harga2">Rp101.000 - 150.000</label> {{ $sub->nama_sub }}
</div> </label>
<div class="form-check mb-2"> </div>
<input class="form-check-input" type="radio" id="harga3" value="151000-200000" name="harga"> @endforeach
<label class="form-check-label" for="harga3">Rp151.000 - 200.000</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="harga4" value="201000-300000" name="harga">
<label class="form-check-label" for="harga4">Rp201.000 - 300.000</label>
</div>
<button type="button" class="btn btn-secondary me-2" onclick="prevStep()">Kembali</button>
<button type="button" class="btn btn-primary" onclick="nextStep()">Selanjutnya</button>
</div>
<!-- STEP 3 --> <div class="mt-3">
<div class="step" id="step-3"> @if ($stepIndex > 1)
<h5 class="fw-bold mb-3">Pilih jenis pakaian...</h5> <button type="button" class="btn btn-secondary me-2"
<div class="form-check mb-2"> onclick="prevStep()">Kembali</button>
<input class="form-check-input" type="radio" id="pakaian1" value="Dress" name="jenis_pakaian"> @endif
<label class="form-check-label" for="pakaian1">Dress</label> @if ($stepIndex < count($steps))
<button type="button" class="btn btn-primary"
onclick="nextStep()">Selanjutnya</button>
@else
<button type="submit">Lihat Rekomendasi</button>
@endif
</div>
</div> </div>
<div class="form-check mb-2"> @php $stepIndex++; @endphp
<input class="form-check-input" type="radio" id="pakaian2" value="Blouse" name="jenis_pakaian"> @endforeach
<label class="form-check-label" for="pakaian2">Blouse</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="pakaian3" value="Cardigan" name="jenis_pakaian">
<label class="form-check-label" for="pakaian3">Cardigan</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="pakaian4" value="Rok" name="jenis_pakaian">
<label class="form-check-label" for="pakaian4">Rok</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="pakaian5" value="Celana" name="jenis_pakaian">
<label class="form-check-label" for="pakaian5">Celana</label>
</div>
<button type="button" class="btn btn-secondary me-2" onclick="prevStep()">Kembali</button>
<button type="button" class="btn btn-primary" onclick="nextStep()">Selanjutnya</button>
</div>
<!-- STEP 4 -->
<div class="step" id="step-4">
<h5 class="fw-bold mb-3">Pilih warna pakaian...</h5>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="warna1" value="Dingin" name="warna">
<label class="form-check-label" for="warna1">Warna Dingin</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="warna2" value="Panas" name="warna">
<label class="form-check-label" for="warna2">Warna Panas</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="warna3" value="Netral" name="warna">
<label class="form-check-label" for="warna3">Warna Netral</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="warna4" value="Lembut" name="warna">
<label class="form-check-label" for="warna4">Warna Lembut</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="warna5" value="Pastel" name="warna">
<label class="form-check-label" for="warna5">Warna Pastel</label>
</div>
<button type="button" class="btn btn-secondary me-2" onclick="prevStep()">Kembali</button>
<button type="button" class="btn btn-primary" onclick="nextStep()">Selanjutnya</button>
</div>
<!-- STEP 5 -->
<div class="step" id="step-5">
<h5 class="fw-bold mb-3">Pilih kondisi cuaca...</h5>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="cuaca1" value="Cerah" name="cuaca">
<label class="form-check-label" for="cuaca1">Cerah</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="cuaca2" value="Berawan" name="cuaca">
<label class="form-check-label" for="cuaca2">Berawan</label>
</div>
<button type="button" class="btn btn-secondary me-2" onclick="prevStep()">Kembali</button>
<button type="button" class="btn btn-primary" onclick="nextStep()">Selanjutnya</button>
</div>
<!-- STEP 6 -->
<div class="step" id="step-6">
<h5 class="fw-bold mb-3">Pilih lokasi acara...</h5>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="lokasi1" value="Indoor" name="lokasi">
<label class="form-check-label" for="lokasi1">Indoor</label>
</div>
<div class="form-check mb-2">
<input class="form-check-input" type="radio" id="lokasi2" value="Outdoor" name="lokasi">
<label class="form-check-label" for="lokasi2">Outdoor</label>
</div>
<button type="button" class="btn btn-secondary me-2" onclick="prevStep()">Kembali</button>
<button type="submit" class="btn btn-success">Hasil Rekomendasi</button>
</div>
</div> </div>
</div> </div>
@ -150,9 +68,10 @@
</form> </form>
</div> </div>
<!-- Script Multi-Step -->
<script> <script>
let currentStep = 1; let currentStep = 1;
const totalSteps = 6; const totalSteps = {{ count($steps) }};
function showStep(step) { function showStep(step) {
for (let i = 1; i <= totalSteps; i++) { for (let i = 1; i <= totalSteps; i++) {
@ -167,7 +86,7 @@
const isAnswered = Array.from(radios).some(radio => radio.checked); const isAnswered = Array.from(radios).some(radio => radio.checked);
if (!isAnswered) { if (!isAnswered) {
alert("Silakan isi pertanyaan ini terlebih dahulu."); alert("Silakan pilih salah satu opsi terlebih dahulu.");
return; return;
} }
@ -191,6 +110,4 @@
showStep(currentStep); showStep(currentStep);
</script> </script>
<div id="hasil-rekomendasi" style="margin-top: 20px;"></div>
</section> </section>

View File

@ -27,17 +27,9 @@ use App\Http\Controllers\Admin\ResetPasswordController;
Route::get('/', [HomeController::class, 'index'])->name('home'); Route::get('/', [HomeController::class, 'index'])->name('home');
Route::post('/proses-rekomendasi', [HomeController::class, 'simpankuisionerdanrekomendasi'])->name('proses.rekomendasi'); Route::post('/proses-rekomendasi', [HomeController::class, 'prosesRekomendasi'])->name('proses.rekomendasi');
// // Jika user sudah login, arahkan ke dashboard
// Route::get('/dashboard', function () {
// if (!Auth::check()) {
// return redirect()->route('login');
// }
// return view('admin.pages.dashboard.index');
// })->name('dashboard');
// Login & Register Routes // Login & Register Routes
Route::get('/login', [AuthController::class, 'showLogin'])->name('login'); Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
Route::post('/login', [AuthController::class, 'login']); Route::post('/login', [AuthController::class, 'login']);
@ -66,8 +58,8 @@ Route::prefix('admin')->middleware(['auth'])->as('admin.')->group(function () {
Route::resource('kriteria', KriteriaController::class); Route::resource('kriteria', KriteriaController::class);
Route::resource('subkriteria', SubkriteriaController::class); Route::resource('subkriteria', SubkriteriaController::class);
Route::get('kriteria/subkriteria/{nama_kriteria}', [SubKriteriaShowController::class, 'indexShow'])->name('kriteria.subkriteria.index'); Route::get('kriteria/subkriteria/{nama_kriteria}', [SubKriteriaShowController::class, 'indexShow'])->name('kriteria.subkriteria.index');
Route::resource('pakaian', PakaianController::class); Route::resource('pakaian', PakaianController::class);
Route::resource('penilaian', PenilaianController::class); Route::resource('penilaian', PenilaianController::class);
Route::resource('user', UserController::class); Route::resource('user', UserController::class);
}); });