commit
5f533f279b
|
@ -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'));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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!');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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']);
|
});
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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 -->
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue