insyallah fix
|
@ -20,6 +20,19 @@ class DashboardController extends Controller
|
||||||
$totalKriteria = Kriteria::count();
|
$totalKriteria = Kriteria::count();
|
||||||
$totalSubKriteria = Subkriteria::count();
|
$totalSubKriteria = Subkriteria::count();
|
||||||
|
|
||||||
return view("admin.pages.dashboard.index", compact("totalPakaian", "totalKriteria", "totalSubKriteria"));
|
// Dapatkan jumlah penilaian berdasarkan kriteria
|
||||||
|
$dataPenilaianPerKriteria = Kriteria::with('subKriteria.penilaians')->get()->map(function ($kriteria) {
|
||||||
|
return [
|
||||||
|
'label' => $kriteria->nama_kriteria, // sesuaikan jika nama kolomnya ini
|
||||||
|
'jumlah' => $kriteria->subKriteria->sum(fn($sub) => $sub->penilaians->count())
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
return view('admin.pages.dashboard.index', compact(
|
||||||
|
'totalKriteria',
|
||||||
|
'totalSubKriteria',
|
||||||
|
'totalPakaian',
|
||||||
|
'dataPenilaianPerKriteria'
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Admin;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use App\Models\QuizHistory;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
|
|
||||||
// ... other use
|
|
||||||
|
|
||||||
class RiwayatController extends Controller
|
|
||||||
{
|
|
||||||
public function index(Request $request)
|
|
||||||
{
|
|
||||||
$perPage = $request->get('per_page', 5); // Ambil dari query string, default 10
|
|
||||||
$riwayat = QuizHistory::orderBy('created_at', 'desc')
|
|
||||||
->paginate($perPage)
|
|
||||||
->withQueryString(); // penting agar per_page tetap ada saat klik pagination
|
|
||||||
|
|
||||||
return view('admin.pages.riwayat.index', compact('riwayat'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function destroy($id)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
$riwayat = QuizHistory::findOrFail($id);
|
|
||||||
$riwayat->delete();
|
|
||||||
|
|
||||||
return redirect()->back()->with('success', 'Riwayat berhasil dihapus.');
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
return redirect()->back()->with('error', 'Gagal menghapus riwayat.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -2,103 +2,362 @@
|
||||||
|
|
||||||
namespace App\Http\Controllers\Landingpage;
|
namespace App\Http\Controllers\Landingpage;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use App\Models\DataAlternatif;
|
|
||||||
use App\Models\Kriteria;
|
|
||||||
use App\Models\Pakaian;
|
use App\Models\Pakaian;
|
||||||
|
use App\Models\Kriteria;
|
||||||
use App\Models\QuizHistory;
|
use App\Models\QuizHistory;
|
||||||
use App\Models\Subkriteria;
|
use App\Models\Subkriteria;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use App\Models\DataAlternatif;
|
||||||
|
use App\Models\PenilaianPakaian;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
|
||||||
class HomeController extends Controller
|
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) {
|
$subKriteria = SubKriteria::with('kriteria')->get()->groupBy(function ($item) {
|
||||||
return $item->kriteria->nama_kriteria;
|
return $item->kriteria->nama_kriteria;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$pakaians = Pakaian::with('subKriterias')->get();
|
||||||
|
|
||||||
return view('landingpage.master', [
|
return view('landingpage.master', [
|
||||||
'subKriteria' => $subKriteria
|
'subKriteria' => $subKriteria,
|
||||||
|
'pakaians' => $pakaians
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
public function prosesRekomendasi(Request $request)
|
public function prosesRekomendasi(Request $request)
|
||||||
{
|
{
|
||||||
$sub_kriterias = $request->input('sub_kriteria'); // [kriteria_id => sub_kriteria_id]
|
// Input validation and processing
|
||||||
|
$userInput = $this->processUserInput($request->input('sub_kriteria', []));
|
||||||
if (!$sub_kriterias) {
|
|
||||||
return back()->with('error', 'Harap pilih semua preferensi terlebih dahulu.');
|
if (empty($userInput)) {
|
||||||
}
|
return $this->returnNoResults('Silakan pilih minimal satu kriteria.');
|
||||||
|
|
||||||
$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[] = [
|
// \Log::debug('User Input:', $userInput);
|
||||||
'pakaian' => $pakaian,
|
|
||||||
'score' => round($score, 3),
|
// Get selected subcriteria data
|
||||||
|
$selectedSubkriteria = SubKriteria::whereIn('id', collect($userInput)->flatten())
|
||||||
|
->get()
|
||||||
|
->keyBy('id');
|
||||||
|
|
||||||
|
// Extract criteria inputs
|
||||||
|
$criteriaInputs = $this->extractCriteriaInputs($userInput, $selectedSubkriteria);
|
||||||
|
|
||||||
|
// Apply strict filtering
|
||||||
|
$filteredClothing = $this->applyStrictFiltering($criteriaInputs);
|
||||||
|
|
||||||
|
if ($filteredClothing->isEmpty()) {
|
||||||
|
return $this->returnNoResults('Tidak ada pakaian yang sesuai dengan kriteria yang Anda pilih.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate recommendations using weighted scoring
|
||||||
|
$recommendations = $this->calculateRecommendations($filteredClothing, $userInput);
|
||||||
|
|
||||||
|
return view('landingpage.hasil', compact('recommendations'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Process and validate user input
|
||||||
|
*/
|
||||||
|
private function processUserInput(array $userInput): array
|
||||||
|
{
|
||||||
|
$processedInput = [];
|
||||||
|
|
||||||
|
foreach ($userInput as $kriteria_id => $subkriteria) {
|
||||||
|
$subkriteriaArray = (array) $subkriteria;
|
||||||
|
|
||||||
|
// Remove empty values and validate
|
||||||
|
$cleanedSubkriteria = array_filter($subkriteriaArray, function($value) {
|
||||||
|
return !empty($value) && is_numeric($value);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!empty($cleanedSubkriteria)) {
|
||||||
|
$processedInput[$kriteria_id] = array_map('intval', $cleanedSubkriteria);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $processedInput;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract and organize criteria inputs
|
||||||
|
*/
|
||||||
|
private function extractCriteriaInputs(array $userInput, $selectedSubkriteria): array
|
||||||
|
{
|
||||||
|
$inputs = [
|
||||||
|
'warna' => $userInput[1] ?? [], // Criteria 1: Color
|
||||||
|
'harga' => $userInput[2] ?? [], // Criteria 2: Price
|
||||||
|
'jenis_pakaian' => $userInput[3] ?? [], // Criteria 3: Clothing Type
|
||||||
|
'jenis_acara' => $userInput[4] ?? [], // Criteria 4: Event Type
|
||||||
|
'lokasi' => $userInput[5] ?? [] // Criteria 5: Location
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Calculate price range if price criteria is selected
|
||||||
|
if (!empty($inputs['harga'])) {
|
||||||
|
$hargaRanges = $selectedSubkriteria->only($inputs['harga']);
|
||||||
|
$inputs['harga_min'] = $hargaRanges->min('min_value');
|
||||||
|
$inputs['harga_max'] = $hargaRanges->max('max_value');
|
||||||
|
}
|
||||||
|
|
||||||
|
// \Log::debug("Extracted Criteria Inputs:", $inputs);
|
||||||
|
|
||||||
|
return $inputs;
|
||||||
}
|
}
|
||||||
|
|
||||||
$rekomendasi = collect($matrix)->sortByDesc('score')->values();
|
/**
|
||||||
return view('landingpage.hasil', compact('rekomendasi'));
|
* Apply strict filtering based on mandatory criteria
|
||||||
}
|
*/
|
||||||
|
private function applyStrictFiltering(array $criteriaInputs)
|
||||||
|
{
|
||||||
|
$query = Pakaian::with(['penilaian.subkriteria.kriteria']);
|
||||||
|
|
||||||
|
// Mandatory filter: Clothing Type (highest weight criteria)
|
||||||
|
if (!empty($criteriaInputs['jenis_pakaian'])) {
|
||||||
|
// \Log::debug('Applying clothing type filter:', $criteriaInputs['jenis_pakaian']);
|
||||||
|
|
||||||
|
$query->whereHas('penilaian.subkriteria', function ($q) use ($criteriaInputs) {
|
||||||
|
$q->where('kriteria_id', 3)
|
||||||
|
->whereIn('id', $criteriaInputs['jenis_pakaian']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mandatory filter: Price Range (if specified)
|
||||||
|
if (isset($criteriaInputs['harga_min']) && isset($criteriaInputs['harga_max'])) {
|
||||||
|
// \Log::debug("Applying price filter: {$criteriaInputs['harga_min']} - {$criteriaInputs['harga_max']}");
|
||||||
|
|
||||||
|
$query->whereHas('penilaian.subkriteria', function ($q) use ($criteriaInputs) {
|
||||||
|
$q->where('kriteria_id', 2)
|
||||||
|
->where('min_value', '<=', $criteriaInputs['harga_max'])
|
||||||
|
->where('max_value', '>=', $criteriaInputs['harga_min']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
$filteredClothing = $query->get();
|
||||||
|
|
||||||
|
// Validate filtering results
|
||||||
|
$this->validateFilterResults($filteredClothing, $criteriaInputs);
|
||||||
|
|
||||||
|
// \Log::debug('Filtered clothing count: ' . $filteredClothing->count());
|
||||||
|
|
||||||
|
return $filteredClothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate that filtering worked correctly
|
||||||
|
*/
|
||||||
|
private function validateFilterResults($clothing, array $criteriaInputs): void
|
||||||
|
{
|
||||||
|
if (!empty($criteriaInputs['jenis_pakaian'])) {
|
||||||
|
foreach ($clothing as $item) {
|
||||||
|
$clothingTypeAssessment = $item->penilaian
|
||||||
|
->where('subkriteria.kriteria_id', 3)
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if (!$clothingTypeAssessment ||
|
||||||
|
!in_array($clothingTypeAssessment->sub_kriteria_id, $criteriaInputs['jenis_pakaian'])) {
|
||||||
|
// \Log::error("❌ Filter validation failed for clothing: {$item->nama}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate recommendations using SAW method
|
||||||
|
*/
|
||||||
|
private function calculateRecommendations($clothing, array $userInput): \Illuminate\Support\Collection
|
||||||
|
{
|
||||||
|
// Get criteria with weights
|
||||||
|
$criteria = Kriteria::with('subkriteria')
|
||||||
|
->whereIn('id', [1, 2, 3, 4, 5])
|
||||||
|
->orderByDesc('bobot') // Order by weight (highest first)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
// Build decision matrix
|
||||||
|
$decisionMatrix = $this->buildDecisionMatrix($clothing, $criteria, $userInput);
|
||||||
|
|
||||||
|
// Calculate min/max values for normalization
|
||||||
|
$normalizationValues = $this->calculateNormalizationValues($decisionMatrix, $criteria);
|
||||||
|
|
||||||
|
// Calculate preference scores
|
||||||
|
$results = $this->calculatePreferenceScores(
|
||||||
|
$clothing,
|
||||||
|
$decisionMatrix,
|
||||||
|
$criteria,
|
||||||
|
$normalizationValues,
|
||||||
|
$userInput
|
||||||
|
);
|
||||||
|
|
||||||
|
// Sort by score (descending)
|
||||||
|
$recommendations = collect($results)
|
||||||
|
->sortByDesc('score')
|
||||||
|
->values();
|
||||||
|
|
||||||
|
$this->logFinalRecommendations($recommendations);
|
||||||
|
|
||||||
|
return $recommendations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build decision matrix for each clothing item
|
||||||
|
*/
|
||||||
|
private function buildDecisionMatrix($clothing, $criteria, array $userInput): array
|
||||||
|
{
|
||||||
|
$matrix = [];
|
||||||
|
|
||||||
|
foreach ($clothing as $item) {
|
||||||
|
$matrix[$item->id] = [];
|
||||||
|
|
||||||
|
foreach ($criteria as $criterion) {
|
||||||
|
$userSubIds = $userInput[$criterion->id] ?? [];
|
||||||
|
|
||||||
|
if (empty($userSubIds)) {
|
||||||
|
continue; // Skip criteria not selected by user
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get matching assessments for this criterion
|
||||||
|
$matchingAssessments = $item->penilaian->filter(function ($assessment) use ($userSubIds) {
|
||||||
|
return in_array($assessment->sub_kriteria_id, $userSubIds);
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($matchingAssessments->isNotEmpty()) {
|
||||||
|
// Use average if multiple matches, first match for clothing type
|
||||||
|
$value = ($criterion->id == 3)
|
||||||
|
? $matchingAssessments->first()->nilai
|
||||||
|
: $matchingAssessments->avg('nilai');
|
||||||
|
|
||||||
|
$matrix[$item->id][$criterion->id] = $value;
|
||||||
|
|
||||||
|
// \Log::debug("Item {$item->id} - Criterion {$criterion->id}: {$value}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate min/max values for normalization
|
||||||
|
*/
|
||||||
|
private function calculateNormalizationValues(array $decisionMatrix, $criteria): array
|
||||||
|
{
|
||||||
|
$values = ['max' => [], 'min' => []];
|
||||||
|
|
||||||
|
foreach ($criteria as $criterion) {
|
||||||
|
$criterionValues = collect($decisionMatrix)
|
||||||
|
->pluck($criterion->id)
|
||||||
|
->filter(function($value) {
|
||||||
|
return $value !== null && $value > 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($criterionValues->isNotEmpty()) {
|
||||||
|
$values['max'][$criterion->id] = $criterionValues->max();
|
||||||
|
$values['min'][$criterion->id] = $criterionValues->min();
|
||||||
|
} else {
|
||||||
|
// Fallback values
|
||||||
|
$values['max'][$criterion->id] = 1;
|
||||||
|
$values['min'][$criterion->id] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// \Log::debug("Criterion {$criterion->id} normalization - Max: {$values['max'][$criterion->id]}, Min: {$values['min'][$criterion->id]}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $values;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate final preference scores using SAW method
|
||||||
|
*/
|
||||||
|
private function calculatePreferenceScores($clothing, array $decisionMatrix, $criteria, array $normValues, array $userInput): array
|
||||||
|
{
|
||||||
|
$results = [];
|
||||||
|
|
||||||
|
foreach ($clothing as $item) {
|
||||||
|
$preferenceScore = 0;
|
||||||
|
$totalWeight = 0;
|
||||||
|
|
||||||
|
foreach ($criteria as $criterion) {
|
||||||
|
$userSubIds = $userInput[$criterion->id] ?? [];
|
||||||
|
|
||||||
|
if (empty($userSubIds) || !isset($decisionMatrix[$item->id][$criterion->id])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = $decisionMatrix[$item->id][$criterion->id];
|
||||||
|
|
||||||
|
if ($value <= 0) continue;
|
||||||
|
|
||||||
|
// Normalize value based on criterion type
|
||||||
|
$normalizedValue = $this->normalizeValue(
|
||||||
|
$value,
|
||||||
|
$normValues['max'][$criterion->id],
|
||||||
|
$normValues['min'][$criterion->id],
|
||||||
|
$criterion->jenis
|
||||||
|
);
|
||||||
|
|
||||||
|
// Calculate weighted contribution
|
||||||
|
$weight = $criterion->bobot;
|
||||||
|
$contribution = $normalizedValue * $weight;
|
||||||
|
$preferenceScore += $contribution;
|
||||||
|
$totalWeight += $weight;
|
||||||
|
|
||||||
|
// \Log::debug("Item {$item->id} - Criterion {$criterion->id}: Value={$value}, Normalized={$normalizedValue}, Weight={$weight}, Contribution={$contribution}");
|
||||||
|
}
|
||||||
|
|
||||||
|
$clothingType = $item->penilaian
|
||||||
|
->firstWhere('subkriteria.kriteria_id', 3)
|
||||||
|
?->subkriteria->nama ?? 'Lainnya';
|
||||||
|
|
||||||
|
$results[] = [
|
||||||
|
'pakaian' => $item,
|
||||||
|
'score' => round($preferenceScore, 4),
|
||||||
|
'jenis_pakaian' => $clothingType,
|
||||||
|
'total_weight' => $totalWeight
|
||||||
|
];
|
||||||
|
|
||||||
|
// \Log::debug("📊 Final Score - Item {$item->id} ({$item->nama}): {$preferenceScore}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Normalize value based on criterion type (BENEFIT/COST)
|
||||||
|
*/
|
||||||
|
private function normalizeValue(float $value, float $max, float $min, string $type): float
|
||||||
|
{
|
||||||
|
if ($type === 'COST') {
|
||||||
|
return $value > 0 ? $min / $value : 0;
|
||||||
|
} else {
|
||||||
|
return $max > 0 ? $value / $max : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Log final recommendations
|
||||||
|
*/
|
||||||
|
private function logFinalRecommendations($recommendations): void
|
||||||
|
{
|
||||||
|
// \Log::debug('🏆 FINAL RECOMMENDATIONS:');
|
||||||
|
|
||||||
|
foreach ($recommendations as $index => $item) {
|
||||||
|
$rank = $index + 1;
|
||||||
|
// \Log::debug("{$rank}. {$item['pakaian']->nama} - Score: {$item['score']} - Type: {$item['jenis_pakaian']}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return view with no results message
|
||||||
|
*/
|
||||||
|
private function returnNoResults(string $message)
|
||||||
|
{
|
||||||
|
return view('landingpage.hasil', [
|
||||||
|
'recommendations' => collect([]),
|
||||||
|
'message' => $message
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -51,7 +51,8 @@ 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',
|
'sub_kriterias' => 'nullable',
|
||||||
|
'deskripsi' => 'nullable|string|max:1000',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
|
@ -67,17 +68,39 @@ class PakaianController extends Controller
|
||||||
$pakaian = Pakaian::create([
|
$pakaian = Pakaian::create([
|
||||||
'nama_pakaian' => $request->nama_pakaian,
|
'nama_pakaian' => $request->nama_pakaian,
|
||||||
'harga' => $request->harga,
|
'harga' => $request->harga,
|
||||||
'img' => $path,
|
'img' => $path ? 'storage/' . $path : null,
|
||||||
|
'deskripsi' => $request->deskripsi,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Simpan relasi sub kriteria
|
$inputSub = $request->input('sub_kriterias', []);
|
||||||
if ($request->filled('sub_kriterias')) {
|
$subkriteriaIds = [];
|
||||||
$pakaian->subKriterias()->sync($request->sub_kriterias);
|
|
||||||
|
foreach ($inputSub as $key => $value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
$subkriteriaIds = array_merge($subkriteriaIds, $value);
|
||||||
|
} else {
|
||||||
|
$subkriteriaIds[] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$pakaian->subKriterias()->sync($subkriteriaIds);
|
||||||
|
|
||||||
|
|
||||||
|
// Tambahkan penilaian default untuk semua subkriteria
|
||||||
|
$allSubkriterias = SubKriteria::all();
|
||||||
|
foreach ($allSubkriterias as $sub) {
|
||||||
|
\App\Models\PenilaianPakaian::firstOrCreate([
|
||||||
|
'pakaian_id' => $pakaian->id,
|
||||||
|
'sub_kriteria_id' => $sub->id,
|
||||||
|
], [
|
||||||
|
'nilai' => 3 // bisa disesuaikan nilai defaultnya
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
|
|
||||||
return redirect()->route('admin.pakaian.index')->with('success', 'Pakaian berhasil ditambahkan.');
|
return redirect()->route('admin.pakaian.index', ['page' => $request->input('page')])
|
||||||
|
->with('success', 'Pakaian berhasil ditambahkan.');
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
// Rollback semua jika ada error
|
// Rollback semua jika ada error
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
|
@ -118,6 +141,7 @@ class PakaianController extends Controller
|
||||||
'harga' => 'required|numeric',
|
'harga' => 'required|numeric',
|
||||||
'img' => 'nullable|image|max:2048',
|
'img' => 'nullable|image|max:2048',
|
||||||
'sub_kriterias' => 'array|nullable',
|
'sub_kriterias' => 'array|nullable',
|
||||||
|
'deskripsi' => 'nullable|string|max:1000',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
|
@ -126,48 +150,59 @@ class PakaianController extends Controller
|
||||||
$pakaian = Pakaian::findOrFail($id);
|
$pakaian = Pakaian::findOrFail($id);
|
||||||
$path = $pakaian->img;
|
$path = $pakaian->img;
|
||||||
|
|
||||||
// Update gambar jika ada file baru
|
|
||||||
if ($request->hasFile('img')) {
|
if ($request->hasFile('img')) {
|
||||||
if ($path && Storage::disk('public')->exists($path)) {
|
// Hapus gambar lama dari storage
|
||||||
Storage::disk('public')->delete($path);
|
if ($pakaian->img && Storage::disk('public')->exists(str_replace('storage/', '', $pakaian->img))) {
|
||||||
|
Storage::disk('public')->delete(str_replace('storage/', '', $pakaian->img));
|
||||||
}
|
}
|
||||||
$path = $request->file('img')->store('pakaian', 'public');
|
|
||||||
|
// Simpan gambar baru
|
||||||
|
$storedPath = $request->file('img')->store('pakaian', 'public');
|
||||||
|
$path = 'storage/' . $storedPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
$pakaian->update([
|
$pakaian->update([
|
||||||
'nama_pakaian' => $request->nama_pakaian,
|
'nama_pakaian' => $request->nama_pakaian,
|
||||||
'harga' => $request->harga,
|
'harga' => $request->harga,
|
||||||
'img' => $path,
|
'img' => $path,
|
||||||
|
'deskripsi' => $request->deskripsi,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Update relasi sub_kriterias
|
// Update relasi sub_kriterias
|
||||||
$pakaian->subKriterias()->sync($request->sub_kriterias ?? []);
|
$inputSub = $request->input('sub_kriterias', []);
|
||||||
|
$subkriteriaIds = [];
|
||||||
|
|
||||||
|
foreach ($inputSub as $key => $value) {
|
||||||
|
if (is_array($value)) {
|
||||||
|
$subkriteriaIds = array_merge($subkriteriaIds, $value);
|
||||||
|
} else {
|
||||||
|
$subkriteriaIds[] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$pakaian->subKriterias()->sync($subkriteriaIds);
|
||||||
|
|
||||||
DB::commit();
|
DB::commit();
|
||||||
|
|
||||||
return redirect()->route('admin.pakaian.index')->with('success', 'Pakaian berhasil diperbarui.');
|
return redirect()->route('admin.pakaian.index', ['page' => $request->input('page')])
|
||||||
|
->with('success', 'Pakaian berhasil diperbarui.');
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
DB::rollBack();
|
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());
|
return redirect()->back()->with('error', 'Gagal memperbarui pakaian: ' . $e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the specified resource from storage.
|
* Remove the specified resource from storage.
|
||||||
*/
|
*/
|
||||||
public function destroy(string $id)
|
public function destroy(Request $request, string $id)
|
||||||
{
|
{
|
||||||
$pakaian = Pakaian::findOrFail($id);
|
$pakaian = Pakaian::findOrFail($id);
|
||||||
|
|
||||||
// Hapus gambar dari storage jika ada
|
// Hapus gambar dari storage jika ada
|
||||||
if ($pakaian->img && file_exists(public_path($pakaian->img))) {
|
if ($pakaian->img && Storage::disk('public')->exists(str_replace('storage/', '', $pakaian->img))) {
|
||||||
unlink(public_path($pakaian->img));
|
Storage::disk('public')->delete(str_replace('storage/', '', $pakaian->img));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hapus relasi subkriteria (pivot table)
|
// Hapus relasi subkriteria (pivot table)
|
||||||
|
@ -176,6 +211,8 @@ class PakaianController extends Controller
|
||||||
// Hapus data pakaian dari database
|
// Hapus data pakaian dari database
|
||||||
$pakaian->delete();
|
$pakaian->delete();
|
||||||
|
|
||||||
return redirect()->route('admin.pakaian.index')->with('success', 'Data pakaian berhasil dihapus.');
|
return redirect()->route('admin.pakaian.index', ['page' => $request->input('page')])
|
||||||
|
->with('success', 'Data pakaian berhasil dihapus.');
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,9 @@ namespace App\Http\Controllers;
|
||||||
|
|
||||||
use App\Models\Pakaian;
|
use App\Models\Pakaian;
|
||||||
use App\Models\Kriteria;
|
use App\Models\Kriteria;
|
||||||
|
use App\Models\Subkriteria;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
|
use App\Models\PenilaianPakaian;
|
||||||
|
|
||||||
class PenilaianController extends Controller
|
class PenilaianController extends Controller
|
||||||
{
|
{
|
||||||
|
@ -13,140 +15,103 @@ class PenilaianController extends Controller
|
||||||
*/
|
*/
|
||||||
public function index(Request $request)
|
public function index(Request $request)
|
||||||
{
|
{
|
||||||
$query = Pakaian::with('subKriterias.kriteria');
|
$perPage = $request->get('perPage', 10); // Ambil dari query, default ke 10
|
||||||
|
|
||||||
|
$query = PenilaianPakaian::with(['pakaian', 'subKriteria.kriteria']);
|
||||||
|
|
||||||
// Filter berdasarkan nama_pakaian jika ada pencarian
|
|
||||||
if ($request->has('search') && $request->search != '') {
|
if ($request->has('search') && $request->search != '') {
|
||||||
$query->where('nama_pakaian', 'like', '%' . $request->search . '%');
|
$search = $request->get('search');
|
||||||
}
|
$query->where(function ($q) use ($search) {
|
||||||
|
// Cari di nama pakaian
|
||||||
// Ambil jumlah per halaman dari parameter 'perPage' atau default ke 10
|
$q->whereHas('pakaian', function ($q1) use ($search) {
|
||||||
$perPage = $request->get('entries', 10);
|
$q1->where('nama_pakaian', 'like', "%$search%");
|
||||||
|
})
|
||||||
// Ambil data pakaian dengan pagination
|
// Cari di nama sub kriteria
|
||||||
$pakaians = $query->paginate($perPage);
|
->orWhereHas('subKriteria', function ($q2) use ($search) {
|
||||||
|
$q2->where('nama_sub', 'like', "%$search%");
|
||||||
// Ambil semua data kriteria
|
})
|
||||||
$kriterias = Kriteria::all();
|
// Cari di nama kriteria
|
||||||
|
->orWhereHas('subKriteria.kriteria', function ($q3) use ($search) {
|
||||||
// Return ke view dengan data yang dibutuhkan
|
$q3->where('nama_kriteria', 'like', "%$search%");
|
||||||
return view('admin.pages.penilaian.index', compact('pakaians', 'kriterias'));
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$penilaians = $query->paginate($perPage)->appends($request->all());
|
||||||
|
|
||||||
|
return view('admin.pages.penilaian.index', compact('penilaians'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the form for creating a new resource.
|
|
||||||
*/
|
|
||||||
public function create()
|
public function create()
|
||||||
{
|
{
|
||||||
//
|
$pakaians = Pakaian::all();
|
||||||
|
$subkriterias = SubKriteria::all();
|
||||||
|
return view('admin.pages.penilaian.form', compact('pakaians', 'subkriterias'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Store a newly created resource in storage.
|
|
||||||
*/
|
|
||||||
public function store(Request $request)
|
public function store(Request $request)
|
||||||
{
|
{
|
||||||
//
|
$request->validate([
|
||||||
}
|
'pakaian_id' => 'required|exists:pakaians,id',
|
||||||
|
'sub_kriteria_id' => 'required|exists:sub_kriterias,id',
|
||||||
|
'nilai' => 'required|numeric|between:1,5',
|
||||||
|
]);
|
||||||
|
|
||||||
/**
|
// Cek apakah kombinasi sudah ada
|
||||||
* Display the specified resource.
|
$cek = PenilaianPakaian::where('pakaian_id', $request->pakaian_id)
|
||||||
*/
|
->where('sub_kriteria_id', $request->sub_kriteria_id)
|
||||||
public function show(string $id)
|
->first();
|
||||||
{
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
if ($cek) {
|
||||||
* Show the form for editing the specified resource.
|
return redirect()->back()
|
||||||
*/
|
->withErrors(['Data penilaian untuk kombinasi ini sudah ada.'])
|
||||||
public function edit(string $id)
|
->withInput();
|
||||||
{
|
|
||||||
// Ambil data pakaian dengan relasi subKriterias beserta kriteria-nya
|
|
||||||
$pakaian = Pakaian::with('subKriterias.kriteria')->findOrFail($id);
|
|
||||||
|
|
||||||
// Ambil semua kriteria, supaya bisa ditampilkan di form edit untuk memilih/mengubah subkriteria
|
|
||||||
$kriterias = Kriteria::with('subKriteria')->get();
|
|
||||||
|
|
||||||
// Ambil ID kriteria yang multiple select
|
|
||||||
$multiSelectKriteriaIds = Kriteria::whereIn('nama_kriteria', ['Jenis Acara', 'Lokasi Acara', 'Cuaca'])->pluck('id')->toArray();
|
|
||||||
|
|
||||||
// Kirim juga nilai penilaian yang sudah disimpan
|
|
||||||
$nilai = [];
|
|
||||||
foreach ($pakaian->subKriterias as $sub) {
|
|
||||||
$kriteriaId = $sub->kriteria->id;
|
|
||||||
// Untuk multiple, buat array; untuk single, overwrite
|
|
||||||
if (in_array($kriteriaId, $multiSelectKriteriaIds)) {
|
|
||||||
$nilai[$kriteriaId][] = $sub->id;
|
|
||||||
} else {
|
|
||||||
$nilai[$kriteriaId] = $sub->id;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return view('admin.pages.penilaian.edit', compact(
|
PenilaianPakaian::create($request->all());
|
||||||
'pakaian',
|
$page = $request->input('page', 1); // default page 1 jika tidak ada
|
||||||
'kriterias',
|
return redirect()->route('admin.penilaian.index', ['page' => $page])
|
||||||
'multiSelectKriteriaIds',
|
->with('success', 'Data penilaian berhasil ditambahkan.');
|
||||||
'nilai'
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function edit(PenilaianPakaian $penilaian)
|
||||||
* Update the specified resource in storage.
|
|
||||||
*/
|
|
||||||
public function update(Request $request, $id)
|
|
||||||
{
|
{
|
||||||
$pakaian = Pakaian::findOrFail($id);
|
$pakaians = Pakaian::all();
|
||||||
|
$subkriterias = SubKriteria::all();
|
||||||
|
return view('admin.pages.penilaian.form', compact('penilaian', 'pakaians', 'subkriterias'));
|
||||||
|
}
|
||||||
|
|
||||||
// Ambil list kriteria yang multiple select (jenis acara, lokasi, cuaca)
|
public function update(Request $request, PenilaianPakaian $penilaian)
|
||||||
$multiSelectKriteria = Kriteria::whereIn('nama_kriteria', ['Jenis Acara', 'Lokasi', 'Cuaca'])->pluck('id')->toArray();
|
{
|
||||||
|
$request->validate([
|
||||||
|
'pakaian_id' => 'required|exists:pakaians,id',
|
||||||
|
'sub_kriteria_id' => 'required|exists:sub_kriterias,id',
|
||||||
|
'nilai' => 'required|numeric|between:1,5',
|
||||||
|
]);
|
||||||
|
|
||||||
$rules = [];
|
// Cek jika ada duplikat kombinasi (tapi bukan dirinya sendiri)
|
||||||
$messages = [];
|
$cek = PenilaianPakaian::where('pakaian_id', $request->pakaian_id)
|
||||||
|
->where('sub_kriteria_id', $request->sub_kriteria_id)
|
||||||
|
->where('id', '!=', $penilaian->id)
|
||||||
|
->first();
|
||||||
|
|
||||||
$allKriteria = Kriteria::all()->keyBy('id');
|
if ($cek) {
|
||||||
|
return redirect()->back()
|
||||||
foreach ($request->input('nilai') as $kriteriaId => $value) {
|
->withErrors(['Kombinasi ini sudah digunakan pada data lain.'])
|
||||||
if (!isset($allKriteria[$kriteriaId])) continue;
|
->withInput();
|
||||||
|
|
||||||
$nama = $allKriteria[$kriteriaId]->nama_kriteria;
|
|
||||||
|
|
||||||
if (in_array($kriteriaId, $multiSelectKriteria)) {
|
|
||||||
$rules["nilai.$kriteriaId"] = 'required|array|min:1';
|
|
||||||
$messages["nilai.$kriteriaId.required"] = "Pilih minimal satu subkriteria untuk $nama.";
|
|
||||||
$messages["nilai.$kriteriaId.min"] = "Pilih minimal satu subkriteria untuk $nama.";
|
|
||||||
} else {
|
|
||||||
$rules["nilai.$kriteriaId"] = 'required';
|
|
||||||
$messages["nilai.$kriteriaId.required"] = "Pilih satu subkriteria untuk $nama.";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$validated = $request->validate($rules, $messages);
|
$penilaian->update($request->all());
|
||||||
|
$page = $request->input('page', 1);
|
||||||
// Flatten semua subkriteria dari array nilai (baik single select maupun multi)
|
return redirect()->route('admin.penilaian.index', ['page' => $page])
|
||||||
$subKriteriaIds = [];
|
->with('success', 'Data penilaian berhasil diperbarui.');
|
||||||
|
|
||||||
foreach ($validated['nilai'] as $kriteriaId => $sub) {
|
|
||||||
if (is_array($sub)) {
|
|
||||||
$subKriteriaIds = array_merge($subKriteriaIds, $sub);
|
|
||||||
} else {
|
|
||||||
$subKriteriaIds[] = $sub;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$subKriteriaIds = array_unique($subKriteriaIds);
|
|
||||||
|
|
||||||
// Sync relasi many-to-many
|
|
||||||
$pakaian->subKriterias()->sync($subKriteriaIds);
|
|
||||||
|
|
||||||
return redirect()->route('admin.penilaian.index')->with('success', 'Penilaian berhasil diperbarui.');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function destroy(PenilaianPakaian $penilaian)
|
||||||
* Remove the specified resource from storage.
|
|
||||||
*/
|
|
||||||
public function destroy(string $id)
|
|
||||||
{
|
{
|
||||||
//
|
$penilaian->delete();
|
||||||
}
|
$page = request()->input('page', 1);
|
||||||
|
return redirect()->route('admin.penilaian.index', ['page' => $page])
|
||||||
|
->with('success', 'Data berhasil dihapus.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,7 +44,6 @@ class SubKriteriaController extends Controller
|
||||||
$validated = $request->validate([
|
$validated = $request->validate([
|
||||||
'kriteria_id' => 'required',
|
'kriteria_id' => 'required',
|
||||||
'nama_sub' => 'required|string|max:255',
|
'nama_sub' => 'required|string|max:255',
|
||||||
'nilai' => 'required|integer|min:1|max:5',
|
|
||||||
'min_harga' => 'nullable|numeric|min:0',
|
'min_harga' => 'nullable|numeric|min:0',
|
||||||
'max_harga' => 'nullable|numeric|min:0|gte:min_harga',
|
'max_harga' => 'nullable|numeric|min:0|gte:min_harga',
|
||||||
]);
|
]);
|
||||||
|
@ -53,7 +52,6 @@ class SubKriteriaController extends Controller
|
||||||
SubKriteria::create([
|
SubKriteria::create([
|
||||||
'kriteria_id' => $validated['kriteria_id'],
|
'kriteria_id' => $validated['kriteria_id'],
|
||||||
'nama_sub' => $validated['nama_sub'],
|
'nama_sub' => $validated['nama_sub'],
|
||||||
'nilai' => $validated['nilai'],
|
|
||||||
'min_harga' => $validated['min_harga'] ?? null,
|
'min_harga' => $validated['min_harga'] ?? null,
|
||||||
'max_harga' => $validated['max_harga'] ?? null,
|
'max_harga' => $validated['max_harga'] ?? null,
|
||||||
]);
|
]);
|
||||||
|
@ -86,7 +84,6 @@ class SubKriteriaController extends Controller
|
||||||
$request->validate([
|
$request->validate([
|
||||||
'kriteria_id' => 'required',
|
'kriteria_id' => 'required',
|
||||||
'nama_sub' => 'required|string|max:255',
|
'nama_sub' => 'required|string|max:255',
|
||||||
'nilai' => 'required|integer|min:1|max:5',
|
|
||||||
'min_harga' => 'nullable|numeric',
|
'min_harga' => 'nullable|numeric',
|
||||||
'max_harga' => 'nullable|numeric',
|
'max_harga' => 'nullable|numeric',
|
||||||
]);
|
]);
|
||||||
|
@ -95,7 +92,6 @@ class SubKriteriaController extends Controller
|
||||||
$subkriteria->update([
|
$subkriteria->update([
|
||||||
'kriteria_id' => $request->kriteria_id,
|
'kriteria_id' => $request->kriteria_id,
|
||||||
'nama_sub' => $request->nama_sub,
|
'nama_sub' => $request->nama_sub,
|
||||||
'nilai' => $request->nilai,
|
|
||||||
'min_harga' => $request->min_harga,
|
'min_harga' => $request->min_harga,
|
||||||
'max_harga' => $request->max_harga,
|
'max_harga' => $request->max_harga,
|
||||||
]);
|
]);
|
||||||
|
|
|
@ -17,4 +17,5 @@ class Kriteria extends Model
|
||||||
{
|
{
|
||||||
return $this->hasMany(SubKriteria::class);
|
return $this->hasMany(SubKriteria::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,10 +12,15 @@ class Pakaian extends Model
|
||||||
|
|
||||||
protected $table = 'pakaians';
|
protected $table = 'pakaians';
|
||||||
|
|
||||||
protected $fillable = ['nama_pakaian', 'img', 'harga'];
|
protected $fillable = ['nama_pakaian', 'img', 'harga', 'deskripsi'];
|
||||||
|
|
||||||
public function subKriterias(): BelongsToMany
|
public function subKriterias(): BelongsToMany
|
||||||
{
|
{
|
||||||
return $this->belongsToMany(SubKriteria::class, 'pakaian_sub_kriterias');
|
return $this->belongsToMany(SubKriteria::class, 'pakaian_sub_kriterias');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function penilaian()
|
||||||
|
{
|
||||||
|
return $this->hasMany(PenilaianPakaian::class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,23 +2,28 @@
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use App\Models\Subkriteria;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
|
||||||
class QuizHistory extends Model
|
class PenilaianPakaian extends Model
|
||||||
{
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'jenis_acara',
|
|
||||||
'harga',
|
|
||||||
'jenis_pakaian',
|
|
||||||
'warna',
|
|
||||||
'cuaca',
|
|
||||||
'lokasi',
|
|
||||||
'pakaian_id',
|
'pakaian_id',
|
||||||
|
'sub_kriteria_id',
|
||||||
|
'nilai',
|
||||||
];
|
];
|
||||||
|
|
||||||
public function pakaian()
|
public function pakaian()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Pakaian::class);
|
return $this->belongsTo(Pakaian::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function subkriteria()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Subkriteria::class, 'sub_kriteria_id');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -13,7 +13,7 @@ class SubKriteria extends Model
|
||||||
|
|
||||||
protected $table = 'sub_kriterias';
|
protected $table = 'sub_kriterias';
|
||||||
|
|
||||||
protected $fillable = ['kriteria_id', 'nama_sub', 'nilai', 'min_harga', 'max_harga'];
|
protected $fillable = ['kriteria_id', 'nama_sub', 'min_harga', 'max_harga'];
|
||||||
|
|
||||||
public function kriteria(): BelongsTo
|
public function kriteria(): BelongsTo
|
||||||
{
|
{
|
||||||
|
@ -24,4 +24,9 @@ class SubKriteria extends Model
|
||||||
{
|
{
|
||||||
return $this->belongsToMany(Pakaian::class, 'pakaian_sub_kriteria');
|
return $this->belongsToMany(Pakaian::class, 'pakaian_sub_kriteria');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function penilaians()
|
||||||
|
{
|
||||||
|
return $this->hasMany(PenilaianPakaian::class, 'sub_kriteria_id');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::create('penilaian_pakaians', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->foreignId('pakaian_id')->constrained('pakaians')->onDelete('cascade'); // FIX di sini
|
||||||
|
$table->foreignId('sub_kriteria_id')->constrained('sub_kriterias')->onDelete('cascade');
|
||||||
|
$table->integer('nilai'); // 1 kalau cocok, 0 kalau tidak
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('penilaian_pakaians');
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('pakaians', function (Blueprint $table) {
|
||||||
|
$table->text('deskripsi')->nullable()->after('img');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('pakaians', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('deskripsi');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
|
@ -13,13 +13,12 @@ return new class extends Migration
|
||||||
{
|
{
|
||||||
Schema::create('quiz_histories', function (Blueprint $table) {
|
Schema::create('quiz_histories', function (Blueprint $table) {
|
||||||
$table->id();
|
$table->id();
|
||||||
$table->string('jenis_acara');
|
$table->json('jenis_acara'); // multiple
|
||||||
$table->string('harga');
|
$table->string('harga'); // single
|
||||||
$table->string('jenis_pakaian');
|
$table->string('jenis_pakaian');// single
|
||||||
$table->string('warna');
|
$table->json('warna'); // multiple
|
||||||
$table->string('cuaca');
|
$table->json('lokasi'); // multiple
|
||||||
$table->string('lokasi');
|
$table->json('hasil_rekomendasi'); // bisa menyimpan lebih dari 1 hasil
|
||||||
$table->unsignedBigInteger('pakaian_id')->nullable(); // hasil rekomendasi
|
|
||||||
$table->timestamps();
|
$table->timestamps();
|
||||||
});
|
});
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@
|
||||||
namespace Database\Seeders;
|
namespace Database\Seeders;
|
||||||
|
|
||||||
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
||||||
|
use App\Models\User;
|
||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
|
||||||
|
@ -13,13 +14,18 @@ class DatabaseSeeder extends Seeder
|
||||||
*/
|
*/
|
||||||
public function run(): void
|
public function run(): void
|
||||||
{
|
{
|
||||||
// \App\Models\User::factory(10)->create();
|
User::updateOrCreate(
|
||||||
|
['username' => 'ysn'], // Cek berdasarkan username
|
||||||
\App\Models\User::create([
|
[
|
||||||
'name' => 'Admin User',
|
'name' => 'Admin User',
|
||||||
'username' => 'ysn',
|
|
||||||
'email' => 'yasindaputri16@gmail.com',
|
'email' => 'yasindaputri16@gmail.com',
|
||||||
'password' => Hash::make('1234567890'),
|
'password' => Hash::make('1234567890'),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// Panggil seeder PenilaianPakaianSeeder
|
||||||
|
$this->call([
|
||||||
|
PenilaianPakaianSeeder::class,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 114 KiB |
After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 90 KiB |
Before Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 74 KiB |
After Width: | Height: | Size: 133 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 188 KiB |
After Width: | Height: | Size: 109 KiB |
After Width: | Height: | Size: 113 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 136 KiB |
After Width: | Height: | Size: 139 KiB |
After Width: | Height: | Size: 151 KiB |
After Width: | Height: | Size: 154 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 122 KiB |
After Width: | Height: | Size: 101 KiB |
After Width: | Height: | Size: 122 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 143 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 100 KiB |
After Width: | Height: | Size: 96 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 88 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 154 KiB |
After Width: | Height: | Size: 98 KiB |
After Width: | Height: | Size: 99 KiB |
After Width: | Height: | Size: 121 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 130 KiB |
After Width: | Height: | Size: 317 KiB |
After Width: | Height: | Size: 152 KiB |
After Width: | Height: | Size: 108 KiB |
After Width: | Height: | Size: 143 KiB |
After Width: | Height: | Size: 142 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 119 KiB |
After Width: | Height: | Size: 93 KiB |
After Width: | Height: | Size: 92 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 153 KiB |
After Width: | Height: | Size: 70 KiB |
After Width: | Height: | Size: 120 KiB |
After Width: | Height: | Size: 110 KiB |
After Width: | Height: | Size: 94 KiB |
|
@ -161,14 +161,6 @@
|
||||||
<span>Penilaian</span></a>
|
<span>Penilaian</span></a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<!-- Nav Item - Hasil Akhir -->
|
|
||||||
<li class="nav-item {{ request()->is('admin/riwayat') ? 'active' : '' }}">
|
|
||||||
<a class="nav-link" href="#">
|
|
||||||
<i class="bi bi-hourglass-split"></i>
|
|
||||||
<span>Riwayat User</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
<!-- Divider -->
|
<!-- Divider -->
|
||||||
<hr class="sidebar-divider">
|
<hr class="sidebar-divider">
|
||||||
|
|
||||||
|
|
|
@ -3,57 +3,33 @@
|
||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
#content-wrapper {
|
#content-wrapper {
|
||||||
min-height: 100vh; /* Supaya kontennya minimal setinggi layar */
|
min-height: 100vh;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
#content {
|
#content {
|
||||||
flex: 1; /* Supaya konten utama mengambil semua ruang kosong */
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.sticky-footer {
|
.sticky-footer {
|
||||||
width: calc(100% - 225px); /* Sesuaikan 250px dengan lebar sidebar */
|
width: calc(100% - 225px);
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 225px; /* Mulai dari sebelah kanan sidebar */
|
left: 225px;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
|
||||||
|
|
||||||
.card-link-text {
|
|
||||||
transition: text-decoration 0.2s ease;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
a:hover .card-link-text {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.card-link {
|
|
||||||
text-decoration: none;
|
|
||||||
color: inherit; /* supaya warna teks tetap sama */
|
|
||||||
display: block; /* supaya link memenuhi seluruh card */
|
|
||||||
}
|
|
||||||
|
|
||||||
a.card-link:hover span {
|
|
||||||
text-decoration: underline;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.text-decoration-none:hover .underline-on-hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<h1 class="h3 text-gray-800">
|
<h1 class="h3 text-gray-800">
|
||||||
<i class="bi bi-house-door-fill"></i> Dashboard
|
<i class="bi bi-house-door-fill"></i> Dashboard
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<!-- Notification Pop-up -->
|
<!-- Notification -->
|
||||||
<div class="alert alert-success alert-dismissible fade show" role="alert" style="font-size: 14px; display: flex; align-items: center; justify-content: space-between; background-color: #d4edda; border: 1px solid #c3e6cb; padding: 10px; border-radius: 5px;">
|
<div class="alert alert-success alert-dismissible fade show" role="alert" style="font-size: 14px; display: flex; align-items: center; justify-content: space-between; background-color: #d4edda; border: 1px solid #c3e6cb; padding: 10px; border-radius: 5px;">
|
||||||
<span><strong>Selamat datang ADMIN!</strong> Anda bisa mengoperasikan sistem dengan wewenang tertentu melalui pilihan menu di bawah.</span>
|
<span><strong>Selamat datang ADMIN!</strong> Anda bisa mengoperasikan sistem dengan wewenang tertentu melalui pilihan menu di bawah.</span>
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close" style="margin-left: 10px;">
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close" style="margin-left: 10px;">
|
||||||
|
@ -61,110 +37,69 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Content Row -->
|
<div class="row mt-4">
|
||||||
<div class="row">
|
<!-- Tentang Sistem -->
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
<!-- Data Kriteria -->
|
<div class="card shadow-sm h-100 p-4">
|
||||||
<div class="col-xl-4 col-md-6 mb-4">
|
<h5 class="mb-3" style="color: #155724; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-weight: 600;">
|
||||||
<a href="#">
|
Informasi Sistem Pendukung Keputusan Pemilihan Pakaian
|
||||||
<div class="card border-left-primary shadow h-100 py-2">
|
</h5>
|
||||||
<div class="card-body">
|
<p class="text-gray-700 mb-0">
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
Sistem ini menggunakan metode <strong>Simple Additive Weighting (SAW)</strong> untuk memberikan rekomendasi pakaian berdasarkan preferensi pengguna.
|
||||||
<span class="h5 mb-0 font-weight-bold text-gray-800">
|
Setiap pakaian dinilai berdasarkan kecocokan terhadap subkriteria dari 5 kriteria utama, dengan bobot yang telah ditentukan.
|
||||||
Data Kriteria: {{ $totalKriteria }}
|
Semakin tinggi skor akhir, semakin cocok pakaian tersebut untuk kebutuhan pengguna.
|
||||||
</span>
|
</p>
|
||||||
<i class="bi bi-box text-gray-400" style="font-size: 1.5rem;"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Data Sub Kriteria -->
|
|
||||||
<div class="col-xl-4 col-md-6 mb-4">
|
|
||||||
<a href="#">
|
|
||||||
<div class="card border-left-info shadow h-100 py-2">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
|
||||||
<span class="h5 mb-0 font-weight-bold text-gray-800">
|
|
||||||
Data Sub Kriteria: {{ $totalSubKriteria }}
|
|
||||||
</span>
|
|
||||||
<i class="bi bi-boxes text-gray-400" style="font-size: 1.5rem;"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Data Alternatif -->
|
|
||||||
<div class="col-xl-4 col-md-6 mb-4">
|
|
||||||
<a href="#" class="text-decoration-none">
|
|
||||||
<div class="card border-left-success shadow h-100 py-2">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
|
||||||
<span class="h5 mb-0 font-weight-bold text-gray-800 underline-on-hover">
|
|
||||||
Data Alternatif: {{ $totalPakaian }}
|
|
||||||
</span>
|
|
||||||
<i class="bi bi-person-lines-fill text-gray-400" style="font-size: 1.5rem;"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Area Chart -->
|
|
||||||
<div class="col-xl-12 mb-4">
|
|
||||||
<div class="card shadow h-100">
|
|
||||||
<div class="card-header d-flex align-items-center py-2">
|
|
||||||
<h6 class="m-0 font-weight-bold text-dark">Statistik Pengunjung</h6>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="chart-area">
|
|
||||||
<canvas id="myAreaChart"></canvas>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{-- <!-- Data Penilaian -->
|
|
||||||
<div class="col-xl-4 col-md-6 mb-4">
|
|
||||||
<a href="{{ route('admin.penilaian.index') }}" style="text-decoration: none;">
|
|
||||||
<div class="card border-left-secondary shadow h-100 py-2">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
|
||||||
<span class="h5 mb-0 font-weight-bold text-gray-800 card-link-text">Penilaian Alternatif</span>
|
|
||||||
<i class="bi bi-list-ul text-gray-400" style="font-size: 1.5rem;"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Data Perhitungan -->
|
|
||||||
<div class="col-xl-4 col-md-6 mb-4">
|
|
||||||
<div class="card border-left-warning shadow h-100 py-2">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
|
||||||
<span class="h5 mb-0 font-weight-bold text-gray-800">Perhitungan</span>
|
|
||||||
<i class="bi bi-calculator-fill text-gray-400" style="font-size: 1.5rem;"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Data Hasil Akhir -->
|
|
||||||
<div class="col-xl-4 col-md-6 mb-4">
|
|
||||||
<div class="card border-left-danger shadow h-100 py-2">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
|
||||||
<span class="h5 mb-0 font-weight-bold text-gray-800">Hasil Akhir</span>
|
|
||||||
<i class="bi bi-graph-up text-gray-400" style="font-size: 1.5rem;"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div> --}}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Grafik -->
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<div class="card shadow-sm h-100 p-4">
|
||||||
|
<h5 class="mb-3" style="color: #155724; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-weight: 600;">
|
||||||
|
Statistik Jumlah Data
|
||||||
|
</h5>
|
||||||
|
<canvas id="dashboardChart" height="170"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||||
|
<script>
|
||||||
|
const ctx = document.getElementById('dashboardChart').getContext('2d');
|
||||||
|
const dashboardChart = new Chart(ctx, {
|
||||||
|
type: 'bar',
|
||||||
|
data: {
|
||||||
|
labels: ['Kriteria', 'Sub Kriteria', 'Pakaian'],
|
||||||
|
datasets: [{
|
||||||
|
label: 'Jumlah Data',
|
||||||
|
data: [{{ $totalKriteria }}, {{ $totalSubKriteria }}, {{ $totalPakaian }}],
|
||||||
|
backgroundColor: [
|
||||||
|
'rgba(78, 115, 223, 0.7)',
|
||||||
|
'rgba(54, 185, 204, 0.7)',
|
||||||
|
'rgba(28, 200, 138, 0.7)'
|
||||||
|
],
|
||||||
|
borderColor: [
|
||||||
|
'rgba(78, 115, 223, 1)',
|
||||||
|
'rgba(54, 185, 204, 1)',
|
||||||
|
'rgba(28, 200, 138, 1)'
|
||||||
|
],
|
||||||
|
borderWidth: 1
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
responsive: true,
|
||||||
|
plugins: {
|
||||||
|
legend: { display: false }
|
||||||
|
},
|
||||||
|
scales: {
|
||||||
|
y: {
|
||||||
|
beginAtZero: true,
|
||||||
|
ticks: {
|
||||||
|
precision: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@endsection
|
@endsection
|
||||||
|
|
|
@ -3,17 +3,16 @@
|
||||||
@section('title', 'Tambah Pakaian')
|
@section('title', 'Tambah Pakaian')
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
|
<div class="py-4">
|
||||||
<div class=" py-4">
|
|
||||||
<div class="card shadow-sm border-0 mx-auto">
|
<div class="card shadow-sm border-0 mx-auto">
|
||||||
<div class="card-header bg-success text-white d-flex align-items-center">
|
<div class="card-header text-white d-flex align-items-center" style="background-color: #14532d;">
|
||||||
<i class="bi bi-plus-circle me-2 fs-5"></i>
|
|
||||||
<h5 class="mb-0">Tambah Pakaian</h5>
|
<h5 class="mb-0">Tambah Pakaian</h5>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<form action="{{ route('admin.pakaian.store') }}" method="POST" enctype="multipart/form-data">
|
<form action="{{ route('admin.pakaian.store') }}" method="POST" enctype="multipart/form-data">
|
||||||
@csrf
|
@csrf
|
||||||
|
<input type="hidden" name="page" value="{{ request()->input('page') }}">
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="nama_pakaian" class="form-label fw-semibold">Nama Pakaian</label>
|
<label for="nama_pakaian" class="form-label fw-semibold">Nama Pakaian</label>
|
||||||
|
@ -34,19 +33,31 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label fw-semibold">Pilih Sub Kriteria</label>
|
<label for="deskripsi" class="form-label fw-semibold">Deskripsi</label>
|
||||||
|
<textarea name="deskripsi" id="deskripsi" class="form-control" rows="4" placeholder="Masukkan deskripsi pakaian..."></textarea>
|
||||||
|
</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;">
|
<div class="border rounded px-3 py-2" style="max-height: 300px; overflow-y: auto;">
|
||||||
@foreach ($kriterias as $kriteria)
|
@foreach ($kriterias as $kriteria)
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<h6 class="text-primary">{{ $kriteria->nama_kriteria }}</h6>
|
<h6 style="color: #14532d;">{{ $kriteria->nama_kriteria }}</h6>
|
||||||
|
|
||||||
@foreach ($kriteria->subKriteria as $sub)
|
@foreach ($kriteria->subKriteria as $sub)
|
||||||
|
@php
|
||||||
|
$isRadio = in_array($kriteria->nama_kriteria, ['Harga', 'Jenis Pakaian']);
|
||||||
|
$inputType = $isRadio ? 'radio' : 'checkbox';
|
||||||
|
$inputName = $isRadio ? 'sub_kriterias[' . $kriteria->id . ']' : 'sub_kriterias[]';
|
||||||
|
@endphp
|
||||||
<div class="form-check mb-2 ms-3">
|
<div class="form-check mb-2 ms-3">
|
||||||
<input class="form-check-input" type="checkbox" name="sub_kriterias[]"
|
<input
|
||||||
value="{{ $sub->id }}" id="sub_{{ $sub->id }}"
|
class="form-check-input"
|
||||||
|
type="{{ $inputType }}"
|
||||||
|
name="{{ $inputName }}"
|
||||||
|
value="{{ $sub->id }}"
|
||||||
|
id="sub_{{ $sub->id }}"
|
||||||
data-kriteria="{{ $kriteria->nama_kriteria }}"
|
data-kriteria="{{ $kriteria->nama_kriteria }}"
|
||||||
onclick="handleSingleChoice(this)">
|
>
|
||||||
<label class="form-check-label" for="sub_{{ $sub->id }}">
|
<label class="form-check-label" for="sub_{{ $sub->id }}">
|
||||||
<strong>{{ $sub->nama_sub }}</strong>
|
<strong>{{ $sub->nama_sub }}</strong>
|
||||||
@if ($kriteria->nama_kriteria === 'Harga')
|
@if ($kriteria->nama_kriteria === 'Harga')
|
||||||
|
@ -54,47 +65,45 @@
|
||||||
Min: Rp {{ number_format($sub->min_harga, 0, ',', '.') }},
|
Min: Rp {{ number_format($sub->min_harga, 0, ',', '.') }},
|
||||||
Max: Rp {{ number_format($sub->max_harga, 0, ',', '.') }}
|
Max: Rp {{ number_format($sub->max_harga, 0, ',', '.') }}
|
||||||
</div>
|
</div>
|
||||||
@else
|
|
||||||
<div class="text-muted small">Nilai: {{ $sub->nilai }}</div>
|
|
||||||
@endif
|
@endif
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
@endforeach
|
@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>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="d-flex justify-content-between pt-3">
|
<div class="d-flex justify-content-between pt-3">
|
||||||
<a href="{{ route('admin.pakaian.index') }}" class="btn btn-outline-secondary">
|
<a href="{{ route('admin.pakaian.index', ['page' => request('page')]) }}"
|
||||||
|
class="btn btn-outline-secondary">
|
||||||
<i class="bi bi-arrow-left"></i> Batal
|
<i class="bi bi-arrow-left"></i> Batal
|
||||||
</a>
|
</a>
|
||||||
<button type="submit" class="btn btn-success">
|
<button type="submit" class="btn text-white" style="background-color: #14532d;">
|
||||||
<i class="bi bi-check-circle"></i> Simpan
|
Simpan
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<style>
|
||||||
|
.form-check-input[type="checkbox"],
|
||||||
|
.form-check-input[type="radio"] {
|
||||||
|
accent-color: #14532d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-check-input:checked {
|
||||||
|
background-color: #14532d;
|
||||||
|
border-color: #14532d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-check-input:focus {
|
||||||
|
box-shadow: 0 0 0 0.25rem rgba(20, 83, 45, 0.25);
|
||||||
|
border-color: #14532d;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@endpush
|
||||||
|
|
|
@ -5,8 +5,7 @@
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="py-4">
|
<div class="py-4">
|
||||||
<div class="card shadow-sm border-0 mx-auto">
|
<div class="card shadow-sm border-0 mx-auto">
|
||||||
<div class="card-header bg-warning text-white d-flex align-items-center">
|
<div class="card-header text-white d-flex align-items-center" style="background-color: #14532d;">
|
||||||
<i class="bi bi-pencil-square me-2 fs-5"></i>
|
|
||||||
<h5 class="mb-0">Edit Pakaian</h5>
|
<h5 class="mb-0">Edit Pakaian</h5>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -14,6 +13,7 @@
|
||||||
<form action="{{ route('admin.pakaian.update', $pakaian->id) }}" method="POST" enctype="multipart/form-data">
|
<form action="{{ route('admin.pakaian.update', $pakaian->id) }}" method="POST" enctype="multipart/form-data">
|
||||||
@csrf
|
@csrf
|
||||||
@method('PUT')
|
@method('PUT')
|
||||||
|
<input type="hidden" name="page" value="{{ request()->input('page') }}">
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label fw-semibold">Nama Pakaian</label>
|
<label class="form-label fw-semibold">Nama Pakaian</label>
|
||||||
|
@ -32,8 +32,8 @@
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label fw-semibold">Gambar Lama</label><br>
|
<label class="form-label fw-semibold">Gambar Lama</label><br>
|
||||||
@if ($pakaian->img && Storage::disk('public')->exists($pakaian->img))
|
@if ($pakaian->img)
|
||||||
<img src="{{ asset('storage/' . $pakaian->img) }}" alt="Gambar Lama"
|
<img src="{{ asset($pakaian->img) }}" alt="Gambar Lama"
|
||||||
style="width: 100px; height: 100px; object-fit: cover;" class="border rounded">
|
style="width: 100px; height: 100px; object-fit: cover;" class="border rounded">
|
||||||
@else
|
@else
|
||||||
<p class="text-muted">Tidak ada gambar</p>
|
<p class="text-muted">Tidak ada gambar</p>
|
||||||
|
@ -45,19 +45,30 @@
|
||||||
<input type="file" name="img" class="form-control" accept="image/*">
|
<input type="file" name="img" class="form-control" accept="image/*">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="deskripsi" class="form-label fw-semibold">Deskripsi</label>
|
||||||
|
<textarea name="deskripsi" id="deskripsi" class="form-control" rows="4" placeholder="Masukkan deskripsi pakaian...">{{ old('deskripsi', $pakaian->deskripsi) }}</textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label fw-semibold">Pilih Sub Kriteria</label>
|
<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;">
|
<div class="border rounded px-3 py-2" style="max-height: 300px; overflow-y: auto;">
|
||||||
@foreach ($kriterias as $kriteria)
|
@foreach ($kriterias as $kriteria)
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<h6 class="text-primary">{{ $kriteria->nama_kriteria }}</h6>
|
<h6 style="color: #14532d;">{{ $kriteria->nama_kriteria }}</h6>
|
||||||
@foreach ($kriteria->subKriteria as $sub)
|
@foreach ($kriteria->subKriteria as $sub)
|
||||||
<div class="form-check mb-2 ms-3">
|
<div class="form-check mb-2 ms-3">
|
||||||
<input class="form-check-input" type="checkbox" name="sub_kriterias[]"
|
<input
|
||||||
value="{{ $sub->id }}" id="sub_{{ $sub->id }}"
|
class="form-check-input"
|
||||||
|
type="checkbox"
|
||||||
|
name="sub_kriterias[]"
|
||||||
|
value="{{ $sub->id }}"
|
||||||
|
id="sub_{{ $sub->id }}"
|
||||||
data-kriteria="{{ $kriteria->nama_kriteria }}"
|
data-kriteria="{{ $kriteria->nama_kriteria }}"
|
||||||
onclick="handleSingleChoice(this)"
|
onclick="handleSingleChoice(this)"
|
||||||
{{ in_array($sub->id, $pakaian->subKriterias->pluck('id')->toArray()) ? 'checked' : '' }}>
|
style="accent-color: #14532d;"
|
||||||
|
{{ in_array($sub->id, $pakaian->subKriterias->pluck('id')->toArray()) ? 'checked' : '' }}
|
||||||
|
>
|
||||||
<label class="form-check-label" for="sub_{{ $sub->id }}">
|
<label class="form-check-label" for="sub_{{ $sub->id }}">
|
||||||
<strong>{{ $sub->nama_sub }}</strong>
|
<strong>{{ $sub->nama_sub }}</strong>
|
||||||
@if ($kriteria->nama_kriteria === 'Harga')
|
@if ($kriteria->nama_kriteria === 'Harga')
|
||||||
|
@ -65,8 +76,6 @@
|
||||||
Min: Rp {{ number_format($sub->min_harga, 0, ',', '.') }},
|
Min: Rp {{ number_format($sub->min_harga, 0, ',', '.') }},
|
||||||
Max: Rp {{ number_format($sub->max_harga, 0, ',', '.') }}
|
Max: Rp {{ number_format($sub->max_harga, 0, ',', '.') }}
|
||||||
</div>
|
</div>
|
||||||
@else
|
|
||||||
<div class="text-muted small">Nilai: {{ $sub->nilai }}</div>
|
|
||||||
@endif
|
@endif
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
@ -93,11 +102,11 @@
|
||||||
@stack('scripts')
|
@stack('scripts')
|
||||||
|
|
||||||
<div class="d-flex justify-content-between pt-3">
|
<div class="d-flex justify-content-between pt-3">
|
||||||
<a href="{{ route('admin.pakaian.index') }}" class="btn btn-outline-secondary">
|
<a href="{{ route('admin.pakaian.index', ['page' => request('page')]) }}" class="btn btn-outline-secondary">
|
||||||
<i class="bi bi-arrow-left"></i> Batal
|
<i class="bi bi-arrow-left"></i> Batal
|
||||||
</a>
|
</a>
|
||||||
<button type="submit" class="btn btn-warning text-white">
|
<button type="submit" class="btn text-white" style="background-color: #14532d;">
|
||||||
<i class="bi bi-save"></i> Perbarui
|
Perbarui
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
@ -115,6 +115,7 @@
|
||||||
<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">Deskripsi</th>
|
||||||
<th scope="col">Aksi</th>
|
<th scope="col">Aksi</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -124,7 +125,7 @@
|
||||||
<td>{{ $loop->iteration }}</td>
|
<td>{{ $loop->iteration }}</td>
|
||||||
<td>
|
<td>
|
||||||
@if ($item->img)
|
@if ($item->img)
|
||||||
<img src="{{ asset('storage/' . $item->img) }}" alt="Gambar"
|
<img src="{{ asset($item->img) }}" alt="Gambar"
|
||||||
style="width: 100px; height: 100px;">
|
style="width: 100px; height: 100px;">
|
||||||
@else
|
@else
|
||||||
<span class="text-muted">Tidak ada gambar</span>
|
<span class="text-muted">Tidak ada gambar</span>
|
||||||
|
@ -132,11 +133,13 @@
|
||||||
</td>
|
</td>
|
||||||
<td>{{ $item->nama_pakaian }}</td>
|
<td>{{ $item->nama_pakaian }}</td>
|
||||||
<td>Rp{{ number_format($item->harga, 0, ',', '.') }}</td>
|
<td>Rp{{ number_format($item->harga, 0, ',', '.') }}</td>
|
||||||
|
<td>{{ $item->deskripsi ?? '-' }}</td>
|
||||||
<td>
|
<td>
|
||||||
<button type="button" class="btn btn-info btn-sm" data-bs-toggle="modal"
|
<!-- Tombol Info -->
|
||||||
data-bs-target="#infoModal{{ $item->id }}">
|
<button type="button" class="btn btn-info btn-sm" data-bs-toggle="modal" data-bs-target="#infoModal{{ $item->id }}">
|
||||||
<i class="bi bi-info-circle"></i>
|
<i class="bi bi-info-circle"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<a href="{{ route('admin.pakaian.edit', $item->id) }}" class="btn btn-warning btn-sm">
|
<a href="{{ route('admin.pakaian.edit', $item->id) }}" class="btn btn-warning btn-sm">
|
||||||
<i class="bi bi-pencil-square"></i>
|
<i class="bi bi-pencil-square"></i>
|
||||||
</a>
|
</a>
|
||||||
|
@ -178,7 +181,6 @@
|
||||||
<tr>
|
<tr>
|
||||||
<th>Kriteria</th>
|
<th>Kriteria</th>
|
||||||
<th>Subkriteria</th>
|
<th>Subkriteria</th>
|
||||||
<th>Nilai</th>
|
|
||||||
<th>Range Harga</th>
|
<th>Range Harga</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@ -187,7 +189,6 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ $sub->kriteria->nama_kriteria ?? '-' }}</td>
|
<td>{{ $sub->kriteria->nama_kriteria ?? '-' }}</td>
|
||||||
<td>{{ $sub->nama_sub }}</td>
|
<td>{{ $sub->nama_sub }}</td>
|
||||||
<td>{{ $sub->nilai }}</td>
|
|
||||||
<td>
|
<td>
|
||||||
@if ($sub->kriteria->nama_kriteria === 'Harga')
|
@if ($sub->kriteria->nama_kriteria === 'Harga')
|
||||||
Rp{{ number_format($sub->min_harga, 0, ',', '.') }}
|
Rp{{ number_format($sub->min_harga, 0, ',', '.') }}
|
||||||
|
@ -215,69 +216,6 @@
|
||||||
{{ $alternatif->appends(request()->query())->links('vendor.pagination.bootstrap-5') }}
|
{{ $alternatif->appends(request()->query())->links('vendor.pagination.bootstrap-5') }}
|
||||||
</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')
|
|
||||||
|
|
||||||
<div class="modal-body">
|
|
||||||
<!-- Nama Pakaian -->
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="edit_nama_pakaian{{ $item->id }}" class="form-label">Nama
|
|
||||||
Pakaian</label>
|
|
||||||
<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>
|
|
||||||
|
|
||||||
<!-- Upload Gambar Baru -->
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="edit_gambar{{ $item->id }}" class="form-label">Gambar Baru</label>
|
|
||||||
<input type="file" class="form-control" name="gambar"
|
|
||||||
id="edit_gambar{{ $item->id }}" accept="image/*">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Preview Gambar Lama -->
|
|
||||||
<div class="mb-3">
|
|
||||||
<label class="form-label">Gambar Lama:</label><br>
|
|
||||||
<img src="{{ asset('storage/' . $item->img) }}" alt="Gambar Lama"
|
|
||||||
style="width: 100px; height: 100px; object-fit: cover;" class="border rounded">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn" style="background-color: #90ee90; color: black;"
|
|
||||||
data-bs-dismiss="modal">Batal</button>
|
|
||||||
<button type="submit" class="btn"
|
|
||||||
style="background-color: #064E3B; color: white;">Simpan</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endforeach
|
|
||||||
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.label-spacing {
|
.label-spacing {
|
||||||
margin-right: 0.3rem;
|
margin-right: 0.3rem;
|
||||||
|
|
|
@ -1,104 +0,0 @@
|
||||||
@extends('admin.layouts.base')
|
|
||||||
|
|
||||||
@section('title', 'Tambah Data Penilaian')
|
|
||||||
|
|
||||||
@section('content')
|
|
||||||
<h1 class="h3 mb-4 text-grey-800">
|
|
||||||
<i class="bi bi-database"></i> Data Penilaian
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<div class="card shadow mb-4">
|
|
||||||
<div class="card-header bg-white d-flex justify-content-between align-items-center">
|
|
||||||
<span class="text-primary fw-bold">+ Tambah Data Penilaian</span>
|
|
||||||
<a href="{{ route('admin.penilaian.index') }}" class="btn btn-secondary">
|
|
||||||
<i class="bi bi-arrow-left"></i> Kembali
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
@if ($errors->any())
|
|
||||||
<div class="alert alert-danger">
|
|
||||||
<ul>
|
|
||||||
@foreach ($errors->all() as $error)
|
|
||||||
<li>{{ $error }}</li>
|
|
||||||
@endforeach
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<form action="{{ route('admin.penilaian.store') }}" method="POST">
|
|
||||||
@csrf
|
|
||||||
<div class="row">
|
|
||||||
<!-- Pilih Alternatif -->
|
|
||||||
<div class="col-md-6 mb-3">
|
|
||||||
<label for="alternatif_id" class="form-label">Nama Alternatif</label>
|
|
||||||
<select class="form-control" id="alternatif_id" name="alternatif_id" required>
|
|
||||||
<option value="" selected disabled>--Pilih Alternatif--</option>
|
|
||||||
@foreach ($alternatif as $alt)
|
|
||||||
<option value="{{ $alt->id }}">{{ $alt->nama_alternatif }}</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Pilih Jenis Pakaian -->
|
|
||||||
<div class="col-md-6 mb-3">
|
|
||||||
<label for="subkriteria_id" class="form-label">Jenis Pakaian</label> <!-- ✅ Perubahan Nama -->
|
|
||||||
<select class="form-control" id="subkriteria_id" name="subkriteria_id" required>
|
|
||||||
<option value="" selected disabled>--Pilih Jenis Pakaian--</option> <!-- ✅ Perubahan Nama -->
|
|
||||||
@foreach ($subkriteria->where('kriteria_id', 3) as $sub)
|
|
||||||
<option value="{{ $sub->id }}">{{ $sub->nama_subkriteria }}</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Pilih Kriteria -->
|
|
||||||
<div class="col-md-6 mb-3">
|
|
||||||
<label for="kriteria_id" class="form-label">Nama Kriteria</label>
|
|
||||||
<select class="form-control" id="kriteria_id" name="kriteria_id" required>
|
|
||||||
<option value="" selected disabled>--Pilih Kriteria--</option>
|
|
||||||
@foreach ($kriteria->where('id', 3) as $kri)
|
|
||||||
<option value="{{ $kri->id }}">{{ $kri->nama_kriteria }}</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Input Nilai C1 - C6 -->
|
|
||||||
<div class="col-md-6 mb-3">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-4 mb-2">
|
|
||||||
<label for="nilai_c1" class="form-label">C1</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="nilai_c1" name="nilai[C1]" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-4 mb-2">
|
|
||||||
<label for="nilai_c2" class="form-label">C2</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="nilai_c2" name="nilai[C2]" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-4 mb-2">
|
|
||||||
<label for="nilai_c3" class="form-label">C3</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="nilai_c3" name="nilai[C3]" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-4 mb-2">
|
|
||||||
<label for="nilai_c4" class="form-label">C4</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="nilai_c4" name="nilai[C4]" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-4 mb-2">
|
|
||||||
<label for="nilai_c5" class="form-label">C5</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="nilai_c5" name="nilai[C5]" required>
|
|
||||||
</div>
|
|
||||||
<div class="col-4 mb-2">
|
|
||||||
<label for="nilai_c6" class="form-label">C6</label>
|
|
||||||
<input type="number" step="0.01" class="form-control" id="nilai_c6" name="nilai[C6]" required>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button type="submit" class="btn btn-success me-3">
|
|
||||||
<i class="bi bi-save"></i> Simpan
|
|
||||||
</button>
|
|
||||||
<button type="reset" class="btn btn-info">
|
|
||||||
<i class="bi bi-arrow-clockwise"></i> Reset
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
@extends('admin.layouts.base')
|
||||||
|
|
||||||
|
@section('title', isset($penilaian) ? 'Edit Data Penilaian' : 'Tambah Data Penilaian')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<h1 class="h3 mb-4 text-grey-800">
|
||||||
|
<i class="bi bi-database"></i> Data Penilaian
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="card shadow mb-4">
|
||||||
|
<div class="card-header bg-white d-flex justify-content-between align-items-center">
|
||||||
|
<span class="fw-bold" style="color: #14532d;">
|
||||||
|
{{ isset($penilaian) ? 'Edit Data Penilaian' : '+ Tambah Data Penilaian' }}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<a href="{{ route('admin.penilaian.index', ['page' => request('page')]) }}" class="btn btn-secondary">
|
||||||
|
<i class="bi bi-arrow-left"></i> Kembali
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
@if ($errors->any())
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<ul class="mb-0">
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
|
<li>{{ $error }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<form
|
||||||
|
action="{{ isset($penilaian) ? route('admin.penilaian.update', $penilaian->id) : route('admin.penilaian.store') }}"
|
||||||
|
method="POST">
|
||||||
|
@csrf
|
||||||
|
@if (isset($penilaian))
|
||||||
|
@method('PUT')
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<!-- Pilih Pakaian -->
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label for="pakaian_id" class="form-label">Nama Pakaian</label>
|
||||||
|
<select class="form-control" id="pakaian_id" name="pakaian_id" required>
|
||||||
|
<option value="" disabled {{ old('pakaian_id', $penilaian->pakaian_id ?? '') == '' ? 'selected' : '' }}>-- Pilih Pakaian --</option>
|
||||||
|
@foreach ($pakaians as $pakaian)
|
||||||
|
<option value="{{ $pakaian->id }}"
|
||||||
|
{{ old('pakaian_id', $penilaian->pakaian_id ?? '') == $pakaian->id ? 'selected' : '' }}>
|
||||||
|
{{ $pakaian->nama_pakaian }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Pilih Sub Kriteria -->
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label for="sub_kriteria_id" class="form-label">Sub Kriteria</label>
|
||||||
|
<select class="form-control" id="sub_kriteria_id" name="sub_kriteria_id" required>
|
||||||
|
<option value="" disabled {{ old('sub_kriteria_id', $penilaian->sub_kriteria_id ?? '') == '' ? 'selected' : '' }}>-- Pilih Sub Kriteria --</option>
|
||||||
|
@foreach ($subkriterias as $sub)
|
||||||
|
<option value="{{ $sub->id }}"
|
||||||
|
{{ old('sub_kriteria_id', $penilaian->sub_kriteria_id ?? '') == $sub->id ? 'selected' : '' }}>
|
||||||
|
{{ $sub->nama_sub }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Nilai -->
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label for="nilai" class="form-label">Nilai</label>
|
||||||
|
<select class="form-control" name="nilai" id="nilai" required>
|
||||||
|
<option value="" disabled {{ old('nilai', $penilaian->nilai ?? '') === '' ? 'selected' : '' }}>-- Pilih Nilai --</option>
|
||||||
|
<option value="1" {{ old('nilai', $penilaian->nilai ?? '') == '1' ? 'selected' : '' }}>1 - Sangat Tidak Cocok</option>
|
||||||
|
<option value="2" {{ old('nilai', $penilaian->nilai ?? '') == '2' ? 'selected' : '' }}>2 - Tidak Cocok</option>
|
||||||
|
<option value="3" {{ old('nilai', $penilaian->nilai ?? '') == '3' ? 'selected' : '' }}>3 - Cukup Cocok</option>
|
||||||
|
<option value="4" {{ old('nilai', $penilaian->nilai ?? '') == '4' ? 'selected' : '' }}>4 - Cocok</option>
|
||||||
|
<option value="5" {{ old('nilai', $penilaian->nilai ?? '') == '5' ? 'selected' : '' }}>5 - Sangat Cocok</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-12 d-flex justify-content-between mt-3">
|
||||||
|
<div>
|
||||||
|
{{-- Tambahkan input hidden untuk simpan halaman --}}
|
||||||
|
<input type="hidden" name="page" value="{{ request('page') }}">
|
||||||
|
|
||||||
|
<button type="submit" class="btn" style="background-color: #064E3B; color: white;">
|
||||||
|
{{ isset($penilaian) ? 'Update' : 'Simpan' }}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="reset" class="btn" style="background-color: #90ee90; color: black;">
|
||||||
|
<i class="bi bi-arrow-clockwise me-1"></i> Reset
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
|
@ -1,197 +1,188 @@
|
||||||
@extends('admin.layouts.base')
|
@extends('admin.layouts.base')
|
||||||
|
|
||||||
@section('title', 'Penilaian Pakaian')
|
@section('title', 'Data Penilaian Pakaian')
|
||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
<style>
|
||||||
<h1 class="h3 text-grey-800">
|
.btn-hijau {
|
||||||
<i class="bi bi-box"></i> Penilaian Pakaian
|
background-color: #064E3B;
|
||||||
</h1>
|
color: white;
|
||||||
</div>
|
border: none;
|
||||||
|
padding: 6px 16px;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
<style>
|
.btn-hijau:hover {
|
||||||
.pagination {
|
background-color: #053B2D;
|
||||||
display: flex;
|
}
|
||||||
justify-content: flex-end;
|
|
||||||
align-items: center;
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination .page-item .page-link {
|
.modern-select {
|
||||||
font-size: 14px;
|
padding: 6px 12px;
|
||||||
padding: 6px 12px;
|
border-radius: 8px;
|
||||||
border-radius: 5px;
|
border: 1px solid #ccc;
|
||||||
border: none;
|
font-size: 14px;
|
||||||
color: white;
|
background-color: #fff;
|
||||||
background-color: #064E3B;
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
||||||
margin: 0 2px;
|
transition: border 0.2s ease-in-out;
|
||||||
transition: 0.3s ease-in-out;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.pagination .page-item.active .page-link {
|
.modern-select:focus {
|
||||||
background-color: #053B2D;
|
border-color: #0d6efd;
|
||||||
font-weight: bold;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pagination .page-item .page-link:hover {
|
.pagination {
|
||||||
background-color: #046C4E;
|
display: flex;
|
||||||
}
|
justify-content: flex-end;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
.pagination .page-item.disabled .page-link {
|
.pagination .page-item .page-link {
|
||||||
background-color: #e9ecef;
|
font-size: 14px;
|
||||||
color: #6c757d;
|
padding: 6px 12px;
|
||||||
cursor: not-allowed;
|
border-radius: 5px;
|
||||||
}
|
border: none;
|
||||||
|
color: white;
|
||||||
|
background-color: #064E3B;
|
||||||
|
margin: 0 2px;
|
||||||
|
transition: 0.3s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
.form-select-sm,
|
.pagination .page-item.active .page-link {
|
||||||
.form-control-sm {
|
background-color: #053B2D;
|
||||||
width: auto;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-input {
|
.pagination .page-item .page-link:hover {
|
||||||
width: 200px;
|
background-color: #046C4E;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-biru {
|
.pagination .page-item.disabled .page-link {
|
||||||
background-color: #007bff;
|
background-color: #e9ecef;
|
||||||
color: white;
|
color: #6c757d;
|
||||||
border: none;
|
cursor: not-allowed;
|
||||||
padding: 6px 16px;
|
}
|
||||||
border-radius: 4px;
|
</style>
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-biru:hover {
|
@if (session('success'))
|
||||||
background-color: #0069d9;
|
<div class="alert alert-success">{{ session('success') }}</div>
|
||||||
}
|
@endif
|
||||||
|
|
||||||
.search-box {
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||||
display: flex;
|
<h1 class="h3 text-grey-800">
|
||||||
gap: 8px;
|
<i class="bi bi-clipboard-data"></i> Data Penilaian Pakaian
|
||||||
align-items: center;
|
</h1>
|
||||||
}
|
<a href="{{ route('admin.penilaian.create') }}" class="btn btn-hijau">
|
||||||
|
<i class="bi bi-plus-circle"></i> Tambah Data
|
||||||
.modern-select {
|
</a>
|
||||||
padding: 6px 12px;
|
|
||||||
border-radius: 8px;
|
|
||||||
border: 1px solid #ccc;
|
|
||||||
font-size: 14px;
|
|
||||||
background-color: #fff;
|
|
||||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
|
||||||
transition: border 0.2s ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
.modern-select:focus {
|
|
||||||
border-color: #0d6efd;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<div class="card shadow mb-4">
|
|
||||||
<div class="card-header py-3 d-flex justify-content-between align-items-center">
|
|
||||||
<h6 class="m-0 font-weight-bold" style="color: #064E3B;">
|
|
||||||
<i class="bi bi-table"></i> Daftar Penilaian Pakaian
|
|
||||||
</h6>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="card shadow mb-4">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
{{-- GABUNGKAN FORM --}}
|
<form method="GET" class="d-flex justify-content-start align-items-center mb-3">
|
||||||
<form method="GET" action="{{ route('admin.penilaian.index') }}" class="d-flex justify-content-between align-items-center flex-wrap gap-3 mb-3">
|
<label for="perPage" class="me-3 mt-1">Tampilkan</label>
|
||||||
<div class="d-flex align-items-center gap-2 mb-2 mb-md-0">
|
|
||||||
<label for="entriesPerPage" class="mb-0 text-muted fw-semibold" style="margin-right: 12px;">Show</label>
|
|
||||||
<select name="entries" id="entriesPerPage" class="modern-select" onchange="this.form.submit()">
|
|
||||||
<option value="10" {{ request('entries') == 10 ? 'selected' : '' }}>10</option>
|
|
||||||
<option value="25" {{ request('entries') == 25 ? 'selected' : '' }}>25</option>
|
|
||||||
<option value="50" {{ request('entries') == 50 ? 'selected' : '' }}>50</option>
|
|
||||||
</select>
|
|
||||||
<span class="text-muted fw-semibold" style="margin-left: 12px;">entries</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="search-box">
|
<select name="perPage" id="perPage" class="modern-select mx-2" onchange="this.form.submit()">
|
||||||
<input type="text" name="search" value="{{ request('search') }}" placeholder="Cari nama pakaian..." class="form-control form-control-sm search-input">
|
@foreach([10, 50, 100, 500, 1000] as $size)
|
||||||
<button type="submit" class="btn btn-sm" style="background-color: #14532d; color: white;">Cari</button>
|
<option value="{{ $size }}" {{ request('perPage', 10) == $size ? 'selected' : '' }}>
|
||||||
</div>
|
{{ $size }}
|
||||||
|
</option>
|
||||||
|
@endforeach
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<label class="ms-2 mt-1">entri</label>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div class="table-responsive">
|
<form method="GET" class="d-flex justify-content-end mb-3">
|
||||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
{{-- Pertahankan nilai perPage --}}
|
||||||
<thead>
|
<input type="hidden" name="perPage" value="{{ request('perPage', 10) }}">
|
||||||
<tr>
|
|
||||||
<th class="text-center">No</th>
|
|
||||||
<th class="text-center">Nama Pakaian</th>
|
|
||||||
{{-- Header Kriteria --}}
|
|
||||||
@foreach ($kriterias as $kriteria)
|
|
||||||
<th class="text-center">{{ $kriteria->nama_kriteria }}</th>
|
|
||||||
@endforeach
|
|
||||||
<th class="text-center">Aksi</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@forelse ($pakaians as $item)
|
|
||||||
<tr>
|
|
||||||
<td class="text-center">{{ $loop->iteration }}</td>
|
|
||||||
<td class="text-center">{{ $item->nama_pakaian ?? '-' }}</td>
|
|
||||||
|
|
||||||
{{-- Subkriteria --}}
|
<input type="text" name="search" value="{{ request('search') }}" placeholder="Cari pakaian..."
|
||||||
@foreach ($kriterias as $kriteria)
|
class="form-control form-control-sm" style="width: 200px; margin-right: 8px;">
|
||||||
@php
|
<button type="submit" class="btn btn-success btn-sm" style="background-color: #14532d; border: none;">
|
||||||
$subKriterias = $item->subKriterias->where('kriteria_id', $kriteria->id);
|
Cari
|
||||||
$namaSubs = $subKriterias->pluck('nama_sub')->toArray();
|
</button>
|
||||||
@endphp
|
</form>
|
||||||
<td class="text-center">
|
|
||||||
@if (count($namaSubs))
|
|
||||||
@if (in_array($kriteria->nama_kriteria, ['Jenis Acara', 'Lokasi Acara', 'Cuaca Acara']))
|
|
||||||
<div class="d-flex flex-wrap justify-content-center gap-2">
|
|
||||||
@foreach ($namaSubs as $nama)
|
|
||||||
<span class="rounded-pill px-3 py-1 bg-light border text-dark small shadow-sm">
|
|
||||||
{{ $nama }}
|
|
||||||
</span>
|
|
||||||
@endforeach
|
|
||||||
</div>
|
|
||||||
@else
|
|
||||||
{{ $namaSubs[0] ?? '-' }}
|
|
||||||
@endif
|
|
||||||
@else
|
|
||||||
<span class="text-muted">-</span>
|
|
||||||
@endif
|
|
||||||
</td>
|
|
||||||
@endforeach
|
|
||||||
|
|
||||||
<td class="text-center">
|
<div class="table-responsive">
|
||||||
<a href="{{ route('admin.penilaian.edit', $item->id) }}" class="btn btn-warning btn-sm">
|
<table class="table table-bordered table-striped align-middle text-center">
|
||||||
<i class="bi bi-pencil"></i>
|
<thead class="table-light">
|
||||||
</a>
|
<tr>
|
||||||
</td>
|
<th>No</th>
|
||||||
</tr>
|
<th>Pakaian</th>
|
||||||
@empty
|
<th>Kriteria</th>
|
||||||
<tr>
|
<th>Sub Kriteria</th>
|
||||||
<td colspan="{{ 3 + $kriterias->count() }}" class="text-center">Belum ada data penilaian.</td>
|
<th>Nilai</th>
|
||||||
</tr>
|
<th>Aksi</th>
|
||||||
@endforelse
|
</tr>
|
||||||
</tbody>
|
</thead>
|
||||||
</table>
|
<tbody>
|
||||||
</div>
|
@forelse ($penilaians as $index => $penilaian)
|
||||||
|
<tr>
|
||||||
|
<td>{{ $loop->iteration }}</td>
|
||||||
|
<td>{{ $penilaian->pakaian->nama_pakaian ?? '-' }}</td>
|
||||||
|
<td>{{ $penilaian->subKriteria->kriteria->nama_kriteria ?? '-' }}</td>
|
||||||
|
<td>{{ $penilaian->subKriteria->nama_sub ?? '-' }}</td>
|
||||||
|
<td>{{ $penilaian->nilai ?? '-' }}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ route('admin.penilaian.edit', ['penilaian' => $penilaian->id, 'page' => request('page')]) }}"
|
||||||
|
class="btn btn-warning btn-sm">
|
||||||
|
<i class="bi bi-pencil-square"></i>
|
||||||
|
</a>
|
||||||
|
<form id="delete-form-{{ $penilaian->id }}" action="{{ route('admin.penilaian.destroy', $penilaian->id) }}" method="POST" style="display: inline;">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
<button type="button" class="btn btn-danger btn-sm delete-button" data-id="{{ $penilaian->id }}">
|
||||||
|
<i class="bi bi-trash"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@empty
|
||||||
|
<tr>
|
||||||
|
<td colspan="6" class="text-muted">Tidak ada data penilaian tersedia.</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="mt-3">
|
<div class="d-flex justify-content-end">
|
||||||
{{-- BAWA PARAMETER PAGINATION --}}
|
{{ $penilaians->appends(request()->query())->links('vendor.pagination.bootstrap-5') }}
|
||||||
{{ $pakaians->appends(['entries' => request('entries'), 'search' => request('search')])->links('pagination::bootstrap-4') }}
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- SweetAlert CDN -->
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const deleteButtons = document.querySelectorAll('.delete-button');
|
||||||
|
|
||||||
@if (session('success'))
|
deleteButtons.forEach(button => {
|
||||||
<script>
|
button.addEventListener('click', function () {
|
||||||
Swal.fire({
|
const id = this.getAttribute('data-id');
|
||||||
title: 'Berhasil!',
|
|
||||||
text: '{{ session('success') }}',
|
Swal.fire({
|
||||||
icon: 'success',
|
title: 'Yakin ingin menghapus data ini?',
|
||||||
timer: 3000,
|
text: "Data yang dihapus tidak bisa dikembalikan!",
|
||||||
showConfirmButton: false
|
icon: 'warning',
|
||||||
});
|
showCancelButton: true,
|
||||||
</script>
|
confirmButtonColor: '#d33',
|
||||||
@endif
|
cancelButtonColor: '#3085d6',
|
||||||
|
confirmButtonText: 'Ya, hapus!',
|
||||||
|
cancelButtonText: 'Batal'
|
||||||
|
}).then((result) => {
|
||||||
|
if (result.isConfirmed) {
|
||||||
|
document.getElementById(`delete-form-${id}`).submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,138 +0,0 @@
|
||||||
@extends('admin.layouts.base')
|
|
||||||
|
|
||||||
@section('title', 'Riwayat Perhitungan')
|
|
||||||
|
|
||||||
@section('content')
|
|
||||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
||||||
<h1 class="h3 text-grey-800">
|
|
||||||
<i class="bi bi-hourglass-split"></i> Riwayat Hasil Perhitungan
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card shadow mb-4">
|
|
||||||
<div class="card-header py-3 d-flex justify-content-between align-items-center">
|
|
||||||
<h6 class="m-0 font-weight-bold" style="color: #064E3B;">
|
|
||||||
<i class="bi bi-table"></i> Daftar Riwayat Hasil Perhitungan
|
|
||||||
</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card-body">
|
|
||||||
<form method="GET" class="mb-3 d-flex align-items-center">
|
|
||||||
<label for="per_page" class="me-2 mb-0">Tampilkan</label>
|
|
||||||
<select name="per_page" id="per_page" class="form-select form-select-sm w-auto me-2" onchange="this.form.submit()">
|
|
||||||
@foreach([5, 10, 20, 30] as $value)
|
|
||||||
<option value="{{ $value }}" {{ request('per_page', 5) == $value ? 'selected' : '' }}>
|
|
||||||
{{ $value }}
|
|
||||||
</option>
|
|
||||||
@endforeach
|
|
||||||
</select>
|
|
||||||
<span class="mb-0">entri</span>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<div class="table-responsive">
|
|
||||||
<table class="table table-bordered" width="100%" cellspacing="0">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="text-center">No</th>
|
|
||||||
<th class="text-center">Tanggal</th>
|
|
||||||
<th class="text-center">Aksi</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach ($riwayat as $index => $item)
|
|
||||||
<tr>
|
|
||||||
<td class="text-center">{{ $riwayat->firstItem() + $index }}</td>
|
|
||||||
<td class="text-center">{{ $item->created_at->setTimezone('Asia/Jakarta')->format('d M Y H:i') }}</td>
|
|
||||||
<td class="text-center">
|
|
||||||
<button class="btn btn-sm btn-success" data-bs-toggle="modal" data-bs-target="#modalRiwayat{{ $item->id }}">
|
|
||||||
<i class="bi bi-folder2-open"></i>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<form id="delete-form-{{ $item->id }}" action="{{ route('admin.riwayat.destroy', $item->id) }}" method="POST" class="d-inline">
|
|
||||||
@csrf
|
|
||||||
@method('DELETE')
|
|
||||||
<button type="button" class="btn btn-sm btn-danger" onclick="confirmDelete({{ $item->id }})">
|
|
||||||
<i class="bi bi-trash"></i>
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- Modal Detail -->
|
|
||||||
<div class="modal fade" id="modalRiwayat{{ $item->id }}" tabindex="-1" aria-labelledby="modalLabel{{ $item->id }}" aria-hidden="true">
|
|
||||||
<div class="modal-dialog modal-lg">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h5 class="modal-title" id="modalLabel{{ $item->id }}">Detail Riwayat</h5>
|
|
||||||
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<h6>Jawaban Kuisioner:</h6>
|
|
||||||
@php
|
|
||||||
$kuisioner = is_string($item->data_kuisioner) ? json_decode($item->data_kuisioner, true) : $item->data_kuisioner;
|
|
||||||
@endphp
|
|
||||||
<ul>
|
|
||||||
@if (is_array($kuisioner))
|
|
||||||
@foreach ($kuisioner as $key => $value)
|
|
||||||
<li><strong>{{ ucfirst($key) }}:</strong> {{ $value }}</li>
|
|
||||||
@endforeach
|
|
||||||
@else
|
|
||||||
<li>Data kuisioner tidak tersedia.</li>
|
|
||||||
@endif
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h6 class="mt-3">Hasil Rekomendasi:</h6>
|
|
||||||
@php
|
|
||||||
$rekomendasi = is_string($item->hasil_rekomendasi) ? json_decode($item->hasil_rekomendasi, true) : $item->hasil_rekomendasi;
|
|
||||||
@endphp
|
|
||||||
<ol>
|
|
||||||
@if (is_array($rekomendasi))
|
|
||||||
@foreach ($rekomendasi as $produk)
|
|
||||||
<li>
|
|
||||||
{{ is_array($produk) ? ($produk['nama'] ?? implode(', ', $produk)) : $produk }}
|
|
||||||
</li>
|
|
||||||
@endforeach
|
|
||||||
@else
|
|
||||||
<li>Tidak ada rekomendasi.</li>
|
|
||||||
@endif
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endforeach
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div class="mt-3">
|
|
||||||
{{ $riwayat->links('pagination::bootstrap-5') }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@push('scripts')
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
|
||||||
<script>
|
|
||||||
function confirmDelete(id) {
|
|
||||||
Swal.fire({
|
|
||||||
title: 'Yakin ingin menghapus?',
|
|
||||||
text: "Data riwayat akan dihapus permanen!",
|
|
||||||
icon: 'warning',
|
|
||||||
showCancelButton: true,
|
|
||||||
confirmButtonColor: '#d33',
|
|
||||||
cancelButtonColor: '#6c757d',
|
|
||||||
confirmButtonText: 'Ya, hapus!',
|
|
||||||
cancelButtonText: 'Batal'
|
|
||||||
}).then((result) => {
|
|
||||||
if (result.isConfirmed) {
|
|
||||||
document.getElementById('delete-form-' + id).submit();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@endpush
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@endsection
|
|
|
@ -31,7 +31,6 @@
|
||||||
<tr>
|
<tr>
|
||||||
<th class="text-center">No</th>
|
<th class="text-center">No</th>
|
||||||
<th class="text-center">Nama Subkriteria</th>
|
<th class="text-center">Nama Subkriteria</th>
|
||||||
<th class="text-center">Nilai</th>
|
|
||||||
<th class="text-center">Min Harga</th>
|
<th class="text-center">Min Harga</th>
|
||||||
<th class="text-center">Max Harga</th>
|
<th class="text-center">Max Harga</th>
|
||||||
<th class="text-center">Aksi</th>
|
<th class="text-center">Aksi</th>
|
||||||
|
@ -42,7 +41,6 @@
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-center">{{ $key + 1 }}</td>
|
<td class="text-center">{{ $key + 1 }}</td>
|
||||||
<td class="text-center">{{ $sub->nama_sub }}</td>
|
<td class="text-center">{{ $sub->nama_sub }}</td>
|
||||||
<td class="text-center">{{ $sub->nilai }}</td>
|
|
||||||
<td class="text-center">{{ $sub->min_harga ?? '-' }}</td>
|
<td class="text-center">{{ $sub->min_harga ?? '-' }}</td>
|
||||||
<td class="text-center">{{ $sub->max_harga ?? '-' }}</td>
|
<td class="text-center">{{ $sub->max_harga ?? '-' }}</td>
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
|
@ -104,11 +102,6 @@
|
||||||
<input type="text" class="form-control" id="nama_sub" name="nama_sub" required>
|
<input type="text" class="form-control" id="nama_sub" name="nama_sub" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="nilai" class="form-label">Nilai</label>
|
|
||||||
<input type="number" class="form-control" id="nilai" name="nilai" step="1" required>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="harga-fields" style="display: none;">
|
<div id="harga-fields" style="display: none;">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="min_harga" class="form-label">Min Harga</label>
|
<label for="min_harga" class="form-label">Min Harga</label>
|
||||||
|
@ -167,11 +160,6 @@
|
||||||
<input type="text" class="form-control" name="nama_sub" value="{{ $sub->nama_sub }}" required>
|
<input type="text" class="form-control" name="nama_sub" value="{{ $sub->nama_sub }}" required>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
|
||||||
<label for="nilai" class="form-label">Nilai</label>
|
|
||||||
<input type="number" class="form-control" name="nilai" value="{{ $sub->nilai }}" required>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="harga-fields" id="hargaFields{{ $sub->id }}" style="display: none;">
|
<div class="harga-fields" id="hargaFields{{ $sub->id }}" style="display: none;">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="min_harga" class="form-label">Min Harga</label>
|
<label for="min_harga" class="form-label">Min Harga</label>
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
@php use Illuminate\Support\Str; @endphp
|
||||||
|
|
||||||
<section class="py-3 bg-white" id="daftarpakaian">
|
<section class="py-3 bg-white" id="daftarpakaian">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row justify-content-center text-center">
|
<div class="row justify-content-center text-center">
|
||||||
|
@ -9,803 +11,115 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tab Navigasi -->
|
@php
|
||||||
<div class="row justify-content-center mb-4">
|
$kategoriList = ['Dress', 'Blouse', 'Cardigan', 'Rok', 'Celana'];
|
||||||
<div class="col-auto">
|
@endphp
|
||||||
<ul class="nav nav-pills gap-2 justify-content-center" id="pakaianTab" role="tablist">
|
|
||||||
<li class="nav-item" role="presentation">
|
{{-- Tombol filter --}}
|
||||||
<button class="nav-link active" id="dress-tab" data-bs-toggle="tab" data-bs-target="#dress" type="button" role="tab">Dress</button>
|
<div class="d-flex justify-content-center mb-4 flex-wrap gap-2">
|
||||||
</li>
|
<button class="btn btn-outline-primary btn-sm filter-btn active" data-kategori="all">Semua</button>
|
||||||
<li class="nav-item" role="presentation">
|
@foreach ($kategoriList as $kategori)
|
||||||
<button class="nav-link" id="blouse-tab" data-bs-toggle="tab" data-bs-target="#blouse" type="button" role="tab">Blouse</button>
|
<button class="btn btn-outline-secondary btn-sm filter-btn" data-kategori="{{ strtolower($kategori) }}">{{ $kategori }}</button>
|
||||||
</li>
|
@endforeach
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<button class="nav-link" id="cardigan-tab" data-bs-toggle="tab" data-bs-target="#cardigan" type="button" role="tab">Cardigan</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<button class="nav-link" id="rok-tab" data-bs-toggle="tab" data-bs-target="#rok" type="button" role="tab">Rok</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item" role="presentation">
|
|
||||||
<button class="nav-link" id="celana-tab" data-bs-toggle="tab" data-bs-target="#celana" type="button" role="tab">Celana</button>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Isi Tab -->
|
{{-- Daftar pakaian --}}
|
||||||
<div class="tab-content" id="pakaianTabContent">
|
<div class="row g-2" id="pakaian-list">
|
||||||
|
@foreach ($pakaians as $pakaian)
|
||||||
<!-- Dress (active tab) -->
|
@php
|
||||||
<div class="tab-pane fade show active" id="dress" role="tabpanel" aria-labelledby="dress-tab">
|
$kategoriSub = $pakaian->subKriterias->firstWhere('kriteria_id', 3);
|
||||||
<div class="container">
|
$kategori = $kategoriSub ? Str::lower($kategoriSub->nama_sub) : null;
|
||||||
<div class="row g-3 gy-4 justify-content-center">
|
@endphp
|
||||||
|
@if ($kategori)
|
||||||
|
<div class="col-6 col-sm-4 col-md-3 col-lg-2 pakaian-item kategori-{{ $kategori }}">
|
||||||
|
<div class="card h-100 border-0 shadow-sm"
|
||||||
|
data-nama="{{ $pakaian->nama_pakaian }}"
|
||||||
|
data-img="{{ $pakaian->img ? asset($pakaian->img) : '' }}"
|
||||||
|
data-harga="Rp{{ number_format($pakaian->harga, 0, ',', '.') }}"
|
||||||
|
data-deskripsi="{{ $pakaian->deskripsi }}"
|
||||||
|
onclick="showDetailModal(this)">
|
||||||
|
|
||||||
<!-- Card Dress 1 -->
|
@if ($pakaian->img && file_exists(public_path($pakaian->img)))
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
<img src="{{ asset($pakaian->img) }}" class="card-img-top" alt="{{ $pakaian->nama_pakaian }}" style="height: 150px; object-fit: cover;">
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
@else
|
||||||
<div class="overflow-hidden rounded-top">
|
<div class="bg-light d-flex align-items-center justify-content-center" style="height:150px;">
|
||||||
<img src="assets/img/annelisedress.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 1">
|
<span class="text-muted small">Gambar tidak tersedia</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body p-2">
|
@endif
|
||||||
<h6 class="card-title mb-1">Annelise Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">
|
|
||||||
Dress cantik dengan potongan elegan, cocok untuk acara semi-formal atau hangout santai.
|
|
||||||
</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 185.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 2 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/daisysilkdress.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 2">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
<div class="card-body p-2">
|
||||||
<h6 class="card-title mb-1">Daisy Silk Dress</h6>
|
<p class="card-title mb-1 fw-semibold small" style="font-size: 0.85rem;">
|
||||||
<p class="text-muted small mb-1">Dress berbahan silk lembut, memberikan kesan mewah dan anggun saat dipakai.</p>
|
{{ Str::limit($pakaian->nama_pakaian, 35) }}
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 189.000</p>
|
</p>
|
||||||
</div>
|
<p class="fw-bold text-danger mb-0" style="font-size: 0.9rem;">
|
||||||
</div>
|
Rp{{ number_format($pakaian->harga, 0, ',', '.') }}
|
||||||
</div>
|
</p>
|
||||||
|
@if ($pakaian->deskripsi)
|
||||||
<!-- Card Dress 3 -->
|
<p class="text-muted mb-0" style="font-size: 0.75rem;">
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
{{ Str::limit($pakaian->deskripsi, 50) }}
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
</p>
|
||||||
<div class="overflow-hidden rounded-top">
|
@endif
|
||||||
<img src="assets/img/edeliadress.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 3">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Edelia Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">Dress feminin dengan detail renda, cocok untuk tampilan anggun dan stylish.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 269.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 4 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/embroiderytunik.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 4">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Embroidery Tunik</h6>
|
|
||||||
<p class="text-muted small mb-1">Tunik dengan bordir cantik yang memberikan nuansa etnik dan elegan.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 249.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 5 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/shimmerraya.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 5">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Shimmer Raya Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">Dress dengan efek shimmer elegan, ideal untuk momen spesial seperti lebaran atau pesta malam.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 189.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 6 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/elenadress.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 6">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Elena Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">Gaya simpel nan chic, cocok untuk daily wear maupun acara santai.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 189.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 7 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/asterdress.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 7">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Aster Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">Dress floral dengan desain flowy, memberikan kesan segar dan feminin.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 179.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 8 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/orchidflowy.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 8">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Orchid Flowy Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">Dress longgar dengan potongan flowy, cocok untuk gaya kasual elegan.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 179.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 9 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/adelinedress.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 9">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Adeline Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">Dress klasik dengan siluet ramping yang memberi kesan elegan dan dewasa.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 189.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Dress 10 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card border-0 shadow-sm h-100 card-hover">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/daphnedress.jpg" class="card-img-top img-fluid hover-zoom" alt="Dress 10">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Daphne Dress</h6>
|
|
||||||
<p class="text-muted small mb-1">Dress glamor dengan detail elegan, cocok untuk acara formal atau pesta malam.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 269.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Blouse -->
|
|
||||||
<div class="tab-pane fade" id="blouse" role="tabpanel" aria-labelledby="blouse-tab">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row g-3 gy-4 justify-content-center">
|
|
||||||
|
|
||||||
<!-- Card Blouse 1 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/arianablouse.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 1">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Ariana Blouse</h6>
|
|
||||||
<p class="small mb-1">Blouse elegan dengan sentuhan feminin dan detail ruffle yang anggun.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 159.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 2 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/charlotteblouse.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 2">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Charlotte Blouse</h6>
|
|
||||||
<p class="small mb-1">Desain simple namun elegan dengan bahan adem dan nyaman dikenakan seharian.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 139.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 3 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/keirablouse.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 3">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Keira Blouse</h6>
|
|
||||||
<p class="small mb-1">Blouse klasik dengan detail lipit dan bahan flowy yang elegan.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 125.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 4 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/aurelieblouse.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 4">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Aurelie Blouse</h6>
|
|
||||||
<p class="small mb-1">Tampil chic dengan blouse berpotongan loose dan motif lembut yang manis.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 120.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 5 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/elynalace.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 5">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Elyna Lace Blouse</h6>
|
|
||||||
<p class="small mb-1">Blouse dengan aksen renda klasik yang memberikan kesan feminin dan anggun.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 129.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 6 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/louisablouse.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 6">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Louisa Blouse</h6>
|
|
||||||
<p class="small mb-1">Model simpel dengan warna solid yang cocok dipadukan dengan berbagai bawahan.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 109.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 7 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/azuraetnic.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 7">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Azura Etnic Blouse</h6>
|
|
||||||
<p class="small mb-1">Sentuhan etnik yang unik dengan kombinasi motif dan warna menarik.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 125.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 8 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/freyaetnic.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 8">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Freya Etnic Blouse</h6>
|
|
||||||
<p class="small mb-1">Blouse etnik modern dengan bahan ringan dan nyaman untuk sehari-hari.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 139.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 9 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/celiablouse.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 9">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Celia Blouse</h6>
|
|
||||||
<p class="small mb-1">Blouse casual yang cocok dipakai ke kantor ataupun hangout santai.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 129.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Card Blouse 10 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/elaineblouse.jpg" class="card-img-top img-fluid hover-zoom" alt="Blouse 10">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Elaine Blouse</h6>
|
|
||||||
<p class="small mb-1">Tampil stylish dan tetap sopan dengan blouse berkerah lembut dan potongan flowy.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 128.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan -->
|
|
||||||
<div class="tab-pane fade" id="cardigan" role="tabpanel" aria-labelledby="cardigan-tab">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row g-3 gy-4 justify-content-center">
|
|
||||||
|
|
||||||
<!-- Cardigan 1 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/brielleribbon.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 1">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Brielle Ribbon Cardigan</h6>
|
|
||||||
<p class="small mb-1">Cardigan manis dengan detail pita untuk tampilan girly yang chic.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 130.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 2 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/rubycardigan.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 2">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Ruby Cardigan</h6>
|
|
||||||
<p class="small mb-1">Warna merah yang bold dengan desain simple dan elegan.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 139.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 3 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/roseknit.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 3">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Rose Knit Cardigan</h6>
|
|
||||||
<p class="small mb-1">Cardigan rajut lembut yang cocok untuk suasana santai dan hangat.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 120.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 4 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/camelliacardigan.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 4">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Camellia Cardigan</h6>
|
|
||||||
<p class="small mb-1">Gaya feminin dengan potongan loose dan aksen floral cantik.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 169.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 5 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/cholecardigan.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 5">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Chole Cardigan</h6>
|
|
||||||
<p class="small mb-1">Tampil stylish dan cozy dengan desain minimalis nan modis.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 189.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 6 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/jadestripes.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 6">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Jade Stripes Cardigan</h6>
|
|
||||||
<p class="small mb-1">Cardigan bergaris klasik dengan kesan kasual yang kekinian.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 139.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 7 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/giselleknit.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 7">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Giselle Knit Top</h6>
|
|
||||||
<p class="small mb-1">Blouse rajut modis yang cocok untuk layer outfit harian.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 149.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 8 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/stripesfur.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 8">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Stripes Fur Cardigan</h6>
|
|
||||||
<p class="small mb-1">Cardigan berbulu halus dengan motif garis untuk tampilan cozy.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 149.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 9 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/polostripes.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 9">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Polo Stripes Knit</h6>
|
|
||||||
<p class="small mb-1">Cardigan dengan kerah polo dan motif stripes yang sporty casual.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 169.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Cardigan 10 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/ribbonfur.jpg" class="card-img-top img-fluid hover-zoom" alt="Cardigan 10">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Ribbon Fur Cardigan</h6>
|
|
||||||
<p class="small mb-1">Sentuhan bulu halus dan aksen pita menjadikan cardigan ini elegan dan unik.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 169.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
@endif
|
||||||
</div>
|
@endforeach
|
||||||
|
|
||||||
<!-- Rok -->
|
|
||||||
<div class="tab-pane fade" id="rok" role="tabpanel" aria-labelledby="rok-tab">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row g-3 gy-4 justify-content-center">
|
|
||||||
|
|
||||||
<!-- Rok 1 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/knitskirt.jpg" class="card-img-top img-fluid hover-zoom" alt="Knit Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Knit Skirt</h6>
|
|
||||||
<p class="small mb-1">Rok rajut lembut dan nyaman untuk gaya kasual harian.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 149.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 2 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/kireiflare.jpg" class="card-img-top img-fluid hover-zoom" alt="Kirei Flare Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Kirei Flare Skirt</h6>
|
|
||||||
<p class="small mb-1">Rok flare dengan potongan anggun dan flowy, cocok untuk hangout.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 169.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 3 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/mermaidjeans.jpg" class="card-img-top img-fluid hover-zoom" alt="Mermaid Jeans Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Mermaid Jeans Skirt</h6>
|
|
||||||
<p class="small mb-1">Rok denim model duyung yang feminin dan trendi.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 169.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 4 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/vionamermaid.jpg" class="card-img-top img-fluid hover-zoom" alt="Viona Mermaid Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Viona Mermaid Skirt</h6>
|
|
||||||
<p class="small mb-1">Rok potongan duyung dengan bahan ringan dan jatuh.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 139.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 5 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/floralskirt.jpg" class="card-img-top img-fluid hover-zoom" alt="Floral Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Floral Skirt</h6>
|
|
||||||
<p class="small mb-1">Motif bunga manis untuk tampilan feminin dan segar.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 109.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 6 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/fleurskirt.jpg" class="card-img-top img-fluid hover-zoom" alt="Fleur Embroidery Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Fleur Embroidery Skirt</h6>
|
|
||||||
<p class="small mb-1">Detail bordir bunga elegan dan classy.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 139.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 7 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/belleskirt.jpg" class="card-img-top img-fluid hover-zoom" alt="Belle Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Belle Skirt</h6>
|
|
||||||
<p class="small mb-1">Desain simpel dan manis, mudah dipadu-padankan.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 105.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 8 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/mermaidskirt.jpg" class="card-img-top img-fluid hover-zoom" alt="Mermaid Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Mermaid Skirt</h6>
|
|
||||||
<p class="small mb-1">Potongan mermaid yang mempercantik siluet tubuh.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 120.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 9 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/silkruffle.jpg" class="card-img-top img-fluid hover-zoom" alt="Silk Ruffle Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Silk Ruffle Skirt</h6>
|
|
||||||
<p class="small mb-1">Rok sutra dengan detail ruffle yang lembut dan elegan.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 120.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Rok 10 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/arabellaruffle.jpg" class="card-img-top img-fluid hover-zoom" alt="Arabella Ruffle Skirt">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Arabella Ruffle Skirt</h6>
|
|
||||||
<p class="small mb-1">Rok detail ruffle manis dengan potongan feminin.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 116.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana -->
|
|
||||||
<div class="tab-pane fade" id="celana" role="tabpanel" aria-labelledby="celana-tab">
|
|
||||||
<div class="container">
|
|
||||||
<div class="row g-3 gy-4 justify-content-center">
|
|
||||||
|
|
||||||
<!-- Celana 1 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/cutbrayjeans.jpg" class="card-img-top img-fluid hover-zoom" alt="Cutbray Jeans Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Cutbray Jeans Pants</h6>
|
|
||||||
<p class="small mb-1">Celana jeans model cutbray yang unik dan stylish.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 159.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 2 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/anneflare.jpg" class="card-img-top img-fluid hover-zoom" alt="Anne Flare Jeans">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Anne Flare Jeans</h6>
|
|
||||||
<p class="small mb-1">Jeans flare yang mempertegas siluet kaki, cocok untuk OOTD.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 169.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 3 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/cutbraypants.jpg" class="card-img-top img-fluid hover-zoom" alt="Cutbray Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Cutbray Pants</h6>
|
|
||||||
<p class="small mb-1">Potongan klasik cutbray untuk tampilan retro modern.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 109.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 4 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/laurahighwaist.jpg" class="card-img-top img-fluid hover-zoom" alt="Laura Highwaist Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Laura Highwaist Pants</h6>
|
|
||||||
<p class="small mb-1">Model highwaist elegan yang cocok untuk kerja maupun santai.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 149.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 5 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/flowypants.jpg" class="card-img-top img-fluid hover-zoom" alt="Flowy Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Flowy Pants</h6>
|
|
||||||
<p class="small mb-1">Celana longgar dengan bahan ringan dan jatuh.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 109.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 6 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/casualpants.jpg" class="card-img-top img-fluid hover-zoom" alt="Casual Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Casual Pants</h6>
|
|
||||||
<p class="small mb-1">Gaya kasual yang fleksibel untuk sehari-hari.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 109.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 7 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/celinepants.jpg" class="card-img-top img-fluid hover-zoom" alt="Celine Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Celine Pants</h6>
|
|
||||||
<p class="small mb-1">Celana dengan potongan rapi dan bahan adem.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 149.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 8 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/pleatedpants.jpg" class="card-img-top img-fluid hover-zoom" alt="Pleated Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Pleated Pants</h6>
|
|
||||||
<p class="small mb-1">Detail pleats manis yang memberi kesan chic.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 99.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 9 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/irispants.jpg" class="card-img-top img-fluid hover-zoom" alt="Iris Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Iris Pants</h6>
|
|
||||||
<p class="small mb-1">Tampilan santai namun tetap fashionable.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 120.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Celana 10 -->
|
|
||||||
<div class="col-6 col-sm-4 col-md-2">
|
|
||||||
<div class="card card-hover border-0 shadow-sm h-100">
|
|
||||||
<div class="overflow-hidden rounded-top">
|
|
||||||
<img src="assets/img/scubapants.jpg" class="card-img-top img-fluid hover-zoom" alt="Scuba Pants">
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2">
|
|
||||||
<h6 class="card-title mb-1">Scuba Pants</h6>
|
|
||||||
<p class="small mb-1">Celana scuba elastis dan nyaman untuk aktivitas harian.</p>
|
|
||||||
<p class="fw-semibold text-primary mb-0">Rp. 99.000</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tambahkan tab-pane lainnya seperti rok, celana, dll dengan class "fade" tanpa "show active" -->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<style>
|
{{-- Modal Detail --}}
|
||||||
.nav-pills .nav-link.active {
|
<div class="modal fade" id="detailModal" tabindex="-1" aria-labelledby="detailModalLabel" aria-hidden="true">
|
||||||
background-color: #4caf50 !important; /* Bootstrap 'success' green */
|
<div class="modal-dialog modal-dialog-centered modal-lg">
|
||||||
color: #fff !important;
|
<div class="modal-content">
|
||||||
}
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title fw-bold" id="detailModalLabel">Detail Pakaian</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Tutup"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="row g-3">
|
||||||
|
<div class="col-md-5">
|
||||||
|
<img id="modal-img" src="" class="img-fluid rounded shadow" alt="Gambar Pakaian">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-7">
|
||||||
|
<h5 id="modal-nama" class="fw-semibold mb-2"></h5>
|
||||||
|
<p id="modal-harga" class="text-danger fw-bold fs-5 mb-2"></p>
|
||||||
|
<p id="modal-deskripsi" class="text-muted"></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
.nav-pills .nav-link {
|
{{-- Script filter kategori --}}
|
||||||
color: #000; /* Warna teks normal */
|
<script>
|
||||||
}
|
document.querySelectorAll('.filter-btn').forEach(button => {
|
||||||
|
button.addEventListener('click', () => {
|
||||||
|
const kategori = button.getAttribute('data-kategori');
|
||||||
|
document.querySelectorAll('.filter-btn').forEach(btn => btn.classList.remove('active'));
|
||||||
|
button.classList.add('active');
|
||||||
|
document.querySelectorAll('.pakaian-item').forEach(item => item.style.display = 'none');
|
||||||
|
if (kategori === 'all') {
|
||||||
|
document.querySelectorAll('.pakaian-item').forEach(item => item.style.display = 'block');
|
||||||
|
} else {
|
||||||
|
document.querySelectorAll(`.kategori-${kategori}`).forEach(item => item.style.display = 'block');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
.card-hover {
|
function showDetailModal(card) {
|
||||||
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
const nama = card.getAttribute('data-nama');
|
||||||
border-radius: 1rem;
|
const img = card.getAttribute('data-img');
|
||||||
overflow: hidden;
|
const harga = card.getAttribute('data-harga');
|
||||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
const deskripsi = card.getAttribute('data-deskripsi') || 'Tidak ada deskripsi.';
|
||||||
}
|
|
||||||
.card-hover:hover {
|
document.getElementById('modal-nama').textContent = nama;
|
||||||
transform: translateY(-5px) scale(1.02);
|
document.getElementById('modal-img').src = img || '';
|
||||||
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
|
document.getElementById('modal-harga').textContent = harga;
|
||||||
}
|
document.getElementById('modal-deskripsi').textContent = deskripsi;
|
||||||
.hover-zoom {
|
|
||||||
transition: transform 0.4s ease;
|
const modal = new bootstrap.Modal(document.getElementById('detailModal'));
|
||||||
}
|
modal.show();
|
||||||
.card-hover:hover .hover-zoom {
|
}
|
||||||
transform: scale(1.1);
|
</script>
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,69 +1,447 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="id">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>Hasil Rekomendasi</title>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<title>Hasil Rekomendasi Pakaian</title>
|
||||||
<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet">
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
||||||
<style>
|
<style>
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background-color: #f8f9fa;
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||||
|
background: linear-gradient(135deg, #1a4d3a 0%, #0d2818 100%);
|
||||||
|
min-height: 100vh;
|
||||||
|
padding: 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 40px;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header h1 {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header p {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-button {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
background: rgba(255,255,255,0.2);
|
||||||
|
color: white;
|
||||||
|
text-decoration: none;
|
||||||
|
padding: 12px 24px;
|
||||||
|
border-radius: 25px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border: 1px solid rgba(255,255,255,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.back-button:hover {
|
||||||
|
background: rgba(255,255,255,0.3);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 8px 25px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.results-summary {
|
||||||
|
background: rgba(255,255,255,0.95);
|
||||||
|
border-radius: 15px;
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
box-shadow: 0 10px 30px rgba(0,0,0,0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-text {
|
||||||
|
color: #4a5568;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.summary-text i {
|
||||||
|
color: #2d5a3d;
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
background: linear-gradient(135deg, #2d5a3d 0%, #1a4d3a 100%);
|
||||||
|
color: white;
|
||||||
|
padding: 30px;
|
||||||
|
border-radius: 15px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
|
||||||
|
margin: 40px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert i {
|
||||||
|
font-size: 3rem;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
|
||||||
|
gap: 25px;
|
||||||
|
margin-top: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card {
|
.card {
|
||||||
border-radius: 1rem;
|
background: white;
|
||||||
|
border-radius: 20px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
box-shadow: 0 15px 35px rgba(0,0,0,0.1);
|
||||||
|
transition: all 0.3s ease;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 4px;
|
||||||
|
background: linear-gradient(90deg, #2d5a3d, #1a4d3a);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card:hover {
|
||||||
|
transform: translateY(-10px);
|
||||||
|
box-shadow: 0 25px 50px rgba(0,0,0,0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-rank {
|
||||||
|
position: absolute;
|
||||||
|
top: 15px;
|
||||||
|
left: 15px;
|
||||||
|
background: linear-gradient(135deg, #2d5a3d, #1a4d3a);
|
||||||
|
color: white;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
z-index: 2;
|
||||||
|
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-img {
|
.card-img {
|
||||||
|
width: 100%;
|
||||||
|
height: 250px;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
height: 100%;
|
transition: transform 0.3s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-body h5 {
|
.card:hover .card-img {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-body {
|
||||||
|
padding: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-title {
|
||||||
|
font-size: 1.4rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #2d3748;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-info {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 12px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
color: #4a5568;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.info-item i {
|
||||||
|
width: 20px;
|
||||||
|
color: #2d5a3d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.price {
|
||||||
|
font-size: 1.3rem;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #2d5a3d;
|
||||||
|
}
|
||||||
|
|
||||||
|
.score-container {
|
||||||
|
background: linear-gradient(135deg, #2d5a3d 0%, #1a4d3a 100%);
|
||||||
|
color: white;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 12px;
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.score-label {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
opacity: 0.9;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.score-value {
|
||||||
|
font-size: 1.8rem;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.score-stars {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.star {
|
||||||
|
color: #ffd700;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
margin: 0 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.star.empty {
|
||||||
|
color: rgba(255,255,255,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.clothing-type {
|
||||||
|
background: #e8f5e8;
|
||||||
|
color: #2d5a3d;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 0.85rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card-body p {
|
.recommendation-badge {
|
||||||
margin-bottom: 0.5rem;
|
position: absolute;
|
||||||
|
top: 15px;
|
||||||
|
right: 15px;
|
||||||
|
background: #2d5a3d;
|
||||||
|
color: white;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-radius: 15px;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-choice {
|
||||||
|
background: linear-gradient(135deg, #2d5a3d 0%, #0d2818 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header h1 {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.card-rank {
|
||||||
|
width: 35px;
|
||||||
|
height: 35px;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fade-in {
|
||||||
|
animation: fadeInUp 0.6s ease forwards;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeInUp {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(30px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<a href="{{ url()->previous() }}" class="back-button">
|
||||||
|
<i class="fas fa-arrow-left"></i>
|
||||||
|
Kembali ke Pencarian
|
||||||
|
</a>
|
||||||
|
|
||||||
<div class="container py-5">
|
<div class="header">
|
||||||
<h2 class="text-center mb-4 fw-bold">Hasil Rekomendasi Pakaian</h2>
|
<h1>Top 3 Rekomendasi Pakaian</h1>
|
||||||
|
<p>Temukan 3 pakaian terbaik yang sesuai dengan preferensi Anda</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
@if ($rekomendasi->isEmpty())
|
@if (isset($message) || (isset($recommendations) && $recommendations->isEmpty()) || (isset($rekomendasi) && $rekomendasi->isEmpty()))
|
||||||
<div class="alert alert-warning text-center">
|
<div class="alert">
|
||||||
Tidak ada pakaian yang cocok dengan preferensimu.
|
<i class="fas fa-search"></i>
|
||||||
|
<div>
|
||||||
|
{{ $message ?? 'Tidak ada pakaian yang cocok dengan preferensi Anda.' }}
|
||||||
|
</div>
|
||||||
|
<p style="margin-top: 15px; font-size: 1rem; opacity: 0.9;">
|
||||||
|
Coba ubah kriteria pencarian atau pilih opsi yang lebih fleksibel.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@else
|
@else
|
||||||
@foreach ($rekomendasi as $item)
|
@php
|
||||||
<div class="card mb-4 shadow-sm">
|
// Support both variable names for backward compatibility
|
||||||
<div class="row g-0">
|
$results = $recommendations ?? $rekomendasi ?? collect([]);
|
||||||
<div class="col-md-4">
|
// Limit to top 3 recommendations
|
||||||
<img src="{{ asset('storage/' . $item['pakaian']->img) }}" class="img-fluid card-img"
|
$top3Results = $results->take(3);
|
||||||
alt="Gambar {{ $item['pakaian']->nama_pakaian }}">
|
@endphp
|
||||||
</div>
|
|
||||||
<div class="col-md-8">
|
<div class="results-summary">
|
||||||
<div class="card-body">
|
<div class="summary-text">
|
||||||
<h5 class="card-title">{{ $item['pakaian']->nama_pakaian }}</h5>
|
<i class="fas fa-check-circle"></i>
|
||||||
<p class="card-text">Harga: <strong>Rp
|
Menampilkan <strong>3 pakaian terbaik</strong> dari {{ $results->count() }} hasil yang ditemukan
|
||||||
{{ number_format($item['pakaian']->harga, 0, ',', '.') }}</strong></p>
|
</div>
|
||||||
<p class="card-text">Skor Kecocokan: <span
|
</div>
|
||||||
class="badge bg-primary">{{ number_format($item['score'], 3) }}</span></p>
|
|
||||||
|
<div class="grid">
|
||||||
|
@foreach ($top3Results as $index => $item)
|
||||||
|
@php
|
||||||
|
$rank = $index + 1;
|
||||||
|
$clothing = $item['pakaian'];
|
||||||
|
$score = $item['score'];
|
||||||
|
$clothingType = $item['jenis_pakaian'] ?? 'Lainnya';
|
||||||
|
|
||||||
|
// Calculate star rating based on score (0-1 scale to 0-5 stars)
|
||||||
|
$maxScore = $results->max('score');
|
||||||
|
$normalizedScore = $maxScore > 0 ? ($score / $maxScore) * 5 : 0;
|
||||||
|
$fullStars = floor($normalizedScore);
|
||||||
|
$hasHalfStar = ($normalizedScore - $fullStars) >= 0.5;
|
||||||
|
@endphp
|
||||||
|
|
||||||
|
<div class="card fade-in" style="animation-delay: {{ $index * 0.1 }}s">
|
||||||
|
<div class="card-rank">{{ $rank }}</div>
|
||||||
|
|
||||||
|
@if ($rank == 1)
|
||||||
|
<div class="recommendation-badge top-choice">
|
||||||
|
<i class="fas fa-crown"></i> Pilihan Terbaik
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<div class="recommendation-badge">
|
||||||
|
<i class="fas fa-star"></i> Top {{ $rank }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($clothing->img && file_exists(public_path('storage/' . $clothing->img)))
|
||||||
|
<img src="{{ asset('storage/' . $clothing->img) }}"
|
||||||
|
class="card-img"
|
||||||
|
alt="Gambar {{ $clothing->nama_pakaian ?? $clothing->nama }}"
|
||||||
|
onerror="this.src='{{ asset('images/no-image.jpg') }}'">
|
||||||
|
@else
|
||||||
|
<div class="card-img" style="background: linear-gradient(135deg, #f0f0f0, #e0e0e0); display: flex; align-items: center; justify-content: center; color: #999;">
|
||||||
|
<i class="fas fa-tshirt" style="font-size: 3rem;"></i>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="clothing-type">{{ $clothingType }}</div>
|
||||||
|
|
||||||
|
<div class="card-title">{{ $clothing->nama_pakaian ?? $clothing->nama }}</div>
|
||||||
|
|
||||||
|
<div class="card-info">
|
||||||
|
<div class="info-item">
|
||||||
|
<i class="fas fa-tag"></i>
|
||||||
|
<span class="price">Rp {{ number_format($clothing->harga ?? 0, 0, ',', '.') }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (isset($clothing->merek))
|
||||||
|
<div class="info-item">
|
||||||
|
<i class="fas fa-copyright"></i>
|
||||||
|
<span>{{ $clothing->merek }}</span>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if (isset($clothing->ukuran))
|
||||||
|
<div class="info-item">
|
||||||
|
<i class="fas fa-ruler"></i>
|
||||||
|
<span>Ukuran: {{ $clothing->ukuran }}</span>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="score-container">
|
||||||
|
<div class="score-label">Skor Kecocokan</div>
|
||||||
|
<div class="score-value">{{ number_format($score, 3) }}</div>
|
||||||
|
<div class="score-stars">
|
||||||
|
@for ($i = 1; $i <= 5; $i++)
|
||||||
|
@if ($i <= $fullStars)
|
||||||
|
<i class="fas fa-star star"></i>
|
||||||
|
@elseif ($i == $fullStars + 1 && $hasHalfStar)
|
||||||
|
<i class="fas fa-star-half-alt star"></i>
|
||||||
|
@else
|
||||||
|
<i class="far fa-star star empty"></i>
|
||||||
|
@endif
|
||||||
|
@endfor
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
@endforeach
|
||||||
@endforeach
|
</div>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="{{ asset('js/bootstrap.bundle.min.js') }}"></script>
|
<script>
|
||||||
</body>
|
// Add smooth animations and interactions
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
// Animate cards on scroll
|
||||||
|
const observerOptions = {
|
||||||
|
threshold: 0.1,
|
||||||
|
rootMargin: '0px 0px -50px 0px'
|
||||||
|
};
|
||||||
|
|
||||||
</html>
|
const observer = new IntersectionObserver(function(entries) {
|
||||||
|
entries.forEach(entry => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
entry.target.style.opacity = '1';
|
||||||
|
entry.target.style.transform = 'translateY(0)';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, observerOptions);
|
||||||
|
|
||||||
|
// Observe all cards
|
||||||
|
document.querySelectorAll('.card').forEach(card => {
|
||||||
|
observer.observe(card);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -154,6 +154,10 @@
|
||||||
<div class="col-md-7 col-lg-6 col-xxl-5 py-6 text-sm-start text-center">
|
<div class="col-md-7 col-lg-6 col-xxl-5 py-6 text-sm-start text-center">
|
||||||
<h1 class="mt-6 mb-sm-4 fw-semi-bold lh-sm fs-4 fs-lg-5 fs-xl-6">Hello! <br class="d-block d-lg-block" />Selamat Datang</h1>
|
<h1 class="mt-6 mb-sm-4 fw-semi-bold lh-sm fs-4 fs-lg-5 fs-xl-6">Hello! <br class="d-block d-lg-block" />Selamat Datang</h1>
|
||||||
<p class="mb-4 fs-1">Terima kasih telah mengunjungi situs kami! Kami siap membantu anda mencari pakaian yang sesuai dengan gaya dan kebutuhan anda!</p>
|
<p class="mb-4 fs-1">Terima kasih telah mengunjungi situs kami! Kami siap membantu anda mencari pakaian yang sesuai dengan gaya dan kebutuhan anda!</p>
|
||||||
|
|
||||||
|
<a href="#pilihpakaian" class="btn btn-primary px-4 py-2">
|
||||||
|
Mulai Cari Pakaian
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -6,8 +6,7 @@
|
||||||
<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 sesuai dengan preferensi Anda.
|
<p class="text-muted">Untuk mendapatkan rekomendasi pakaian yang sesuai dengan preferensi Anda.</p>
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card shadow-lg border-0 rounded-4">
|
<div class="card shadow-lg border-0 rounded-4">
|
||||||
|
@ -15,8 +14,7 @@
|
||||||
|
|
||||||
<!-- 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%;"
|
<div class="progress-bar bg-primary" role="progressbar" style="width: 20%;" id="progressBar"></div>
|
||||||
id="progressBar"></div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@php
|
@php
|
||||||
|
@ -25,36 +23,40 @@
|
||||||
'Harga' => $subKriteria['Harga'] ?? [],
|
'Harga' => $subKriteria['Harga'] ?? [],
|
||||||
'Jenis Acara' => $subKriteria['Jenis Acara'] ?? [],
|
'Jenis Acara' => $subKriteria['Jenis Acara'] ?? [],
|
||||||
'Warna Pakaian' => $subKriteria['Warna Pakaian'] ?? [],
|
'Warna Pakaian' => $subKriteria['Warna Pakaian'] ?? [],
|
||||||
'Cuaca Acara' => $subKriteria['Cuaca Acara'] ?? [],
|
|
||||||
'Lokasi Acara' => $subKriteria['Lokasi Acara'] ?? [],
|
'Lokasi Acara' => $subKriteria['Lokasi Acara'] ?? [],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$multiAnswerKriteria = ['Jenis Acara', 'Warna Pakaian', 'Lokasi Acara'];
|
||||||
$stepIndex = 1;
|
$stepIndex = 1;
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
@foreach ($steps as $label => $subs)
|
@foreach ($steps as $label => $subs)
|
||||||
<div class="step {{ $stepIndex === 1 ? 'active' : '' }}" id="step-{{ $stepIndex }}">
|
<div class="step {{ $stepIndex === 1 ? 'active' : '' }}" id="step-{{ $stepIndex }}">
|
||||||
<h5 class="fw-bold mb-3">Pilih {{ strtolower($label) }}...</h5>
|
<h5 class="fw-bold mb-3">Pilih {{ strtolower($label) }}:</h5>
|
||||||
|
|
||||||
@foreach ($subs as $sub)
|
@foreach ($subs as $sub)
|
||||||
<div class="form-check mb-2">
|
<div class="form-check mb-2">
|
||||||
<input class="form-check-input" type="radio" id="sub_{{ $sub->id }}"
|
@php
|
||||||
value="{{ $sub->id }}"
|
$isMultiple = in_array($label, $multiAnswerKriteria);
|
||||||
name="sub_kriteria[{{ $sub->kriteria_id }}]">
|
$inputType = $isMultiple ? 'checkbox' : 'radio';
|
||||||
|
$nameAttr = $isMultiple ? "sub_kriteria[{$sub->kriteria_id}][]" : "sub_kriteria[{$sub->kriteria_id}]";
|
||||||
|
@endphp
|
||||||
|
<input class="form-check-input" type="{{ $inputType }}" id="sub_{{ $sub->id }}"
|
||||||
|
name="{{ $nameAttr }}" value="{{ $sub->id }}">
|
||||||
<label class="form-check-label" for="sub_{{ $sub->id }}">
|
<label class="form-check-label" for="sub_{{ $sub->id }}">
|
||||||
{{ $sub->nama_sub }}
|
{{ $sub->nama_sub }}
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|
||||||
<div class="mt-3">
|
<div class="mt-4">
|
||||||
@if ($stepIndex > 1)
|
@if ($stepIndex > 1)
|
||||||
<button type="button" class="btn btn-secondary me-2"
|
<button type="button" class="btn btn-secondary me-2" onclick="prevStep()">Kembali</button>
|
||||||
onclick="prevStep()">Kembali</button>
|
|
||||||
@endif
|
@endif
|
||||||
@if ($stepIndex < count($steps))
|
@if ($stepIndex < count($steps))
|
||||||
<button type="button" class="btn btn-primary"
|
<button type="button" class="btn btn-primary" onclick="nextStep()">Selanjutnya</button>
|
||||||
onclick="nextStep()">Selanjutnya</button>
|
|
||||||
@else
|
@else
|
||||||
<button type="submit">Lihat Rekomendasi</button>
|
<button type="submit" class="btn btn-success">Lihat Rekomendasi</button>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -82,11 +84,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextStep() {
|
function nextStep() {
|
||||||
const radios = document.querySelectorAll(`#step-${currentStep} input[type="radio"]`);
|
const currentInputs = document.querySelectorAll(`#step-${currentStep} input`);
|
||||||
const isAnswered = Array.from(radios).some(radio => radio.checked);
|
const isAnswered = Array.from(currentInputs).some(input => input.checked);
|
||||||
|
|
||||||
if (!isAnswered) {
|
if (!isAnswered) {
|
||||||
alert("Silakan pilih salah satu opsi terlebih dahulu.");
|
alert("Silakan pilih minimal satu opsi terlebih dahulu.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,54 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="id">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Rekomendasi {{ $jenis }}</title>
|
|
||||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container py-4">
|
|
||||||
<h1 class="mb-4">Rekomendasi {{ $jenis }}</h1>
|
|
||||||
|
|
||||||
@if(isset($skorAkhir) && count($skorAkhir) > 0)
|
|
||||||
<div class="row">
|
|
||||||
@foreach($skorAkhir as $index => $item)
|
|
||||||
<div class="col-md-4 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">
|
|
||||||
#{{ $index + 1 }} - {{ $item['alternatif']->nama_alternatif ?? 'Produk ' . ($index + 1) }}
|
|
||||||
</h5>
|
|
||||||
|
|
||||||
<p class="card-text">
|
|
||||||
<strong>Skor: </strong>{{ number_format($item['skor_akhir'] * 100, 1) }}%
|
|
||||||
</p>
|
|
||||||
|
|
||||||
@if(isset($item['alternatif']->harga))
|
|
||||||
<p class="card-text">
|
|
||||||
<strong>Harga: </strong>Rp {{ number_format($item['alternatif']->harga, 0, ',', '.') }}
|
|
||||||
</p>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if(isset($item['alternatif']->deskripsi))
|
|
||||||
<p class="card-text">{{ $item['alternatif']->deskripsi }}</p>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endforeach
|
|
||||||
</div>
|
|
||||||
@else
|
|
||||||
<div class="alert alert-info">
|
|
||||||
<p>Tidak ada rekomendasi {{ strtolower($jenis) }} yang tersedia.</p>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<div class="mt-4">
|
|
||||||
<a href="/" class="btn btn-secondary">Kembali ke Beranda</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -8,11 +8,11 @@ use App\Http\Controllers\KriteriaController;
|
||||||
use App\Http\Controllers\PenilaianController;
|
use App\Http\Controllers\PenilaianController;
|
||||||
use App\Http\Controllers\Admin\AuthController;
|
use App\Http\Controllers\Admin\AuthController;
|
||||||
use App\Http\Controllers\SubKriteriaController;
|
use App\Http\Controllers\SubKriteriaController;
|
||||||
use App\Http\Controllers\Admin\RiwayatController;
|
|
||||||
use App\Http\Controllers\Admin\DashboardController;
|
use App\Http\Controllers\Admin\DashboardController;
|
||||||
use App\Http\Controllers\SubKriteriaShowController;
|
use App\Http\Controllers\SubKriteriaShowController;
|
||||||
use App\Http\Controllers\Landingpage\HomeController;
|
use App\Http\Controllers\Landingpage\HomeController;
|
||||||
use App\Http\Controllers\Admin\ResetPasswordController;
|
use App\Http\Controllers\Admin\ResetPasswordController;
|
||||||
|
use App\Http\Controllers\RiwayatController;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
@ -62,10 +62,9 @@ Route::prefix('admin')->middleware(['auth'])->as('admin.')->group(function () {
|
||||||
|
|
||||||
Route::resource('penilaian', PenilaianController::class);
|
Route::resource('penilaian', PenilaianController::class);
|
||||||
Route::resource('user', UserController::class);
|
Route::resource('user', UserController::class);
|
||||||
|
Route::get('riwayat', [RiwayatController::class, 'index'])->name('riwayat.index');
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::get('riwayat', [RiwayatController::class, 'index'])->name('riwayat.index');
|
|
||||||
|
|
||||||
// // Kriteria
|
// // Kriteria
|
||||||
// Route::get('/kriteria', [DataKriteriaController::class, 'indexPage'])->name('admin.kriteria.index');
|
// Route::get('/kriteria', [DataKriteriaController::class, 'indexPage'])->name('admin.kriteria.index');
|
||||||
// Route::get('/kriteria/create', [DataKriteriaController::class, 'create'])->name('admin.kriteria.create');
|
// Route::get('/kriteria/create', [DataKriteriaController::class, 'create'])->name('admin.kriteria.create');
|
||||||
|
|