Merge pull request #1 from hanzhighmekaniq/main

Kekuatan Update
This commit is contained in:
HANIF FEBRIANSYAH 2025-05-25 01:59:48 +07:00 committed by GitHub
commit 48ce40d3ca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
52 changed files with 1550 additions and 4096 deletions

View File

@ -1,154 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\DataAlternatif;
use App\Models\DataKriteria;
use App\Models\Kriteria;
use Illuminate\Support\Str;
class AlternatifController extends Controller
{
public function indexPage(Request $request)
{
// Ambil semua subkriteria tanpa filter "Jenis Pakaian"
$subkriteria = \App\Models\Subkriteria::where('kriteria_id', 3)->get();
// Ambil semua kriteria
$kriteria = Kriteria::all();
// Ambil semua alternatif dengan relasi ke subkriteria
$query = DataAlternatif::with('subkriteria', 'penilaian');
// Jika ada filter jenis pakaian, gunakan filter berdasarkan subkriteria_id
if ($request->filled('jenis_pakaian')) {
$query->where('subkriteria_id', $request->jenis_pakaian);
}
// Search
if ($request->filled('search')) {
$query->where('nama_alternatif', 'like', '%' . $request->search . '%');
}
// Ambil data alternatif dengan pagination (10 per halaman)
$perPage = $request->input('entries', 10); // Ambil dari URL ?entries=xx, default 10
$alternatif = $query->paginate($perPage)->appends($request->query());
// Kirim data ke view
return view('admin.pages.alternatif.index', compact('subkriteria', 'alternatif', 'kriteria'));
}
public function store(Request $request)
{
// Validasi input
$request->validate([
'nama_alternatif' => 'required|string|max:255|unique:dataalternatif,nama_alternatif',
'subkriteria_id' => 'required|exists:subkriteria,id',
'gambar' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
]);
$gambarPath = null;
// Jika ada gambar yang diunggah, simpan ke folder public/assets/img
if ($request->hasFile('gambar')) {
$gambar = $request->file('gambar');
$namaFile = time() . '_' . $gambar->getClientOriginalName();
// simpan ke public/assets/img
$gambar->move(public_path('assets/img'), $namaFile);
$gambarPath = 'assets/img/' . $namaFile;
}
// Simpan data alternatif ke database
$alternatif = DataAlternatif::create([
'nama_alternatif' => $request->nama_alternatif,
'subkriteria_id' => $request->subkriteria_id,
'gambar' => $gambarPath,
]);
// Ambil semua kriteria yang ada
$kriteria = Kriteria::all();
// Simpan nilai awal 0 untuk semua kriteria pada alternatif baru
foreach ($kriteria as $k) {
\App\Models\Penilaian::create([
'alternatif_id' => $alternatif->id,
'kriteria_id' => $k->id,
'nilai' => 0, // Atur nilai default
]);
}
// Redirect kembali ke halaman index dengan pesan sukses
return redirect()->route('admin.alternatif.index')->with('success', 'Data Alternatif berhasil ditambahkan.');
}
// Menampilkan form edit untuk alternatif
public function edit($id)
{
// Ambil data alternatif berdasarkan ID
$alternatif = DataAlternatif::findOrFail($id);
// Ambil semua subkriteria (untuk pilihan dropdown misalnya)
$subkriteria = \App\Models\Subkriteria::all();
// Tampilkan view edit
return view('admin.pages.alternatif.edit', compact('alternatif', 'subkriteria'));
}
public function update(Request $request, $id)
{
// Tampilkan view edit
$request->validate([
'nama_alternatif' => 'required|string|max:255|unique:dataalternatif,nama_alternatif,' . $id,
'subkriteria_id' => 'required|exists:subkriteria,id',
'gambar' => 'nullable|image|mimes:jpg,jpeg,png|max:2048',
]);
// Ambil data alternatif berdasarkan ID
$alternatif = DataAlternatif::findOrFail($id);
// Update data dari input
$alternatif->nama_alternatif = $request->nama_alternatif;
$alternatif->subkriteria_id = $request->subkriteria_id;
// Jika user mengunggah gambar baru, simpan dan update path-nya
if ($request->hasFile('gambar')) {
$file = $request->file('gambar');
$namaFile = time() . '_' . $file->getClientOriginalName();
// Simpan di public/assets/img
$file->move(public_path('assets/img'), $namaFile);
// Update path di DB
$alternatif->gambar = 'assets/img/' . $namaFile;
}
// Simpan perubahan ke database
$alternatif->save();
// Jika permintaan AJAX, kirim response JSON
if ($request->ajax()) {
return response()->json(['success' => true, 'message' => 'Data Alternatif berhasil diperbarui!']);
}
// Redirect ke halaman index dengan pesan sukses
return redirect()->route('admin.alternatif.index')->with('success', 'Data Alternatif berhasil diperbarui.');
}
public function destroy(Request $request, $id)
{
// Cari data berdasarkan ID dan hapus
$alternatif = DataAlternatif::findOrFail($id);
$alternatif->delete();
// Jika permintaan AJAX, kirim response JSON
if ($request->ajax()) {
return response()->json(['success' => true, 'message' => 'Data berhasil dihapus.']);
}
// Redirect ke halaman index dengan pesan sukses
return redirect()->route('admin.alternatif.index')->with('success', 'Data Alternatif berhasil dihapus.');
}
}

View File

@ -5,32 +5,21 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\DataAlternatif;
use App\Models\Kriteria;
use App\Models\Pakaian;
use App\Models\Penilaian;
use App\Models\Subkriteria;
use App\Models\SubKriteria as ModelsSubKriteria;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function indexPage()
public function index()
{
// Ambil jumlah data dari masing-masing model
$totalPakaian = Pakaian::count();
$totalKriteria = Kriteria::count();
$totalSubKriteria = Subkriteria::count();
$totalAlternatif = DataAlternatif::count();
$totalPenilaian = Penilaian::count();
// Ambil salah satu kriteria, misal yang pertama
$kriteriaPertama = Kriteria::first();
// Kirim data ke view
return view('admin.pages.dashboard.index', [
'totalKriteria' => $totalKriteria,
'totalSubKriteria' => $totalSubKriteria,
'totalAlternatif' => $totalAlternatif,
'totalPenilaian' => $totalPenilaian,
'totalPerhitungan' => $totalPenilaian,
'totalHasilAkhir' => $totalPenilaian,
'kriteriaId' => $kriteriaPertama ? $kriteriaPertama->id : null,
]);
return view("admin.pages.dashboard.index", compact("totalPakaian", "totalKriteria", "totalSubKriteria"));
}
}

View File

@ -1,84 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\DataKriteria;
use App\Models\Kriteria;
use Dflydev\DotAccessData\Data;
class DataKriteriaController extends Controller
{
// Menampilkan daftar kriteria
public function indexPage()
{
$kriteria = Kriteria::orderBy('kode_kriteria', 'asc')->get();
return view('admin.pages.kriteria.index', compact('kriteria'));
}
// Menampilkan form tambah data
public function create()
{
return view('admin.pages.kriteria.create');
}
// Menyimpan data baru
public function store(Request $request)
{
// Validasi inputan dari form
$request->validate([
'kode_kriteria' => 'required|unique:datakriteria,kode_kriteria|max:10',
'nama_kriteria' => 'required|max:255',
'bobot' => 'required|numeric|min:0.01|max:1', // nilai > 0
'jenis' => 'required|in:Benefit,Cost',
], [
'bobot.min' => 'Bobot tidak boleh 0.',
]);
// Simpan data kriteria baru ke database
Kriteria::create($request->only(['kode_kriteria', 'nama_kriteria', 'bobot', 'jenis']));
return redirect()->route('admin.kriteria.index')->with('success', 'Data Kriteria berhasil ditambahkan!');
}
// Menampilkan form edit data
public function edit($id)
{
// Cari data kriteria berdasarkan ID
$kriteria = Kriteria::findOrFail($id);
return view('admin.pages.kriteria.edit', compact('kriteria'));
}
// Menyimpan perubahan data
public function update(Request $request, $id)
{
// Validasi inputan dari form edit
$request->validate([
'kode_kriteria' => "required|max:10|unique:datakriteria,kode_kriteria,$id,id",
'nama_kriteria' => 'required|max:255',
'bobot' => 'required|numeric|min:0.01|max:1', // nilai > 0
'jenis' => 'required|in:Benefit,Cost',
], [
'bobot.min' => 'Bobot tidak boleh 0.',
]);
// Cari data kriteria yang akan diupdate
$kriteria = Kriteria::findOrFail($id);
// Update data dengan input yang diberikan
$kriteria->update($request->only(['kode_kriteria', 'nama_kriteria', 'bobot', 'jenis']));
return redirect()->route('admin.kriteria.index')->with('success', 'Data Kriteria berhasil diperbarui!');
}
// Menghapus data kriteria
public function destroy($id)
{
// Cari data kriteria berdasarkan ID
$kriteria = Kriteria::findOrFail($id);
// Hapus data dari database
$kriteria->delete();
return redirect()->route('admin.kriteria.index')->with('success', 'Data Kriteria berhasil dihapus!');
}
}

View File

@ -1,93 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Penilaian;
use App\Models\Alternatif;
use App\Models\DataAlternatif;
use App\Models\Kriteria;
use App\Models\Subkriteria;
use Illuminate\Http\Request;
class PenilaianController extends Controller
{
// Menampilkan daftar penilaian
public function indexPage(Request $request)
{
$perPage = $request->input('perPage', 10); // Jumlah data per halaman
$search = $request->input('search'); // Keyword pencaria
$query = DataAlternatif::with(['penilaian.subkriteria']); // Relasi eager loading
if ($search) {
// Jika terdapat pencarian, filter berdasarkan nama alternatif atau nama subkriteria
$query->where(function ($q) use ($search) {
$q->where('nama_alternatif', 'like', "%{$search}%")
->orWhereHas('penilaian.subkriteria', function ($sub) use ($search) {
$sub->where('nama_subkriteria', 'like', "%{$search}%");
});
});
}
// Ambil data dengan pagination dan simpan parameter query kecuali halaman
$data = $query->paginate($perPage)->appends($request->except('page'));
// Ambil semua data kriteria untuk ditampilkan
$kriteria = Kriteria::all();
return view('admin.pages.penilaian.index', compact('data', 'perPage', 'kriteria', 'search'));
}
// Menampilkan form edit penilaian
public function edit($id)
{
$alternatif = DataAlternatif::findOrFail($id); // Ambil data alternatif berdasarkan ID
$penilaians = Penilaian::where('alternatif_id', $id)->get(); // Ambil data penilaian yang terkait
$kriteria = Kriteria::all(); // Ambil seluruh kriteria
$nilai = []; // Menyimpan ID subkriteria per kriteria untuk ditampilkan di form
foreach ($penilaians as $penilaian) {
$nilai[$penilaian->kriteria_id] = $penilaian->subkriteria_id;
}
return view('admin.pages.penilaian.edit', compact('alternatif', 'kriteria', 'nilai'));
}
// Memperbarui data penilaian
public function update(Request $request, $id)
{
$alternatif = DataAlternatif::findOrFail($id); // Pastikan data alternatif ada
// Validasi input
$request->validate([
'subkriteria_1' => 'required|numeric',
'subkriteria_2' => 'required|numeric',
'subkriteria_3' => 'required|numeric',
'subkriteria_4' => 'required|numeric',
'subkriteria_5' => 'required|numeric',
'subkriteria_6' => 'required|numeric',
]);
// Lakukan update atau insert data penilaian untuk masing-masing kriteria
foreach (range(1, 6) as $i) {
$subkriteriaId = $request->input("subkriteria_$i"); // Ambil input subkriteria
$subkriteria = Subkriteria::find($subkriteriaId); // Cari data subkriteria
if ($subkriteria) {
Penilaian::updateOrCreate(
[
'alternatif_id' => $alternatif->id, // Berdasarkan alternatif dan kriteria
'kriteria_id' => $i,
],
[
'subkriteria_id' => $subkriteria->id, // Simpan subkriteria yang dipilih
'nilai' => $subkriteria->nilai, // Ambil nilai dari subkriteria
]
);
}
}
return redirect()->route('admin.penilaian.index')->with('success', 'Penilaian berhasil diperbarui!');
}
}

View File

@ -1,103 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\DataAlternatif;
use App\Models\Kriteria;
use App\Models\Penilaian;
use App\Models\Subkriteria;
class PerhitunganController extends Controller
{
// Method untuk masing-masing jenis pakaian
public function dress() { return $this->showJenisPakaian('Dress'); }
public function blouse() { return $this->showJenisPakaian('Blouse'); }
public function cardigan() { return $this->showJenisPakaian('Cardigan'); }
public function rok() { return $this->showJenisPakaian('Rok'); }
public function celana() { return $this->showJenisPakaian('Celana'); }
// Method umum untuk menampilkan data berdasarkan jenis pakaian
public function showJenisPakaian($jenis)
{
// Ambil data alternatif yang memiliki penilaian pada kriteria ke-3 (jenis pakaian),
// dan nilai subkriteria-nya sesuai dengan jenis yang dipilih (misalnya 'Dress')
$alternatif = DataAlternatif::with(['penilaian.subkriteria'])
->whereHas('penilaian', function($query) use ($jenis) {
$query->where('kriteria_id', 3)
->whereHas('subkriteria', function($subquery) use ($jenis) {
$subquery->where('nama_subkriteria', $jenis);
});
})
->get();
// Ambil semua data kriteria
$kriteria = Kriteria::all();
// Hitung nilai maksimum dan minimum untuk tiap kriteria
$maxNilai = [];
$minNilai = [];
foreach ($kriteria as $index => $k) {
$nilaiKriteria = [];
foreach ($alternatif as $alt) {
$penilaian = $alt->penilaian->firstWhere('kriteria_id', $k->id);
if ($penilaian && $penilaian->subkriteria) {
$nilaiKriteria[] = $penilaian->subkriteria->nilai;
}
}
$kode = 'C' . ($index + 1);
$maxNilai[$kode] = count($nilaiKriteria) > 0 ? max($nilaiKriteria) : 1;
$minNilai[$kode] = count($nilaiKriteria) > 0 ? min($nilaiKriteria) : 1;
}
$normalisasi = [];
$pembobotan = [];
foreach ($alternatif as $alt) {
$barisNormal = [];
$barisBobot = [];
foreach ($kriteria as $index => $k) {
$penilaian = $alt->penilaian->firstWhere('kriteria_id', $k->id);
$nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->nilai : 0;
$kode = 'C' . ($index + 1);
if ($k->jenis == 'Cost') {
$normal = $nilai > 0 ? $minNilai[$kode] / $nilai : 0;
} else {
$normal = $maxNilai[$kode] > 0 ? $nilai / $maxNilai[$kode] : 0;
}
$normalRounded = round($normal, 3);
$bobot = round($normalRounded * $k->bobot, 3);
$barisNormal[$kode] = $normalRounded;
$barisBobot[$kode] = $bobot;
}
$normalisasi[] = [
'nama' => $alt->nama_alternatif,
'nilai' => $barisNormal
];
$pembobotan[] = [
'nama' => $alt->nama_alternatif,
'nilai' => $barisBobot
];
}
$viewName = strtolower($jenis);
return view("admin.pages.perhitungan.$viewName", compact(
'alternatif',
'kriteria',
'jenis',
'normalisasi',
'pembobotan'
));
}
}

View File

@ -1,118 +0,0 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Subkriteria;
use App\Models\Kriteria;
use Illuminate\Http\Request;
class SubkriteriaController extends Controller
{
// Menampilkan data berdasarkan kriteria
public function showByKriteria($id)
{
// Ambil data kriteria berdasarkan ID
$kriteria = Kriteria::findOrFail($id);
// Ambil data subkriteria berdasarkan subkriteria_id, jika menggunakan kolom ini
$subkriterias = SubKriteria::where('kriteria_id', $id)->get(); // Periksa kolom yang digunakan
// Kirim data ke view
return view('admin.pages.subkriteria.dynamic', compact('kriteria', 'subkriterias'));
}
// Menampilkan form untuk membuat subkriteria
public function create($id)
{
// Ambil data kriteria berdasarkan ID
$kriteria = Kriteria::findOrFail($id);
// Kirim data ke view
return view('admin.pages.subkriteria.create', compact('kriteria'));
}
// Menyimpan data subkriteria baru
public function store(Request $request)
{
// Validasi input
$validated = $request->validate([
'kriteria_id' => 'required|exists:datakriteria,id',
'name' => 'required|string|max:255',
'nilai' => 'required|numeric|min:0.01',
], [
'nilai.min' => 'Nilai tidak boleh 0.',
]);
// Simpan data subkriteria
SubKriteria::create([
'kriteria_id' => $validated['kriteria_id'],
'nama_subkriteria' => $validated['name'],
'nilai' => $validated['nilai'],
]);
// Redirect kembali ke halaman subkriteria berdasarkan kriteria_id
return redirect()->route('admin.pages.subkriteria.kriteria', ['id' => $validated['kriteria_id']])
->with('success', 'Subkriteria berhasil ditambahkan.');
}
public function edit($id)
{
// Ambil data subkriteria berdasarkan subkriteria_id
$subkriteria = SubKriteria::find($id);
if (!$subkriteria) {
return redirect()->back()->with('error', 'Subkriteria tidak ditemukan.');
}
// Ambil data kriteria terkait
$kriteria = Kriteria::findOrFail($subkriteria->kriteria_id);
// Kirim data ke view
return view('admin.pages.subkriteria.edit', compact('subkriteria', 'kriteria'));
}
public function update(Request $request, $id)
{
// Validasi input
$validated = $request->validate([
'kriteria_id' => 'required|exists:datakriteria,id',
'name' => 'required|string|max:255',
'nilai' => 'required|numeric|min:0.01',
], [
'nilai.min' => 'Nilai tidak boleh 0.',
]);
// Ambil data subkriteria berdasarkan ID
$subkriteria = SubKriteria::findOrFail($id); // Pastikan menggunakan subkriteria_id jika diperlukan
// Update data subkriteria
$subkriteria->update([
'kriteria_id' => $validated['kriteria_id'],
'nama_subkriteria' => $validated['name'],
'nilai' => $validated['nilai'],
]);
// Redirect kembali ke halaman subkriteria berdasarkan kriteria_id
return redirect()->route('admin.pages.subkriteria.kriteria', ['id' => $validated['kriteria_id']])
->with('success', 'Subkriteria berhasil diperbarui.');
}
public function destroy($id)
{
// Cari subkriteria berdasarkan ID
$subkriteria = SubKriteria::find($id);
// Jika tidak ditemukan, redirect balik dengan pesan error
if (!$subkriteria) {
return redirect()->back()->with('error', 'Subkriteria tidak ditemukan.');
}
// Hapus subkriteria
$subkriteria->delete();
// Redirect kembali dengan pesan sukses
return redirect()->back()->with('success', 'Subkriteria berhasil dihapus.');
}
}

View File

@ -0,0 +1,117 @@
<?php
namespace App\Http\Controllers;
use App\Models\Kriteria;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Database\QueryException;
class KriteriaController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
$kriteria = Kriteria::all();
return view('admin.pages.kriteria.index', compact('kriteria'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('admin.pages.kriteria.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// dd($request->all()); // 👈 akan menampilkan semua input form dan menghentikan proses
$request->validate([
'kode_kriteria' => 'required',
'nama_kriteria' => 'required',
'bobot' => 'required',
'jenis' => 'required',
]);
try {
Kriteria::create([
'kode_kriteria' => $request->kode_kriteria,
'nama_kriteria' => $request->nama_kriteria,
'bobot' => $request->bobot,
'jenis' => $request->jenis,
]);
return redirect()->route('admin.kriteria.index')->with('success', 'Data berhasil ditambahkan!');
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Gagal menyimpan data: ' . $e->getMessage());
}
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
// $kriteria = Kriteria::findOrFail($id);
// return view('admin.kriteria.show', compact('kriteria'));
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
$kriteria = Kriteria::findOrFail($id);
return view('admin.pages.kriteria.edit', compact('kriteria'));
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
$request->validate([
'kode_kriteria' => 'required',
'nama_kriteria' => 'required',
'bobot' => 'required',
'jenis' => 'required',
]);
try {
$kriteria = Kriteria::findOrFail($id);
$kriteria->update([
'kode_kriteria' => $request->kode_kriteria,
'nama_kriteria' => $request->nama_kriteria,
'bobot' => $request->bobot,
'jenis' => $request->jenis,
]);
return redirect()->route('admin.kriteria.index')->with('success', 'Data berhasil diperbarui!');
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Gagal memperbarui data: ' . $e->getMessage());
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
try {
$kriteria = Kriteria::findOrFail($id);
$kriteria->delete();
return redirect()->route('admin.kriteria.index')->with('success', 'Data berhasil dihapus!');
} catch (\Exception $e) {
return redirect()->back()->with('error', 'Gagal menghapus data: ' . $e->getMessage());
}
}
}

View File

@ -0,0 +1,129 @@
<?php
namespace App\Http\Controllers;
use App\Models\Kriteria;
use App\Models\Pakaian;
use Illuminate\Http\Request;
class PakaianController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$kriteria = Kriteria::all();
// Ambil relasi pakaian dan subkriteria dengan kriteria-nya
$query = Pakaian::with(['subKriterias.kriteria']);
// Filter search nama pakaian
if ($request->filled('search')) {
$query->where('nama_pakaian', 'like', '%' . $request->search . '%');
}
$perPage = $request->input('entries', 10);
$alternatif = $query->paginate($perPage)->appends($request->query());
return view('admin.pages.pakaian.index', compact('kriteria', 'alternatif'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$request->validate([
'nama_pakaian' => 'required|string|max:255',
'harga' => 'required|numeric',
'img' => 'nullable|image|max:2048',
]);
$imgPath = null;
if ($request->hasFile('img')) {
$imgPath = $request->file('img')->store('uploads/pakaian', 'public');
}
$pakaian = Pakaian::create([
'nama_pakaian' => $request->nama_pakaian,
'harga' => $request->harga,
'img' => $imgPath ? 'storage/' . $imgPath : null,
]);
// Simpan relasi subkriteria (many-to-many)
$pakaian->subKriterias()->sync($request->subkriterias);
return redirect()->route('admin.pakaian.index')->with('success', 'Data pakaian berhasil ditambahkan.');
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id)
{
$request->validate([
'nama_pakaian' => 'required|string|max:255',
'harga' => 'required|numeric|min:0',
'gambar' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
]);
$pakaian = Pakaian::findOrFail($id);
$pakaian->nama_pakaian = $request->nama_pakaian;
$pakaian->harga = $request->harga;
// Jika upload gambar baru
if ($request->hasFile('gambar')) {
if ($pakaian->img && file_exists(public_path($pakaian->img))) {
unlink(public_path($pakaian->img));
}
$file = $request->file('gambar');
$path = 'uploads/pakaian/';
$filename = time() . '_' . $file->getClientOriginalName();
$file->move(public_path($path), $filename);
$pakaian->img = $path . $filename;
}
$pakaian->save();
return redirect()->back()->with('success', 'Data pakaian berhasil diperbarui!');
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}

View File

@ -0,0 +1,114 @@
<?php
namespace App\Http\Controllers;
use App\Models\Kriteria;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\SubKriteria;
class SubKriteriaController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$kriteria_id = $request->query('kriteria_id');
if (!$kriteria_id) {
return redirect()->back()->with('error', 'ID Kriteria tidak ditemukan.');
}
$kriteria = Kriteria::findOrFail($kriteria_id);
$subkriterias = SubKriteria::where('kriteria_id', $kriteria_id)->get();
return view('admin.subkriteria.index', compact('kriteria', 'subkriterias'));
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// Validasi input
$validated = $request->validate([
'kriteria_id' => 'required',
'nama_sub' => 'required|string|max:255',
'nilai' => 'required|numeric',
'min_harga' => 'nullable|numeric|min:0',
'max_harga' => 'nullable|numeric|min:0|gte:min_harga',
]);
// Simpan data
SubKriteria::create([
'kriteria_id' => $validated['kriteria_id'],
'nama_sub' => $validated['nama_sub'],
'nilai' => $validated['nilai'],
'min_harga' => $validated['min_harga'] ?? null,
'max_harga' => $validated['max_harga'] ?? null,
]);
return redirect()->back()->with('success', 'Subkriteria berhasil ditambahkan.');
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
$request->validate([
'kriteria_id' => 'required',
'nama_sub' => 'required|string|max:255',
'nilai' => 'required|numeric',
'min_harga' => 'nullable|numeric',
'max_harga' => 'nullable|numeric',
]);
$subkriteria = SubKriteria::findOrFail($id);
$subkriteria->update([
'kriteria_id' => $request->kriteria_id,
'nama_sub' => $request->nama_sub,
'nilai' => $request->nilai,
'min_harga' => $request->min_harga,
'max_harga' => $request->max_harga,
]);
return redirect()->back()->with('success', 'Subkriteria berhasil diperbarui.');
}
public function destroy(string $id)
{
$subkriteria = SubKriteria::findOrFail($id);
$subkriteria->delete();
return redirect()->back()->with('success', 'Subkriteria berhasil dihapus.');
}
}

View File

@ -0,0 +1,18 @@
<?php
namespace App\Http\Controllers;
use App\Models\Kriteria;
use App\Models\SubKriteria;
use Illuminate\Http\Request;
class SubKriteriaShowController extends Controller
{
public function indexShow($nama_kriteria)
{
$kriteria = Kriteria::where('nama_kriteria', $nama_kriteria)->firstOrFail();
$subkriterias = SubKriteria::where('kriteria_id', $kriteria->id)->get();
$kriterias = Kriteria::all();
return view('admin.pages.subkriteria.index', compact('kriteria', 'subkriterias', 'kriterias'));
}
}

View File

@ -1,29 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DataAlternatif extends Model
{
use HasFactory;
protected $table = 'dataalternatif';
protected $fillable = ['nama_alternatif', 'subkriteria_id', 'gambar'];
public function penilaian()
{
return $this->hasMany(Penilaian::class, 'alternatif_id');
}
public function subkriteria()
{
return $this->belongsTo(Subkriteria::class, 'subkriteria_id');
}
public function nilai()
{
return $this->hasMany(Penilaian::class, 'alternatif_id', 'id');
}
}

View File

@ -8,18 +8,13 @@ use Illuminate\Database\Eloquent\Model;
class Kriteria extends Model
{
use HasFactory;
protected $table = 'datakriteria'; // Sesuaikan dengan nama tabel di database
protected $fillable = ['kode_kriteria', 'nama_kriteria', 'bobot', 'jenis']; // Sesuaikan dengan kolom yang ada di tabel
protected $table = 'kriterias';
public function subkriteria()
protected $fillable = ['nama_kriteria', 'bobot', 'jenis', 'kode_kriteria'];
public function subKriteria()
{
return $this->hasMany(Subkriteria::class, 'kriteria_id'); // Pastikan foreign key sesuai dengan tabel subkriteria
return $this->hasMany(SubKriteria::class);
}
public function penilaian()
{
return $this->hasMany(Penilaian::class, 'kriteria_id');
}
}

View File

@ -1,30 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class NilaiAlternatif extends Model
{
use HasFactory;
protected $table = 'nilai_alternatif'; // Sesuaikan dengan nama tabel di database
protected $fillable = ['alternatif_id', 'nilai'];
public function alternatif()
{
return $this->belongsTo(DataAlternatif::class, 'alternatif_id');
}
public function kriteria()
{
return $this->belongsTo(Kriteria::class, 'kriteria_id');
}
public function nilai()
{
return $this->hasMany(Penilaian::class, 'alternatif_id'); // Hubungkan ke Penilaian
}
}

View File

@ -2,23 +2,20 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Pakaian extends Model
{
use HasFactory;
protected $table = 'pakaian'; // Nama tabel di database
protected $table = 'pakaians';
protected $fillable = [
'nama',
'jenis_acara',
'jenis_pakaian',
'harga',
'warna',
'lokasi',
'cuaca',
'rating'
];
protected $fillable = ['nama_pakaian', 'img', 'harga'];
public function subKriterias(): BelongsToMany
{
return $this->belongsToMany(SubKriteria::class, 'pakaian_sub_kriterias');
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PakaianSubKriteria extends Model
{
protected $table = 'pakaian_sub_kriterias';
protected $fillable = ['pakaian_id', 'sub_kriteria_id'];
}

View File

@ -1,32 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Penilaian extends Model
{
use HasFactory;
protected $table = 'penilaian';
protected $fillable = ['alternatif_id', 'kriteria_id', 'subkriteria_id'];
protected $casts = [
'nilai' => 'array', // Pastikan nilai disimpan sebagai array dalam database
];
public function alternatif()
{
return $this->belongsTo(DataAlternatif::class, 'alternatif_id');
}
public function kriteria()
{
return $this->belongsTo(Kriteria::class, 'kriteria_id');
}
public function subkriteria()
{
return $this->belongsTo(Subkriteria::class, 'subkriteria_id');
}
}

View File

@ -1,23 +0,0 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class QuizHistory extends Model
{
use HasFactory;
protected $table = 'quiz_histories';
protected $fillable = [
'data_kuisioner',
'hasil_rekomendasi',
];
protected $casts = [
'data_kuisioner' => 'array',
'hasil_rekomendasi' => 'array',
];
}

View File

@ -2,29 +2,26 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class Subkriteria extends Model
class SubKriteria extends Model
{
use HasFactory;
protected $table = 'subkriteria'; // Pastikan Laravel menggunakan nama tabel yang benar
protected $primaryKey = 'id'; // Jika primary key bukan 'id'
protected $fillable = ['nama_subkriteria', 'nilai', 'kriteria_id']; // Sesuaikan dengan kolom tabel
protected $table = 'sub_kriterias';
public function kriteria()
protected $fillable = ['kriteria_id', 'nama_sub', 'nilai', 'min_harga', 'max_harga'];
public function kriteria(): BelongsTo
{
return $this->belongsTo(Kriteria::class, 'kriteria_id');
return $this->belongsTo(Kriteria::class);
}
public function penilaian()
public function pakaian(): BelongsToMany
{
return $this->hasMany(Penilaian::class, 'subkriteria_id');
}
public function dataAlternatif()
{
return $this->hasMany(DataAlternatif::class, 'subkriteria_id');
return $this->belongsToMany(Pakaian::class, 'pakaian_sub_kriteria');
}
}

View File

@ -21,8 +21,8 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot(): void
{
view()->composer('*', function ($view) {
$view->with('semua_kriteria', Kriteria::all());
});
// view()->composer('*', function ($view) {
// $view->with('semua_kriteria', Kriteria::all());
// });
}
}

View File

@ -1,24 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('datakriteria', function (Blueprint $table) {
$table->id(); // ID auto-increment
$table->string('kode_kriteria', 10)->unique(); // Kode kriteria (VARCHAR 10)
$table->string('nama_kriteria', 255); // Nama kriteria (VARCHAR 255)
$table->decimal('bobot', 5, 2); // Bobot (DECIMAL 5,2)
$table->enum('jenis', ['Benefit', 'Cost']); // Jenis (Benefit atau Cost)
$table->timestamps(); // Kolom created_at & updated_at
});
}
public function down()
{
Schema::dropIfExists('datakriteria');
}
};

View File

@ -1,28 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('subkriteria', function (Blueprint $table) {
$table->id();
$table->string('nama_subkriteria');
$table->integer('nilai');
$table->foreignId('kriteria_id')->nullable()->constrained('datakriteria')->onDelete('set null');
$table->timestamps();
});
}
public function down(): void
{
Schema::table('subkriteria', function (Blueprint $table) {
$table->dropForeign(['kriteria_id']);
});
Schema::dropIfExists('subkriteria');
}
};

View File

@ -1,36 +0,0 @@
<?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', function (Blueprint $table) {
$table->id();
$table->foreignId('alternatif_id')->constrained('dataalternatif')->onDelete('cascade');
$table->foreignId('kriteria_id')->constrained('datakriteria')->onDelete('cascade');
$table->foreignId('subkriteria_id')->nullable()->constrained('subkriteria')->onDelete('cascade'); // ✅ Tambahkan ini
$table->float('nilai_c1')->nullable(); // Menyimpan nilai C1
$table->float('nilai_c2')->nullable(); // Menyimpan nilai C2
$table->float('nilai_c3')->nullable(); // Menyimpan nilai C3
$table->float('nilai_c4')->nullable(); // Menyimpan nilai C4
$table->float('nilai_c5')->nullable(); // Menyimpan nilai C5
$table->float('nilai_c6')->nullable(); // Menyimpan nilai C6
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('penilaian');
}
};

View File

@ -1,28 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up()
{
Schema::create('pakaian', function (Blueprint $table) {
$table->id(); // ID otomatis
$table->string('nama'); // Nama pakaian
$table->string('jenis_acara'); // Kasual, Formal, Pesta, Santai
$table->string('jenis_pakaian'); // Kemeja, Blouse, Celana, Rok, Dress, Cardigan
$table->integer('harga'); // Harga pakaian
$table->string('warna'); // Warna pakaian
$table->string('lokasi'); // Indoor / Outdoor
$table->string('cuaca'); // Cerah / Berawan
$table->decimal('rating', 3, 2)->default(0); // Contoh: 4.5
$table->timestamps(); // Tanggal dibuat & diperbarui
});
}
public function down()
{
Schema::dropIfExists('pakaian');
}
};

View File

@ -1,28 +0,0 @@
<?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('dataalternatif', function (Blueprint $table) {
$table->string('gambar')->nullable()->after('nama_alternatif');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('dataalternatif', function (Blueprint $table) {
$table->dropColumn('gambar');
});
}
};

View File

@ -1,29 +0,0 @@
<?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('quiz_histories', function (Blueprint $table) {
$table->id();
$table->json('data_kuisioner');
$table->json('hasil_rekomendasi');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('quiz_history');
}
};

View File

@ -1,38 +0,0 @@
<?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('pakaian', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->foreignId('jenis_id')->constrained('jenispakaian')->onDelete('cascade');
$table->foreignId('warna_id')->constrained('warna')->onDelete('cascade');
$table->foreignId('lokasi_id')->constrained('lokasi')->onDelete('cascade');
$table->foreignId('cuaca_id')->constrained('cuaca')->onDelete('cascade');
$table->foreignId('acara_id')->constrained('jenisacara')->onDelete('cascade');
$table->foreignId('harga_id')->constrained('hargakategori')->onDelete('cascade');
$table->integer('harga_asli'); // harga sebenarnya, misal: 134000
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('pakaian');
}
};

View File

@ -1,29 +0,0 @@
<?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('cuaca', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->integer('nilai');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('cuaca');
}
};

View File

@ -1,29 +0,0 @@
<?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('warna', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->integer('nilai');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('warna');
}
};

View File

@ -1,29 +0,0 @@
<?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('jenispakaian', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->integer('nilai');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('jenispakaian');
}
};

View File

@ -1,29 +0,0 @@
<?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('jenisacara', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->integer('nilai'); // bobot untuk SAW
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('jenisacara');
}
};

View File

@ -11,10 +11,12 @@ return new class extends Migration
*/
public function up(): void
{
Schema::create('dataalternatif', function (Blueprint $table) {
Schema::create('kriterias', function (Blueprint $table) {
$table->id();
$table->string('nama_alternatif');
$table->foreignId('subkriteria_id')->nullable()->constrained('subkriteria')->onDelete('set null');
$table->string('nama_kriteria');
$table->string('kode_kriteria');
$table->enum('jenis', ['COST', 'BENEFIT']);
$table->float('bobot'); // bobot untuk SAW
$table->timestamps();
});
}
@ -24,6 +26,6 @@ return new class extends Migration
*/
public function down(): void
{
Schema::dropIfExists('dataalternatif');
Schema::dropIfExists('kriterias');
}
};

View File

@ -0,0 +1,32 @@
<?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('sub_kriterias', function (Blueprint $table) {
$table->id();
$table->foreignId('kriteria_id')->constrained()->onDelete('cascade');
$table->string('nama_sub');
$table->float('nilai'); // nilai untuk metode SAW
$table->unsignedBigInteger('min_harga')->nullable(); // khusus kriteria harga
$table->unsignedBigInteger('max_harga')->nullable(); // khusus kriteria harga
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('sub_kriterias');
}
};

View File

@ -11,13 +11,13 @@ return new class extends Migration
*/
public function up(): void
{
Schema::create('lokasi', function (Blueprint $table) {
Schema::create('pakaians', function (Blueprint $table) {
$table->id();
$table->string('nama');
$table->integer('nilai');
$table->string('nama_pakaian');
$table->longText('img');
$table->unsignedBigInteger('harga'); // harga asli pakaian
$table->timestamps();
});
}
/**
@ -25,6 +25,6 @@ return new class extends Migration
*/
public function down(): void
{
Schema::dropIfExists('lokasi');
Schema::dropIfExists('pakaians');
}
};

View File

@ -11,12 +11,13 @@ return new class extends Migration
*/
public function up(): void
{
Schema::create('hargakategori', function (Blueprint $table) {
Schema::create('pakaian_sub_kriterias', function (Blueprint $table) {
$table->id();
$table->integer('min'); // contoh: 80000
$table->integer('max'); // contoh: 100000
$table->integer('nilai'); // nilai bobot untuk SAW
$table->foreignId('pakaian_id')->constrained()->onDelete('cascade');
$table->foreignId('sub_kriteria_id')->constrained()->onDelete('cascade');
$table->timestamps();
$table->unique(['pakaian_id', 'sub_kriteria_id']);
});
}
@ -25,6 +26,6 @@ return new class extends Migration
*/
public function down(): void
{
Schema::dropIfExists('hargakategori');
Schema::dropIfExists('pakaian_sub_kriterias');
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -13,24 +13,24 @@
<title>V-Person Assistant - @yield('title')</title>
<!-- Custom fonts for this template-->
<link href="{{asset('/assets/vendor/fontawesome-free/css/all.min.css')}}" rel="stylesheet" type="text/css">
<link href="{{ asset('/assets/vendor/fontawesome-free/css/all.min.css') }}" rel="stylesheet" type="text/css">
<link
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
<!-- Custom styles for this template-->
<link href="{{asset('/assets/css/sb-admin-2.min.css')}}" rel="stylesheet">
<link href="{{ asset('/assets/css/sb-admin-2.min.css') }}" rel="stylesheet">
<style>
.bg-gradient-green {
background-color: #43a047 !important; /* hijau medium */
background-image: linear-gradient(180deg, #388e3c 10%, #4caf50 100%) !important;
background-size: cover;
}
</style>
<style>
.bg-gradient-green {
background-color: #43a047 !important;
/* hijau medium */
background-image: linear-gradient(180deg, #388e3c 10%, #4caf50 100%) !important;
background-size: cover;
}
</style>
</head>
@ -54,7 +54,7 @@
<!-- Nav Item - Dashboard -->
<li class="nav-item {{ request()->is('dashboard') ? 'active' : '' }}">
<a class="nav-link" href="{{ url('dashboard') }}">
<a class="nav-link" href="{{ route('admin.dashboard') }}">
<i class="bi bi-house-door-fill"></i>
<span>Dashboard</span></a>
</li>
@ -68,43 +68,52 @@
</div>
<!-- Nav Item - Data Kriteria -->
<li class="nav-item {{ request()->is('kriteria') ? 'active' : '' }}">
<a class="nav-link" href="{{ url('kriteria') }}">
<li class="nav-item {{ request()->is('admin/kriteria') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('admin.kriteria.index') }}">
<i class="bi bi-box"></i>
<span>Data Kriteria</span></a>
</li>
<!-- Nav Item - Data Sub Kriteria (Collapse) -->
<li class="nav-item {{ request()->is('admin/subkriteria/kriteria/*') ? 'active' : '' }}">
<a class="nav-link" href="#" data-toggle="collapse" data-target="#collapsePages" aria-expanded="true"
aria-controls="collapsePages">
<a class="nav-link" href="#" data-toggle="collapse" data-target="#collapsePages"
aria-expanded="true" aria-controls="collapsePages">
<i class="bi bi-boxes"></i>
<span>Data Sub Kriteria</span>
</a>
<div id="collapsePages" class="collapse {{ request()->is('admin/subkriteria/kriteria/*') ? 'show' : '' }}"
<div id="collapsePages"
class="collapse {{ request()->is('admin/kriteria/subkriteria/*') ? 'show' : '' }}"
aria-labelledby="headingPages" data-parent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
@foreach ($semua_kriteria as $kriteria)
{{-- Loop semua kriteria untuk ditampilkan sebagai submenu --}}
<a class="collapse-item {{ request()->is('admin/subkriteria/kriteria/' . $kriteria->id) ? 'active text-white' : '' }}"
style="{{ request()->is('admin/subkriteria/kriteria/' . $kriteria->id) ? 'background-color: #064e03;' : '' }}"
href="{{ route('admin.pages.subkriteria.kriteria', $kriteria->id) }}">
{{ $kriteria->nama_kriteria }} (C{{ $loop->iteration }})
</a>
@endforeach
@php
use App\Models\Kriteria;
$kriterias = Kriteria::with('subKriteria')->get(); // ambil dengan relasi
@endphp
<ul>
@foreach ($kriterias as $kriteria)
<li>
<a href="{{ route('admin.kriteria.subkriteria.index', ['nama_kriteria' => $kriteria->nama_kriteria]) }}">
{{ $kriteria->nama_kriteria }}
</a>
</li>
@endforeach
</ul>
</div>
</div>
</li>
</li>
<script>
document.addEventListener("DOMContentLoaded", function () {
document.addEventListener("DOMContentLoaded", function() {
let collapseMenu = document.getElementById("collapsePages");
let collapseToggle = document.querySelector("[data-target='#collapsePages']");
// Cek status collapse di localStorage
let isOpen = localStorage.getItem("collapsePages") === "open";
// Tunggu sebentar sebelum menyesuaikan tampilan (menghindari Bootstrap override)
setTimeout(() => {
if (isOpen) {
@ -113,87 +122,32 @@
collapseMenu.classList.remove("show");
}
}, 50); // Delay kecil untuk menghindari efek flicker
// Event listener untuk tombol collapse
collapseToggle.addEventListener("click", function () {
collapseToggle.addEventListener("click", function() {
isOpen = !collapseMenu.classList.contains("show");
localStorage.setItem("collapsePages", isOpen ? "open" : "closed");
});
});
</script>
</script>
<!-- Nav Item - Alternatif -->
<li class="nav-item {{ request()->is('alternatif') ? 'active' : '' }}">
<a class="nav-link" href="{{ url('alternatif') }}">
<li class="nav-item {{ request()->is('admin/pakaian') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('admin.pakaian.index') }}">
<i class="bi bi-person-lines-fill"></i>
<span>Data Alternatif</span></a>
<span>Data Pakaian</span></a>
</li>
<!-- Nav Item - Penilaian -->
<li class="nav-item {{ request()->is('penilaian') ? 'active' : '' }}">
<a class="nav-link" href="{{ url('penilaian') }}">
<i class="bi bi-list-ul"></i>
<span>Penilaian Alternatif</span></a>
</li>
<!-- Nav Item - Perhitungan -->
<li class="nav-item {{ request()->is('admin/perhitungan/*') ? 'active' : '' }}">
<a class="nav-link" href="#" data-toggle="collapse" data-target="#collapsePerhitungan" aria-expanded="true"
aria-controls="collapsePerhitungan">
<i class="bi bi-calculator-fill"></i>
<span>Perhitungan</span>
</a>
<div id="collapsePerhitungan" class="collapse {{ request()->is('admin/perhitungan/*') ? 'show' : '' }}"
aria-labelledby="headingPages" data-psarent="#accordionSidebar">
<div class="bg-white py-2 collapse-inner rounded">
<a class="collapse-item {{ request()->is('admin/perhitungan/dress') ? 'active' : '' }}" href="{{ route('admin.perhitungan.dress') }}">Dress</a>
<a class="collapse-item {{ request()->is('admin/perhitungan/blouse') ? 'active' : '' }}" href="{{ route('admin.perhitungan.blouse') }}">Blouse</a>
<a class="collapse-item {{ request()->is('admin/perhitungan/cardigan') ? 'active' : '' }}" href="{{ route('admin.perhitungan.cardigan') }}">Cardigan</a>
<a class="collapse-item {{ request()->is('admin/perhitungan/rok') ? 'active' : '' }}" href="{{ route('admin.perhitungan.rok') }}">Rok</a>
<a class="collapse-item {{ request()->is('admin/perhitungan/celana') ? 'active' : '' }}" href="{{ route('admin.perhitungan.celana') }}">Celana</a>
</div>
</div>
</li>
<script>
document.addEventListener("DOMContentLoaded", function () {
let collapseMenu = document.getElementById("collapsePerhitungan");
let collapseToggle = document.querySelector("[data-target='#collapsePerhitungan']");
if (!collapseMenu || !collapseToggle) return;
// Cek status collapse di localStorage
let isOpen = localStorage.getItem("collapsePerhitungan") === "open";
// Tunggu sebentar sebelum menyesuaikan tampilan
setTimeout(() => {
if (isOpen) {
collapseMenu.classList.add("show");
} else {
collapseMenu.classList.remove("show");
}
}, 50);
// Event listener untuk toggle
collapseToggle.addEventListener("click", function () {
let willOpen = !collapseMenu.classList.contains("show");
localStorage.setItem("collapsePerhitungan", willOpen ? "open" : "closed");
});
});
</script>
<!-- Nav Item - Hasil Akhir -->
<li class="nav-item {{ request()->is('admin/riwayat') ? 'active' : '' }}">
<a class="nav-link" href="{{ route('admin.riwayat.index') }}">
<a class="nav-link" href="#">
<i class="bi bi-hourglass-split"></i>
<span>Riwayat</span>
</a>
</li>
@stack('scripts')
<!-- Divider -->
<hr class="sidebar-divider">
@ -232,16 +186,15 @@
<span class="mr-2 d-none d-lg-inline text-gray-600 small">
Admin
</span>
<img class="img-profile rounded-circle"
src="{{ asset('/assets/img/profile.svg') }}">
<img class="img-profile rounded-circle" src="{{ asset('/assets/img/profile.svg') }}">
</a>
<!-- Dropdown - User Information -->
<!-- Dropdown - User Information -->
<div class="dropdown-menu dropdown-menu-right shadow animated--grow-in"
aria-labelledby="userDropdown">
<!-- Profile Link -->
<a class="dropdown-item" href="{{ route('user.show', Auth::user()->id) }}">
<a class="dropdown-item" href="#">
<i class="fas fa-user fa-sm fa-fw mr-2 text-gray-400"></i>
Profile
</a>
@ -294,50 +247,51 @@
<!-- Logout Modal-->
<div class="modal fade" id="logoutModal" tabindex="-1" role="dialog" aria-labelledby="logoutModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="logoutModalLabel">Apakah Anda yakin ingin keluar?</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
Pilih "Logout" di bawah ini jika anda siap mengakhiri sesi anda
</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal"
style="background-color: #90ee90; color: black; border-color: #90ee90;">
Batal
</button>
<form action="{{ route('logout') }}" method="POST" class="d-inline">
@csrf
<button type="submit" class="btn" style="background-color: #064e03; border-color: #064e03; color: white;">
Logout
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="logoutModalLabel">Apakah Anda yakin ingin keluar?</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</form>
</div>
<div class="modal-body">
Pilih "Logout" di bawah ini jika anda siap mengakhiri sesi anda
</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal"
style="background-color: #90ee90; color: black; border-color: #90ee90;">
Batal
</button>
<form action="{{ route('logout') }}" method="POST" class="d-inline">
@csrf
<button type="submit" class="btn"
style="background-color: #064e03; border-color: #064e03; color: white;">
Logout
</button>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- Bootstrap core JavaScript-->
<script src="{{asset('/assets/vendor/jquery/jquery.min.js')}}"></script>
<script src="{{asset('/assets/vendor/bootstrap/js/bootstrap.bundle.min.js')}}"></script>
<script src="{{ asset('/assets/vendor/jquery/jquery.min.js') }}"></script>
<script src="{{ asset('/assets/vendor/bootstrap/js/bootstrap.bundle.min.js') }}"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css">
<!-- Core plugin JavaScript-->
<script src="{{asset('/assets/vendor/jquery-easing/jquery.easing.min.js')}}"></script>
<script src="{{ asset('/assets/vendor/jquery-easing/jquery.easing.min.js') }}"></script>
<!-- Custom scripts for all pages-->
<script src="{{asset('/assets/js/sb-admin-2.min.js')}}"></script>
<script src="{{ asset('/assets/js/sb-admin-2.min.js') }}"></script>
<!-- jQuery -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
</body>
</html>
</html>

View File

@ -1,677 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Alternatif')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Alternatif
</h1>
</div>
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold" style="color: #064E3B;">
<i class="bi bi-table"></i> Daftar Data Alternatif
</h6>
<button type="button" class="btn" style="background-color: #064E3B; color: white;" data-bs-toggle="modal" data-bs-target="#modalTambah">
<i></i> Tambah Data
</button>
</div>
<style>
.label-spacing {
margin-right: 0.3rem; /* Jarak antara label dan select */
}
.search-input {
width: 200px; /* Lebar input search */
}
.justify-between {
justify-content: space-between;
}
.pagination {
display: flex;
justify-content: flex-end; /* Geser ke pojok kanan */
align-items: center;
padding: 10px;
}
.pagination .page-item .page-link {
font-size: 14px;
padding: 6px 12px;
border-radius: 5px;
border: none;
color: white;
background-color: #064E3B; /* Warna biru */
margin: 0 2px;
transition: 0.3s ease-in-out;
}
.pagination .page-item.active .page-link {
background-color: #053B2D; /* Biru lebih gelap */
font-weight: bold;
}
.pagination .page-item .page-link:hover {
background-color: #046C4E;
}
.pagination .page-item.disabled .page-link {
background-color: #e9ecef;
color: #6c757d;
cursor: not-allowed;
}
.entries-form {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 1rem;
margin-bottom: 1rem;
}
.entries-left,
.entries-right {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 14px;
}
.entries-left label,
.entries-right label {
margin: 0;
line-height: 1;
}
.entries-left select,
.entries-right input[type="text"] {
padding: 4px 8px;
height: 32px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
}
.entries-right button {
height: 32px;
padding: 0 12px;
font-size: 14px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
}
.entries-right button:hover {
background-color: #0056b3;
}
</style>
<div class="card-body">
<div class="d-flex align-items-center justify-between mb-3">
<div class="d-flex align-items-center">
<form method="GET" id="entriesForm" action="{{ route('admin.alternatif.index') }}" class="entries-form mb-3" style="display: flex; justify-content: space-between; align-items: center;">
{{-- Kiri: Dropdown jumlah data --}}
<div class="entries-left">
<label for="entriesPerPage">Show</label>
<select name="entries" id="entriesPerPage" onchange="document.getElementById('entriesForm').submit()">
<option value="10" {{ request('entries') == 10 ? 'selected' : '' }}>10</option>
<option value="25" {{ request('entries') == 25 ? 'selected' : '' }}>25</option>
<option value="50" {{ request('entries') == 50 ? 'selected' : '' }}>50</option>
</select>
<span>entries</span>
</div>
{{-- Kanan: Search input --}}
<div class="entries-right" style="display: flex; align-items: center; gap: 0.5rem;">
<label for="search" class="me-2">Search:</label>
<input type="text" name="search" id="search" placeholder="Search..." value="{{ request('search') }}">
<button type="submit">Cari</button>
</div>
{{-- Hidden --}}
@if(request('jenis_pakaian'))
<input type="hidden" name="jenis_pakaian" value="{{ request('jenis_pakaian') }}">
@endif
</form>
</div>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Gambar</th>
<th class="text-center">Nama Alternatif</th>
<th class="text-center">Jenis Pakaian</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody id="tableBody">
@php
$no = ($alternatif->currentPage() - 1) * $alternatif->perPage() + 1;
@endphp
@foreach ($alternatif as $key => $item)
<tr class="data-row">
<td class="text-center">{{ $no++ }}</td>
<td class="text-center">
@if($item->gambar)
<img src="{{ asset($item->gambar) }}" alt="Gambar" style="max-width: 100px; max-height: 100px;">
@else
Tidak ada gambar
@endif
</td>
<td class="text-center data-item">{{ $item->nama_alternatif }}</td>
<td class="text-center">{{ $item->subkriteria?->nama_subkriteria ?? '-' }}</td>
<td class="text-center">
<div class="d-flex justify-content-center" style="gap: 10px;">
<button type="button" class="btn btn-primary btn-sm edit-btn"
data-id="{{ $item->id }}"
data-nama="{{ $item->nama_alternatif }}"
data-subkriteria="{{ $item->subkriteria_id }}"
data-gambar="{{ $item->gambar }}"
data-bs-toggle="modal"
data-bs-target="#modalEdit">
<i class="bi bi-pencil"></i>
</button>
<form action="{{ route('admin.alternatif.destroy', $item->id) }}" method="POST" class="delete-form">
@csrf
@method('DELETE')
<button type="button" class="btn btn-danger btn-sm delete-button" data-id="{{ $item->id }}">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="d-flex justify-content-end">
{{ $alternatif->appends(['entries' => request('entries')])->links('vendor.pagination.bootstrap-5') }}
</div>
</div>
</div>
</div>
</div>
<!-- Modal Tambah Data Alternatif -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<!-- Header Modal -->
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Alternatif
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<!-- Body Modal -->
<div class="modal-body">
<form action="{{ route('admin.alternatif.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<!-- Nama Alternatif -->
<div class="mb-3">
<label for="nama_alternatif" class="form-label">Nama Alternatif</label>
<input type="text" class="form-control" id="nama_alternatif" name="nama_alternatif" required>
</div>
<!-- Jenis Pakaian -->
<div class="mb-3">
<label for="subkriteria_id" class="form-label fw-bold">Jenis Pakaian</label>
<select name="subkriteria_id" id="subkriteria_id" class="form-control" required>
<option value="">Pilih Jenis Pakaian</option>
@foreach ($subkriteria as $sub)
<option value="{{ $sub->id }}">{{ $sub->nama_subkriteria }}</option>
@endforeach
</select>
</div>
<!-- Upload Gambar -->
<div class="mb-3">
<label for="gambar" class="form-label">Upload Gambar</label>
<input type="file" class="form-control" id="gambar" name="gambar" accept="image/*">
</div>
<!-- Tombol Simpan & Batal -->
<div class="d-flex justify-content-end" style="gap: 10px;">
<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>
</div>
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit" tabindex="-1" aria-labelledby="modalEditLabel" aria-hidden="true">
<div class="modal-dialog modal-lg"> <!-- Tambahkan modal-lg -->
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEditLabel">Edit Data Alternatif</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="formEdit" method="POST" enctype="multipart/form-data" action="">
@csrf
@method('PUT')
<div class="modal-body">
<input type="hidden" id="edit_id" name="id">
<!-- Nama Alternatif -->
<div class="mb-3">
<label for="edit_nama_alternatif" class="form-label">Nama Alternatif</label>
<input type="text" id="edit_nama_alternatif" name="nama_alternatif" class="form-control">
</div>
<!-- Jenis Pakaian -->
<div class="mb-3">
<label for="edit_subkriteria_id" class="form-label fw-bold">Jenis Pakaian</label>
<select name="subkriteria_id" id="edit_subkriteria_id" class="form-control" required>
<option value="">Pilih Jenis Pakaian</option>
@foreach ($subkriteria as $sub)
<option value="{{ $sub->id }}">{{ $sub->nama_subkriteria }}</option>
@endforeach
</select>
</div>
<!-- Upload Gambar -->
<div class="mb-3">
<label for="edit_gambar" class="form-label">Upload Gambar</label>
<input type="file" name="gambar" id="edit_gambar" class="form-control">
<!-- Tampilkan gambar lama -->
<div id="preview_gambar_lama" class="mt-2">
<img src="" id="gambar_lama" alt="Gambar Lama" width="120">
</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>
<!-- Tambahkan SweetAlert2 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).on('click', '.edit-btn', function () {
let id = $(this).data('id');
let nama = $(this).data('nama');
let subkriteria = $(this).data('subkriteria');
let gambar = $(this).data('gambar');
$('#edit_id').val(id);
$('#edit_nama_alternatif').val(nama);
$('#edit_subkriteria_id').val(subkriteria);
$('#gambar_lama').attr('src', '/' + gambar);
// Set action URL dinamis
$('#formEdit').attr('action', '{{ route("admin.alternatif.update", ":id") }}'.replace(':id', id));
$('#modalEdit').modal('show');
});
$('#formEdit').on('submit', function (e) {
e.preventDefault();
let form = $(this)[0];
let data = new FormData(form);
let actionUrl = $(this).attr('action');
$.ajax({
url: actionUrl,
type: 'POST',
data: data,
processData: false,
contentType: false,
success: function (res) {
// alert(res.message); // Dihapus agar tidak muncul pop-up
$('#modalEdit').modal('hide');
location.reload(); // Bisa diganti dengan update DOM jika tidak ingin reload
},
error: function (xhr) {
alert("Gagal mengubah data.");
}
});
});
</script>
<script>
$('#modalEdit').on('show.bs.modal', function (event) {
const button = $(event.relatedTarget);
const id = button.data('id');
const nama = button.data('nama');
const subkriteria = button.data('subkriteria-id');
// Isi form
$('#edit_id').val(id);
$('#edit_nama_alternatif').val(nama);
$('#edit_subkriteria_id').val(subkriteria);
// Ubah action-nya
$('#formEdit').attr('action', '/alternatif/' + id);
});
</script>
<script>
document.addEventListener("DOMContentLoaded", function () {
const editButtons = document.querySelectorAll(".edit-btn");
const formEdit = document.getElementById("formEdit");
editButtons.forEach(button => {
button.addEventListener("click", function () {
const id = this.dataset.id;
const nama = this.dataset.nama;
const subkriteria = this.dataset.subkriteria;
document.getElementById("edit_id").value = id;
document.getElementById("edit_nama_alternatif").value = nama;
document.getElementById("edit_subkriteria_id").value = subkriteria;
// ⬇️ Perhatikan ini: Sesuaikan dengan route manual kamu
formEdit.action = `/alternatif/${id}`;
// Tampilkan modal
const modal = new bootstrap.Modal(document.getElementById("modalEdit"));
modal.show();
});
});
});
</script>
<script>
document.addEventListener("DOMContentLoaded", function () {
let editButtons = document.querySelectorAll(".edit-btn");
editButtons.forEach(function (button) {
button.addEventListener("click", function () {
// Ambil data dari tombol
let id = this.getAttribute("data-id");
let nama = this.getAttribute("data-nama");
let subkriteriaId = this.getAttribute("data-subkriteria");
// Isi form di modal
document.getElementById("edit_id").value = id;
document.getElementById("edit_nama_alternatif").value = nama;
document.getElementById("edit_subkriteria_id").value = subkriteriaId;
// Ubah action form ke /alternatif/{id}
document.getElementById("formEdit").action = "/alternatif/" + id;
// Tampilkan modal (kalau pakai Bootstrap 5)
let modal = new bootstrap.Modal(document.getElementById('modalEdit'));
modal.show();
});
});
});
</script>
<script>
function updateEntries() {
let selectedValue = document.getElementById("entriesPerPage").value;
let url = new URL(window.location.href);
url.searchParams.set("entries", selectedValue);
window.location.href = url.toString();
}
</script>
<script>
function searchFunction() {
let input = document.getElementById('search').value.toLowerCase();
let rows = document.querySelectorAll('.data-row');
rows.forEach(row => {
let text = row.querySelector('.data-item').textContent.toLowerCase();
row.style.display = text.includes(input) ? "" : "none";
});
}
</script>
<script>
document.addEventListener("DOMContentLoaded", function () {
// Ambil semua tombol dengan class "edit-btn"
let editButtons = document.querySelectorAll(".edit-btn");
editButtons.forEach(function (button) {
button.addEventListener("click", function () {
// Ambil data dari atribut data-*
let id = this.getAttribute("data-id");
let nama = this.getAttribute("data-nama");
let subkriteriaId = this.getAttribute("data-subkriteria");
// Set nilai input di modal
document.getElementById("edit_id").value = id;
document.getElementById("edit_nama_alternatif").value = nama;
// Set dropdown "Jenis Pakaian"
let dropdown = document.getElementById("edit_subkriteria_id");
for (let i = 0; i < dropdown.options.length; i++) {
if (dropdown.options[i].value == subkriteriaId) {
dropdown.options[i].selected = true;
break;
}
}
// Set action form ke URL update
document.getElementById("formEdit").action = "/alternatif/" + id;
});
});
});
</script>
<script>
$(document).on('click', '.btn-edit', function() {
var id = $(this).data('id');
$.get("/admin/dataalternatif/" + id + "/edit", function(data) {
$('#edit_id').val(data.id);
$('#edit_nama_alternatif').val(data.nama_alternatif);
// Update form action agar konsisten
$('#formEdit').attr('action', '/admin/dataalternatif/' + id);
// Tampilkan modal
$('#modalEdit').modal('show');
});
});
</script>
<script>
$('#modalEdit').on('show.bs.modal', function (event) {
let button = $(event.relatedTarget);
let id = button.data('id'); // Pastikan tombol punya data-id
let nama = button.data('nama');
let subkriteria_id = button.data('subkriteria');
let gambar = button.data('gambar'); // Optional
let modal = $(this);
modal.find('#edit_id').val(id);
modal.find('#edit_nama_alternatif').val(nama);
modal.find('#edit_subkriteria_id').val(subkriteria_id);
// Set form action URL (pastikan sesuai route update)
$('#formEdit').attr('action', '/admin/alternatif/' + id);
});
</script>
<script>
document.addEventListener("DOMContentLoaded", function () {
let editButtons = document.querySelectorAll(".edit-btn");
editButtons.forEach(function (button) {
button.addEventListener("click", function () {
let id = this.getAttribute("data-id");
let nama = this.getAttribute("data-nama"); // Ambil nama alternatif dari tombol
// Masukkan data ke input di modal
document.getElementById("edit_nama_alternatif").value = nama || ""; // Jangan biarkan NULL
document.getElementById("formEdit").action = "/alternatif/" + id;
});
});
});
</script>
<script>
document.getElementById("filterKriteria").addEventListener("change", function() {
let selectedValue = this.value;
let rows = document.querySelectorAll(".data-row");
rows.forEach(row => {
if (selectedValue === "" || row.dataset.kriteriaId === selectedValue) {
row.style.display = "";
} else {
row.style.display = "none";
}
});
});
</script>
<script>
$(document).ready(function () {
// Form Edit Data
$('#formEdit').submit(function (event) {
event.preventDefault(); // Mencegah reload halaman
let form = $(this);
let url = form.attr('action');
let formData = form.serialize(); // Ambil data form
$.ajax({
url: url,
type: "POST",
data: formData,
dataType: "json",
success: function (response) {
console.log("Respon dari server:", response); // Debugging
if (response.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: response.message || 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire({
icon: 'error',
title: 'Gagal!',
text: response.message || "Data tidak dapat diperbarui.",
});
}
},
error: function (xhr) {
console.log("Error AJAX:", xhr.responseText);
let errorMsg = "Terjadi kesalahan!";
if (xhr.responseJSON && xhr.responseJSON.message) {
errorMsg = xhr.responseJSON.message;
}
Swal.fire({
icon: 'error',
title: 'Oops...',
text: errorMsg,
});
}
});
});
// SweetAlert untuk konfirmasi hapus data
$(document).on('click', '.delete-button', function (event) {
event.preventDefault();
let button = $(this);
let form = button.closest('form');
let url = form.attr('action');
let row = button.closest('tr'); // Ambil elemen baris yang ingin dihapus
Swal.fire({
title: "Apakah Anda yakin?",
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Ya, hapus!",
cancelButtonText: "Batal"
}).then((result) => {
if (result.isConfirmed) {
$.ajax({
url: url,
type: "POST",
data: {
_method: "DELETE",
_token: $('meta[name="csrf-token"]').attr('content')
},
success: function (data) {
if (data.success) {
// Animasi fade out sebelum elemen dihapus
row.fadeOut(300, function () {
$(this).remove();
updateRowNumbers(); // Update nomor setelah dihapus
});
Swal.fire({
icon: 'success',
title: 'Data Terhapus!',
text: 'Data berhasil dihapus.',
showConfirmButton: false,
timer: 1500
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat dihapus.", "error");
}
},
error: function () {
Swal.fire("Error!", "Terjadi kesalahan saat menghapus data.", "error");
}
});
}
});
});
// Fungsi untuk memperbarui nomor urut setelah data dihapus
function updateRowNumbers() {
$('tbody tr').each(function (index) {
$(this).find('td:first').text(index + 1);
});
}
// Tampilkan SweetAlert jika ada session success
let successMessage = "{{ session('success') }}";
if (successMessage && successMessage.trim() !== "") {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: successMessage,
showConfirmButton: false,
timer: 1500
});
}
});
</script>
@endsection

View File

@ -68,7 +68,7 @@
<!-- Data Kriteria -->
<div class="col-xl-4 col-md-6 mb-4">
<a href="{{ route('admin.kriteria.index') }}" class="card-link">
<a href="#">
<div class="card border-left-primary shadow h-100 py-2">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
@ -81,10 +81,10 @@
</div>
</a>
</div>
<!-- Data Sub Kriteria -->
<div class="col-xl-4 col-md-6 mb-4">
<a href="{{ $kriteriaId ? route('admin.pages.subkriteria.kriteria', ['id' => $kriteriaId]) : '#' }}" class="card-link">
<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">
@ -97,15 +97,15 @@
</div>
</a>
</div>
<!-- Data Alternatif -->
<div class="col-xl-4 col-md-6 mb-4">
<a href="{{ route('admin.alternatif.index') }}" class="text-decoration-none">
<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: {{ $totalAlternatif }}
Data Alternatif: {{ $totalPakaian }}
</span>
<i class="bi bi-person-lines-fill text-gray-400" style="font-size: 1.5rem;"></i>
</div>
@ -113,8 +113,8 @@
</div>
</a>
</div>
<!-- Data Penilaian -->
{{-- <!-- 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">
@ -127,7 +127,7 @@
</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">
@ -139,7 +139,7 @@
</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">
@ -150,7 +150,7 @@
</div>
</div>
</div>
</div>
</div> --}}
</div>
@endsection
@endsection

View File

@ -3,61 +3,64 @@
@section('title', 'Tambah Data Kriteria')
@section('content')
<h1 class="h3 mb-4 text-grey-800">
<i class="bi bi-database"></i> Data Kriteria
</h1>
<h1 class="h3 mb-4 text-grey-800">
<i class="bi bi-database"></i> Data Kriteria
</h1>
<div class="card shadow mb-4">
<div class="card-header bg-white d-flex justify-content-between align-items-center">
<span style="color: #006400;" class="fw-bold">
<i class="bi bi-plus-circle"></i> Tambah Data Kriteria
</span>
<a href="{{ route('admin.kriteria.index') }}" class="btn" style="background-color: #90ee90; border-color: #90ee90; color: black;">
<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
<div class="card shadow mb-4">
<div class="card-header bg-white d-flex justify-content-between align-items-center">
<span style="color: #006400;" class="fw-bold">
<i class="bi bi-plus-circle"></i> Tambah Data Kriteria
</span>
<a href="{{ route('admin.kriteria.index') }}" class="btn"
style="background-color: #90ee90; border-color: #90ee90; color: black;">
<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.kriteria.store') }}" method="POST">
@csrf
<div class="row">
<div class="col-md-6 mb-3">
<label for="kode_kriteria" class="form-label">Kode Kriteria</label>
<input type="text" class="form-control" id="kode_kriteria" name="kode_kriteria" required>
<form action="{{ route('admin.kriteria.store') }}" method="POST">
@csrf
<div class="row">
<div class="col-md-6 mb-3">
<label for="kode_kriteria" class="form-label">Kode Kriteria</label>
<input type="text" class="form-control" id="kode_kriteria" name="kode_kriteria" required>
</div>
<div class="col-md-6 mb-3">
<label for="nama_kriteria" class="form-label">Nama Kriteria</label>
<input type="text" class="form-control" id="nama_kriteria" name="nama_kriteria" required>
</div>
<div class="col-md-6 mb-3">
<label for="bobot" class="form-label">Bobot</label>
<input type="number" step="0.01" class="form-control" id="bobot" name="bobot" required>
</div>
<div class="col-md-6 mb-3">
<label for="jenis" class="form-label">Jenis</label>
<select class="form-control" id="jenis" name="jenis" required>
<option value="" selected disabled>--Pilih Jenis--</option>
<option value="BENEFIT">Benefit</option>
<option value="COST">Cost</option>
</select>
</div>
</div>
<div class="col-md-6 mb-3">
<label for="nama_kriteria" class="form-label">Nama Kriteria</label>
<input type="text" class="form-control" id="nama_kriteria" name="nama_kriteria" required>
</div>
<div class="col-md-6 mb-3">
<label for="bobot" class="form-label">Bobot</label>
<input type="number" step="0.01" class="form-control" id="bobot" name="bobot" required>
</div>
<div class="col-md-6 mb-3">
<label for="jenis" class="form-label">Jenis</label>
<select class="form-control" id="jenis" name="jenis" required>
<option value="" selected disabled>--Pilih Jenis--</option>
<option value="Benefit">Benefit</option>
<option value="Cost">Cost</option>
</select>
</div>
</div>
<button type="submit" class="btn me-3" style="background-color: #006400; border-color: #006400; color: white;">
<button type="submit" class="btn me-3"
style="background-color: #006400; border-color: #006400; color: white;">
<i></i> Simpan
</button>
<button type="reset" class="btn" style="background-color: #90ee90; border-color: #90ee90; color: black; margin-left: 10px;">
<button type="reset" class="btn"
style="background-color: #90ee90; border-color: #90ee90; color: black; margin-left: 10px;">
<i class="bi bi-arrow-clockwise"></i> Reset
</button>
</form>
</form>
</div>
</div>
</div>
@endsection

View File

@ -3,53 +3,59 @@
@section('title', 'Edit Data Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-pencil-square"></i> Edit Data Kriteria
</h1>
</div>
<div class="card shadow mb-4">
<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.kriteria.update', $kriteria->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3">
<label for="kode_kriteria" class="form-label">Kode Kriteria</label>
<input type="text" class="form-control" id="kode_kriteria" name="kode_kriteria" value="{{ $kriteria->kode_kriteria }}" required>
</div>
<div class="mb-3">
<label for="nama_kriteria" class="form-label">Nama Kriteria</label>
<input type="text" class="form-control" id="nama_kriteria" name="nama_kriteria" value="{{ $kriteria->nama_kriteria }}" required>
</div>
<div class="mb-3">
<label for="bobot" class="form-label">Bobot</label>
<input type="number" step="0.01" class="form-control" id="bobot" name="bobot" value="{{ $kriteria->bobot }}" required>
</div>
<div class="mb-3">
<label for="jenis" class="form-label">Jenis</label>
<select class="form-control" id="jenis" name="jenis" required>
<option value="Benefit" {{ $kriteria->jenis == 'Benefit' ? 'selected' : '' }}>Benefit</option>
<option value="Cost" {{ $kriteria->jenis == 'Cost' ? 'selected' : '' }}>Cost</option>
</select>
</div>
<button type="submit" class="btn" style="background-color: #006400; border-color: #006400; color: white;">
Simpan
</button>
<a href="{{ route('admin.kriteria.index') }}" class="btn" style="background-color: #90ee90; border-color: #90ee90; color: black;">
Kembali
</a>
</form>
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-pencil-square"></i> Edit Data Kriteria
</h1>
</div>
<div class="card shadow mb-4">
<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.kriteria.update', $kriteria->id) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3">
<label for="kode_kriteria" class="form-label">Kode Kriteria</label>
<input type="text" class="form-control" id="kode_kriteria" name="kode_kriteria"
value="{{ $kriteria->kode_kriteria }}" required>
</div>
<div class="mb-3">
<label for="nama_kriteria" class="form-label">Nama Kriteria</label>
<input type="text" class="form-control" id="nama_kriteria" name="nama_kriteria"
value="{{ $kriteria->nama_kriteria }}" required>
</div>
<div class="mb-3">
<label for="bobot" class="form-label">Bobot</label>
<input type="number" step="0.01" class="form-control" id="bobot" name="bobot"
value="{{ $kriteria->bobot }}" required>
</div>
<div class="mb-3">
<label for="jenis" class="form-label">Jenis</label>
<select class="form-control" id="jenis" name="jenis" required>
<option value="BENEFIT" {{ $kriteria->jenis == 'BENEFIT' ? 'selected' : '' }}>Benefit</option>
<option value="COST" {{ $kriteria->jenis == 'COST' ? 'selected' : '' }}>Cost</option>
</select>
</div>
<button type="submit" class="btn"
style="background-color: #006400; border-color: #006400; color: white;">
Simpan
</button>
<a href="{{ route('admin.kriteria.index') }}" class="btn"
style="background-color: #90ee90; border-color: #90ee90; color: black;">
Kembali
</a>
</form>
</div>
</div>
</div>
@endsection

View File

@ -3,104 +3,109 @@
@section('title', 'Data Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-box"></i> Data Kriteria
</h1>
<a href="{{ route('admin.kriteria.create') }}" class="btn btn-success" style="background-color: #006400; border-color: #004d00;">
<i></i> Tambah Data
</a>
</div>
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold" style="color: #006400;">
<i class="bi bi-table"></i> Daftar Data Kriteria
</h6>
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-box"></i> Data Kriteria
</h1>
<a href="{{ route('admin.kriteria.create') }}" class="btn btn-success"
style="background-color: #006400; border-color: #004d00;">
<i></i> Tambah Data
</a>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center" style="width: 120px;">Kode Kriteria</th>
<th class="text-center">Nama Kriteria</th>
<th class="text-center">Bobot</th>
<th class="text-center">Jenis</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($kriteria as $key => $item)
<tr>
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center">{{ $item->kode_kriteria }}</td>
<td class="text-center">{{ $item->nama_kriteria }}</td>
<td class="text-center">{{ $item->bobot }}</td>
<td class="text-center">{{ $item->jenis }}</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<a href="{{ route('admin.kriteria.edit', ['id' => $item->id]) }}" class="btn btn-warning btn-sm mx-1">
<i class="bi bi-pencil"></i>
</a>
<button type="button" class="btn btn-danger btn-sm mx-1 delete-button" data-id="{{ $item->id }}">
<i class="bi bi-trash"></i>
</button>
<form id="delete-form-{{ $item->id }}" action="{{ route('admin.kriteria.destroy', $item->id) }}" method="POST" style="display: none;">
@csrf
@method('DELETE')
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold" style="color: #006400;">
<i class="bi bi-table"></i> Daftar Data Kriteria
</h6>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center" style="width: 120px;">Kode Kriteria</th>
<th class="text-center">Nama Kriteria</th>
<th class="text-center">Bobot</th>
<th class="text-center">Jenis</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($kriteria as $key => $item)
<tr>
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center">{{ $item->kode_kriteria }}</td>
<td class="text-center">{{ $item->nama_kriteria }}</td>
<td class="text-center">{{ $item->bobot }}</td>
<td class="text-center">{{ $item->jenis }}</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<a href="{{ route('admin.kriteria.edit', $item->id) }}"
class="btn btn-warning btn-sm mx-1">
<i class="bi bi-pencil"></i>
</a>
<form action="{{ route('admin.kriteria.destroy', $item->id) }}" method="POST"
class="d-inline" onsubmit="return confirm('Yakin ingin menghapus data ini?')">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm mx-1">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- SweetAlert CDN -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<!-- SweetAlert CDN -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
@if (session('success'))
<script>
Swal.fire({
title: 'Berhasil!',
text: '{{ session('success') }}',
icon: 'success',
timer: 3000,
showConfirmButton: false
});
</script>
@endif
@if (session('success'))
<script>
Swal.fire({
title: 'Berhasil!',
text: '{{ session('success') }}',
icon: 'success',
timer: 3000,
showConfirmButton: false
});
</script>
@endif
document.addEventListener('DOMContentLoaded', function() {
const deleteButtons = document.querySelectorAll('.delete-button');
<script>
document.addEventListener('DOMContentLoaded', function () {
const deleteButtons = document.querySelectorAll('.delete-button');
deleteButtons.forEach(button => {
button.addEventListener('click', function () {
const id = this.getAttribute('data-id');
Swal.fire({
title: 'Apakah Anda yakin?',
text: 'Data ini akan dihapus secara permanen!',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#d33',
cancelButtonColor: '#3085d6',
confirmButtonText: 'Ya, hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
if (result.isConfirmed) {
document.getElementById('delete-form-' + id).submit();
}
deleteButtons.forEach(button => {
button.addEventListener('click', function() {
const id = this.getAttribute('data-id');
Swal.fire({
title: 'Apakah Anda yakin?',
text: 'Data ini akan dihapus secara permanen!',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#d33',
cancelButtonColor: '#3085d6',
confirmButtonText: 'Ya, hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
if (result.isConfirmed) {
document.getElementById('delete-form-' + id).submit();
}
});
});
});
});
});
</script>
@endsection
</script>
@endsection

View File

@ -0,0 +1,365 @@
@extends('admin.layouts.base')
@section('title', 'Data Alternatif')
@section('content')
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
@if (session('success'))
<script>
Swal.fire({
title: 'Berhasil!',
text: '{{ session('success') }}',
icon: 'success',
timer: 3000,
showConfirmButton: false
});
</script>
@endif
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Alternatif
</h1>
</div>
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold" style="color: #064E3B;">
<i class="bi bi-table"></i> Daftar Data Alternatif
</h6>
<button type="button" class="btn" style="background-color: #064E3B; color: white;" data-bs-toggle="modal"
data-bs-target="#modalTambah">
<i></i> Tambah Data
</button>
</div>
<div class="card-body">
<form method="GET" id="entriesForm" action="{{ route('admin.pakaian.index') }}"
class="d-flex justify-content-between align-items-center mb-3 flex-wrap gap-3">
<div class="d-flex align-items-center">
<label for="entriesPerPage" class="me-2">Show</label>
<select name="entries" id="entriesPerPage" class="form-select me-3"
onchange="document.getElementById('entriesForm').submit()">
<option value="10" {{ request('entries') == 10 ? 'selected' : '' }}>10</option>
<option value="25" {{ request('entries') == 25 ? 'selected' : '' }}>25</option>
<option value="50" {{ request('entries') == 50 ? 'selected' : '' }}>50</option>
</select>
<span class="me-3">entries</span>
</div>
<div class="d-flex align-items-center gap-2">
<label for="search" class="me-2">Search:</label>
<input type="text" name="search" id="search" class="form-control" placeholder="Search..."
value="{{ request('search') }}">
<button type="submit" class="btn btn-primary">Cari</button>
</div>
</form>
<div class="table-responsive">
<table class="table table-bordered">
<thead class="table-light text-center">
<tr>
<th>No</th>
<th>Gambar</th>
<th>Nama Pakaian</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@php $no = ($alternatif->currentPage() - 1) * $alternatif->perPage() + 1; @endphp
@foreach ($alternatif as $item)
<tr class="text-center">
<td>{{ $no++ }}</td>
<td class="text-center">
@if ($item->img)
<img src="{{ asset($item->img) }}" alt="Gambar"
class="img-fluid rounded object-fit-cover"
style="width: 100px; height: 100px; object-fit: cover;">
@else
Tidak ada gambar
@endif
</td>
<td>{{ $item->nama_pakaian }}</td>
<td class="text-center">
<!-- Tombol Info -->
<button class="btn btn-info btn-sm" data-bs-toggle="modal"
data-bs-target="#infoModal{{ $item->id }}">
Info
</button>
<!-- Tombol Edit -->
<button class="btn btn-warning btn-sm" data-bs-toggle="modal"
data-bs-target="#modalEdit{{ $item->id }}">
Edit
</button>
@foreach ($alternatif as $item)
<!-- Modal Info -->
<div class="modal fade" id="infoModal{{ $item->id }}" tabindex="-1"
aria-labelledby="infoModalLabel{{ $item->id }}" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="infoModalLabel{{ $item->id }}">
Detail Subkriteria - {{ $item->nama_pakaian }}
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Kriteria</th>
<th>Subkriteria</th>
<th>Nilai</th>
<th>Range Harga</th>
</tr>
</thead>
<tbody>
@foreach ($item->subKriterias as $sub)
<tr>
<td>{{ $sub->kriteria->nama_kriteria ?? '-' }}</td>
<td>{{ $sub->nama_sub }}</td>
<td>{{ $sub->nilai }}</td>
<td>
@if ($sub->kriteria->nama_kriteria === 'Harga')
Rp{{ number_format($sub->min_harga, 0, ',', '.') }}
-
Rp{{ number_format($sub->max_harga, 0, ',', '.') }}
@else
-
@endif
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">Tutup</button>
</div>
</div>
</div>
</div>
@endforeach
</td>
</tr>
@endforeach
</tbody>
</table>
<!-- Pagination -->
<div class="d-flex justify-content-end">
{{ $alternatif->appends(request()->query())->links('vendor.pagination.bootstrap-5') }}
</div>
</div>
</div>
</div>
<!-- Modal Tambah Data Pakaian -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<!-- Header -->
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Pakaian
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<!-- Body -->
<div class="modal-body">
<form action="{{ route('admin.pakaian.store') }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="mb-3">
<label for="nama_pakaian" class="form-label">Nama Pakaian</label>
<input type="text" class="form-control" name="nama_pakaian" required>
</div>
<div class="mb-3">
<label for="harga" class="form-label">Harga</label>
<input type="number" class="form-control" name="harga" required>
</div>
<div class="mb-3">
<label for="img" class="form-label">Upload Gambar</label>
<input type="file" class="form-control" name="img" accept="image/*">
</div>
<div class="d-flex justify-content-end gap-2">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
@foreach ($alternatif as $item)
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit{{ $item->id }}" tabindex="-1"
aria-labelledby="modalEdit{{ $item->id }}" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEdit{{ $item->id }}">Edit Data Pakaian</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form method="POST" action="{{ route('admin.pakaian.update', $item->id) }}"
enctype="multipart/form-data">
@csrf
@method('PUT')
<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($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>
.label-spacing {
margin-right: 0.3rem;
/* Jarak antara label dan select */
}
.search-input {
width: 200px;
/* Lebar input search */
}
.justify-between {
justify-content: space-between;
}
.pagination {
display: flex;
justify-content: flex-end;
/* Geser ke pojok kanan */
align-items: center;
padding: 10px;
}
.pagination .page-item .page-link {
font-size: 14px;
padding: 6px 12px;
border-radius: 5px;
border: none;
color: white;
background-color: #064E3B;
/* Warna biru */
margin: 0 2px;
transition: 0.3s ease-in-out;
}
.pagination .page-item.active .page-link {
background-color: #053B2D;
/* Biru lebih gelap */
font-weight: bold;
}
.pagination .page-item .page-link:hover {
background-color: #046C4E;
}
.pagination .page-item.disabled .page-link {
background-color: #e9ecef;
color: #6c757d;
cursor: not-allowed;
}
.entries-form {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 1rem;
margin-bottom: 1rem;
}
.entries-left,
.entries-right {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 14px;
}
.entries-left label,
.entries-right label {
margin: 0;
line-height: 1;
}
.entries-left select,
.entries-right input[type="text"] {
padding: 4px 8px;
height: 32px;
font-size: 14px;
border: 1px solid #ccc;
border-radius: 4px;
}
.entries-right button {
height: 32px;
padding: 0 12px;
font-size: 14px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 4px;
cursor: pointer;
}
.entries-right button:hover {
background-color: #0056b3;
}
</style>
@endsection

View File

@ -1,303 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria
</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 text-primary">
<i class="bi bi-table"></i> Cuaca Acara (C6)
</h6>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalTambah">
<i class="bi bi-plus-circle"></i> Tambah Data
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Sub Kriteria</th>
<th class="text-center">Nilai</th>
<th class="text-center">Kriteria</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($subkriteria as $key => $item)
<tr id="subkriteria_{{ $item->id }}">
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center nama">{{ $item->nama_subkriteria }}</td>
<td class="text-center nilai">{{ $item->nilai }}</td>
<td class="text-center">{{ $item->datakriteria->nama_kriteria ?? $item->kriteria_id }}</td>
<td class="text-center">
<div class="d-flex justify-content-center" style="gap: 10px;">
<button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#modalEdit"
data-id="{{ $item->id }}"
data-nama="{{ $item->nama_subkriteria }}"
data-nilai="{{ $item->nilai }}"
data-kriteria="{{ $item->kriteria_id }}">
<i class="bi bi-pencil"></i>
</button>
<form action="{{ route('admin.subkriteria.destroy', $item->id) }}" method="POST" class="delete-form">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm delete-button">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Modal Tambah Data -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Sub Kriteria
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{{ route('admin.subkriteria.cuacaacara.store') }}" method="POST">
@csrf
<!-- Nama Sub Kriteria -->
<div class="mb-3">
<label for="nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="nama_subkriteria" name="nama_subkriteria" required>
</div>
<!-- Nilai -->
<div class="mb-3">
<label for="nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="nilai" name="nilai" min="1" max="5" required>
</div>
<!-- Kriteria -->
<div class="mb-3">
<label for="kriteria_id" class="form-label fw-bold">Kriteria</label>
<select class="form-select" id="kriteria_id" name="kriteria_id" required>
<option value="" disabled selected>--- Pilih Kriteria ---</option>
@foreach($datakriteria as $kriteria)
<option value="{{ $kriteria->id }}">{{ $kriteria->nama_kriteria }}</option>
@endforeach
</select>
</div>
<!-- Tombol Simpan & Batal -->
<div class="d-flex justify-content-end" style="gap: 10px;">
<button type="button" class="btn btn-warning" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit" tabindex="-1" aria-labelledby="modalEditLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEditLabel">Edit Sub Kriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="formEdit" method="POST">
@csrf
@method('PUT')
<div class="modal-body">
<input type="hidden" id="edit_id" name="id">
<div class="mb-3">
<label for="edit_nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="edit_nama_subkriteria" name="nama_subkriteria" required>
</div>
<div class="mb-3">
<label for="edit_nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="edit_nilai" name="nilai" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>
<script>
$(document).on('click', '.btn-edit', function() {
var id = $(this).data('id');
$.get("/admin/subkriteria/" + id + "/edit", function(data) {
$('#edit_id').val(data.id);
$('#edit_nama_subkriteria').val(data.nama_subkriteria);
$('#edit_nilai').val(data.nilai);
// Update form action
$('#formEdit').attr('action', '/admin/subkriteria/' + id);
// Tampilkan modal
$('#modalEdit').modal('show');
});
});
</script>
<script>
document.querySelectorAll('button[data-bs-target="#modalEdit"]').forEach(button => {
button.addEventListener('click', function () {
const id = this.getAttribute('data-id');
const nama = this.getAttribute('data-nama');
const nilai = this.getAttribute('data-nilai');
const kriteria = this.getAttribute('data-kriteria');
document.getElementById('edit_id').value = id;
document.getElementById('edit_nama_subkriteria').value = nama;
document.getElementById('edit_nilai').value = nilai;
document.getElementById('formEdit').action = `/admin/subkriteria/${id}`;
});
});
</script>
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// Fungsi untuk memperbarui nomor urut setelah penghapusan
function updateRowNumbers() {
let rows = document.querySelectorAll("#dataTable tbody tr");
rows.forEach((row, index) => {
let numberCell = row.querySelector("td:first-child");
if (numberCell) {
numberCell.textContent = index + 1; // Perbarui nomor urut
}
});
}
// SweetAlert untuk konfirmasi hapus data
document.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function(event) {
event.preventDefault();
Swal.fire({
title: "Apakah Anda yakin?",
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Ya, hapus!",
cancelButtonText: "Batal"
}).then((result) => {
if (result.isConfirmed) {
let form = this.closest('form');
let url = form.action;
fetch(url, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Accept': 'application/json'
},
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById(`subkriteria_${data.id}`)?.remove();
updateRowNumbers();
Swal.fire({
icon: 'success',
title: 'Data Terhapus!',
text: 'Data berhasil dihapus.',
showConfirmButton: false,
timer: 1500
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat dihapus.", "error");
}
})
.catch(error => {
Swal.fire("Error!", "Terjadi kesalahan saat menghapus data.", "error");
});
}
});
});
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -1,156 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria untuk: {{ $kriteria->nama_kriteria }}
</h1>
<a href="{{ route('admin.subkriteria.create', ['id' => $kriteria->id]) }}" class="btn" style="background-color: #006400; border-color: #006400; color: white;">
<i></i> Tambah Data
</a>
</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: #006400;">
<i class="bi bi-table"></i> Daftar Sub Kriteria
</h6>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Sub Kriteria</th>
<th class="text-center">Nilai</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($subkriterias as $key => $sub)
<tr>
<td class="text-center">{{ $key + 1 }}</td>
<td>{{ $sub->nama_subkriteria }}</td>
<td class="text-center">{{ $sub->nilai }}</td>
<td class="text-center">
<div class="d-flex justify-content-center">
<a href="{{ route('admin.subkriteria.edit', $sub->id) }}" class="btn btn-warning btn-sm mr-3">
<i class="bi bi-pencil"></i>
</a>
<!-- Form untuk hapus subkriteria -->
<form action="{{ route('subkriteria.destroy', $sub->id) }}" method="POST" class="form-hapus">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm"><i class="fas fa-trash"></i></button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// SweetAlert untuk konfirmasi hapus data
document.addEventListener('DOMContentLoaded', function () {
const forms = document.querySelectorAll('.form-hapus');
forms.forEach(form => {
form.addEventListener('submit', function (e) {
e.preventDefault(); // Cegah submit langsung
Swal.fire({
title: 'Yakin ingin menghapus?',
text: "Data tidak bisa dikembalikan!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#d33',
cancelButtonColor: '#3085d6',
confirmButtonText: 'Ya, hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
if (result.isConfirmed) {
form.submit(); // Lanjutkan submit jika dikonfirmasi
}
});
});
});
});
// Menampilkan SweetAlert saat ada pesan sukses dari server
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -1,303 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria
</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 text-primary">
<i class="bi bi-table"></i> Harga (C2)
</h6>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalTambah">
<i class="bi bi-plus-circle"></i> Tambah Data
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Sub Kriteria</th>
<th class="text-center">Nilai</th>
<th class="text-center">Kriteria</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($subkriteria as $key => $item)
<tr id="subkriteria_{{ $item->id }}">
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center nama">{{ $item->nama_subkriteria }}</td>
<td class="text-center nilai">{{ $item->nilai }}</td>
<td class="text-center">{{ $item->datakriteria->nama_kriteria ?? $item->kriteria_id }}</td>
<td class="text-center">
<div class="d-flex justify-content-center" style="gap: 10px;">
<button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#modalEdit"
data-id="{{ $item->id }}"
data-nama="{{ $item->nama_subkriteria }}"
data-nilai="{{ $item->nilai }}"
data-kriteria="{{ $item->kriteria_id }}">
<i class="bi bi-pencil"></i>
</button>
<form action="{{ route('admin.subkriteria.destroy', $item->id) }}" method="POST" class="delete-form">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm delete-button">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Modal Tambah Data -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Sub Kriteria
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{{ route('admin.subkriteria.harga.store') }}" method="POST">
@csrf
<!-- Nama Sub Kriteria -->
<div class="mb-3">
<label for="nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="nama_subkriteria" name="nama_subkriteria" required>
</div>
<!-- Nilai -->
<div class="mb-3">
<label for="nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="nilai" name="nilai" min="1" max="5" required>
</div>
<!-- Kriteria -->
<div class="mb-3">
<label for="kriteria_id" class="form-label fw-bold">Kriteria</label>
<select class="form-select" id="kriteria_id" name="kriteria_id" required>
<option value="" disabled selected>--- Pilih Kriteria ---</option>
@foreach($datakriteria as $kriteria)
<option value="{{ $kriteria->id }}">{{ $kriteria->nama_kriteria }}</option>
@endforeach
</select>
</div>
<!-- Tombol Simpan & Batal -->
<div class="d-flex justify-content-end" style="gap: 10px;">
<button type="button" class="btn btn-warning" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit" tabindex="-1" aria-labelledby="modalEditLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEditLabel">Edit Sub Kriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="formEdit" method="POST">
@csrf
@method('PUT')
<div class="modal-body">
<input type="hidden" id="edit_id" name="id">
<div class="mb-3">
<label for="edit_nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="edit_nama_subkriteria" name="nama_subkriteria" required>
</div>
<div class="mb-3">
<label for="edit_nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="edit_nilai" name="nilai" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>
<script>
$(document).on('click', '.btn-edit', function() {
var id = $(this).data('id');
$.get("/admin/subkriteria/" + id + "/edit", function(data) {
$('#edit_id').val(data.id);
$('#edit_nama_subkriteria').val(data.nama_subkriteria);
$('#edit_nilai').val(data.nilai);
// Update form action
$('#formEdit').attr('action', '/admin/subkriteria/' + id);
// Tampilkan modal
$('#modalEdit').modal('show');
});
});
</script>
<script>
document.querySelectorAll('button[data-bs-target="#modalEdit"]').forEach(button => {
button.addEventListener('click', function () {
const id = this.getAttribute('data-id');
const nama = this.getAttribute('data-nama');
const nilai = this.getAttribute('data-nilai');
const kriteria = this.getAttribute('data-kriteria');
document.getElementById('edit_id').value = id;
document.getElementById('edit_nama_subkriteria').value = nama;
document.getElementById('edit_nilai').value = nilai;
document.getElementById('formEdit').action = `/admin/subkriteria/${id}`;
});
});
</script>
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// Fungsi untuk memperbarui nomor urut setelah penghapusan
function updateRowNumbers() {
let rows = document.querySelectorAll("#dataTable tbody tr");
rows.forEach((row, index) => {
let numberCell = row.querySelector("td:first-child");
if (numberCell) {
numberCell.textContent = index + 1; // Perbarui nomor urut
}
});
}
// SweetAlert untuk konfirmasi hapus data
document.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function(event) {
event.preventDefault();
Swal.fire({
title: "Apakah Anda yakin?",
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Ya, hapus!",
cancelButtonText: "Batal"
}).then((result) => {
if (result.isConfirmed) {
let form = this.closest('form');
let url = form.action;
fetch(url, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Accept': 'application/json'
},
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById(`subkriteria_${data.id}`)?.remove();
updateRowNumbers();
Swal.fire({
icon: 'success',
title: 'Data Terhapus!',
text: 'Data berhasil dihapus.',
showConfirmButton: false,
timer: 1500
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat dihapus.", "error");
}
})
.catch(error => {
Swal.fire("Error!", "Terjadi kesalahan saat menghapus data.", "error");
});
}
});
});
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -0,0 +1,361 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria untuk: {{ $kriteria->nama_kriteria }}
</h1>
<button type="button" class="btn btn-success mb-3" data-bs-toggle="modal" data-bs-target="#tambahSubkriteriaModal"
style="background-color: #006400; border-color: #006400; color: white;">
<i></i> Tambah Data
</button>
</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: #006400;">
<i class="bi bi-table"></i> Daftar Sub Kriteria
</h6>
</div>
<div class="card shadow mb-4">
<div class="card-header bg-white d-flex justify-content-between align-items-center">
<span class="fw-bold text-success">
Subkriteria untuk: {{ $kriteria->nama_kriteria }}
</span>
<a href="{{ route('admin.kriteria.index') }}" class="btn btn-sm btn-success">
<i class="bi bi-arrow-left"></i> Kembali
</a>
</div>
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Nama Subkriteria</th>
<th>Nilai</th>
<th>Min Harga</th>
<th>Max Harga</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
@forelse ($subkriterias as $sub)
<tr>
<td>{{ $sub->nama_sub }}</td>
<td>{{ $sub->nilai }}</td>
<td>{{ $sub->min_harga ?? '-' }}</td>
<td>{{ $sub->max_harga ?? '-' }}</td>
<td>
<!-- Tombol Edit -->
<button class="btn btn-sm btn-primary" data-bs-toggle="modal"
data-bs-target="#editModal{{ $sub->id }}">Edit</button>
<!-- Tombol Delete -->
<button class="btn btn-sm btn-danger" data-bs-toggle="modal"
data-bs-target="#deleteModal{{ $sub->id }}">Hapus</button>
</td>
</tr>
@empty
<tr>
<td colspan="4" class="text-center">Belum ada subkriteria</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
<!-- Modal Tambah Subkriteria -->
<div class="modal fade" id="tambahSubkriteriaModal" tabindex="-1" aria-labelledby="tambahSubkriteriaLabel"
aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<form action="{{ route('admin.subkriteria.store') }}" method="POST">
@csrf
<input type="hidden" name="kriteria_id" value="{{ $kriteria->id }}">
<div class="modal-header">
<h5 class="modal-title" id="tambahSubkriteriaLabel">Tambah Subkriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Tutup"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="kriteria_id" class="form-label">Pilih Kriteria</label>
<select class="form-select" id="kriteria_id" name="kriteria_id" required
onchange="toggleHargaFields()">
<option value="">-- Pilih Kriteria --</option>
@foreach ($kriterias as $kriteria)
<option value="{{ $kriteria->id }}" data-nama="{{ $kriteria->nama_kriteria }}">
{{ $kriteria->nama_kriteria }}
</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="nama_sub" class="form-label">Nama Subkriteria</label>
<input type="text" class="form-control" id="nama_sub" name="nama_sub" required>
</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 class="mb-3">
<label for="min_harga" class="form-label">Min Harga</label>
<input type="number" class="form-control" id="min_harga" name="min_harga" min="0">
</div>
<div class="mb-3">
<label for="max_harga" class="form-label">Max Harga</label>
<input type="number" class="form-control" id="max_harga" name="max_harga" min="0">
</div>
</div>
</div>
<script>
function toggleHargaFields() {
const select = document.getElementById('kriteria_id');
const selectedOption = select.options[select.selectedIndex];
const namaKriteria = selectedOption.getAttribute('data-nama');
const hargaFields = document.getElementById('harga-fields');
if (namaKriteria === 'Harga') {
hargaFields.style.display = 'block';
document.getElementById('min_harga').required = true;
document.getElementById('max_harga').required = true;
} else {
hargaFields.style.display = 'none';
document.getElementById('min_harga').required = false;
document.getElementById('max_harga').required = false;
}
}
</script>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>
{{-- Modal Edit --}}
@foreach ($subkriterias as $sub)
<div class="modal fade" id="editModal{{ $sub->id }}" tabindex="-1"
aria-labelledby="editModalLabel{{ $sub->id }}" aria-hidden="true">
<div class="modal-dialog">
<form action="{{ route('admin.subkriteria.update', $sub->id) }}" method="POST">
@csrf
@method('PUT')
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="editModalLabel{{ $sub->id }}">Edit Subkriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="kriteria_id" class="form-label">Kriteria</label>
<select class="form-select kriteria-select" data-id="{{ $sub->id }}"
name="kriteria_id" required>
@foreach ($kriterias as $kriteria)
<option value="{{ $kriteria->id }}" data-nama="{{ $kriteria->nama_kriteria }}"
{{ $sub->kriteria_id == $kriteria->id ? 'selected' : '' }}>
{{ $kriteria->nama_kriteria }}
</option>
@endforeach
</select>
</div>
<div class="mb-3">
<label for="nama_sub" class="form-label">Nama Subkriteria</label>
<input type="text" class="form-control" name="nama_sub" value="{{ $sub->nama_sub }}"
required>
</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="mb-3">
<label for="min_harga" class="form-label">Min Harga</label>
<input type="number" class="form-control" name="min_harga"
value="{{ $sub->min_harga }}">
</div>
<div class="mb-3">
<label for="max_harga" class="form-label">Max Harga</label>
<input type="number" class="form-control" name="max_harga"
value="{{ $sub->max_harga }}">
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Loop semua select.kriteria-select
document.querySelectorAll('.kriteria-select').forEach(select => {
const id = select.dataset.id;
const hargaFields = document.getElementById(`hargaFields${id}`);
function toggleHargaFields() {
const selectedOption = select.options[select.selectedIndex];
const namaKriteria = selectedOption.getAttribute('data-nama');
if (namaKriteria === 'Harga') {
hargaFields.style.display = 'block';
} else {
hargaFields.style.display = 'none';
}
}
// Tampilkan sesuai kondisi saat pertama kali modal muncul
toggleHargaFields();
// Tambahkan event saat value berubah
select.addEventListener('change', toggleHargaFields);
});
});
</script>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan Perubahan</button>
</div>
</div>
</form>
</div>
</div>
@endforeach
@foreach ($subkriterias as $sub)
<!-- Modal Delete -->
<div class="modal fade" id="deleteModal{{ $sub->id }}" tabindex="-1"
aria-labelledby="deleteModalLabel{{ $sub->id }}" aria-hidden="true">
<div class="modal-dialog">
<form action="{{ route('admin.subkriteria.destroy', $sub->id) }}" method="POST">
@csrf
@method('DELETE')
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteModalLabel{{ $sub->id }}">Konfirmasi Hapus</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body">
Apakah Anda yakin ingin menghapus subkriteria "<strong>{{ $sub->nama_sub }}</strong>"?
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-danger">Ya, Hapus</button>
</div>
</div>
</form>
</div>
</div>
@endforeach
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// SweetAlert untuk konfirmasi hapus data
document.addEventListener('DOMContentLoaded', function() {
const forms = document.querySelectorAll('.form-hapus');
forms.forEach(form => {
form.addEventListener('submit', function(e) {
e.preventDefault(); // Cegah submit langsung
Swal.fire({
title: 'Yakin ingin menghapus?',
text: "Data tidak bisa dikembalikan!",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#d33',
cancelButtonColor: '#3085d6',
confirmButtonText: 'Ya, hapus!',
cancelButtonText: 'Batal'
}).then((result) => {
if (result.isConfirmed) {
form.submit(); // Lanjutkan submit jika dikonfirmasi
}
});
});
});
});
// Menampilkan SweetAlert saat ada pesan sukses dari server
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -1,303 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria
</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 text-primary">
<i class="bi bi-table"></i> Jenis Acara (C1)
</h6>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalTambah">
<i class="bi bi-plus-circle"></i> Tambah Data
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Sub Kriteria</th>
<th class="text-center">Nilai</th>
<th class="text-center">Kriteria</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($subkriteria as $key => $item)
<tr id="subkriteria_{{ $item->id }}">
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center nama">{{ $item->nama_subkriteria }}</td>
<td class="text-center nilai">{{ $item->nilai }}</td>
<td class="text-center">{{ $item->datakriteria->nama_kriteria ?? $item->kriteria_id }}</td>
<td class="text-center">
<div class="d-flex justify-content-center" style="gap: 10px;">
<button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#modalEdit"
data-id="{{ $item->id }}"
data-nama="{{ $item->nama_subkriteria }}"
data-nilai="{{ $item->nilai }}"
data-kriteria="{{ $item->kriteria_id }}">
<i class="bi bi-pencil"></i>
</button>
<form action="{{ route('admin.subkriteria.destroy', $item->id) }}" method="POST" class="delete-form">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm delete-button">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Modal Tambah Data -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Sub Kriteria
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{{ route('admin.subkriteria.store') }}" method="POST">
@csrf
<!-- Nama Sub Kriteria -->
<div class="mb-3">
<label for="nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="nama_subkriteria" name="nama_subkriteria" required>
</div>
<!-- Nilai -->
<div class="mb-3">
<label for="nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="nilai" name="nilai" min="1" max="5" required>
</div>
<!-- Kriteria -->
<div class="mb-3">
<label for="kriteria_id" class="form-label fw-bold">Kriteria</label>
<select class="form-select" id="kriteria_id" name="kriteria_id" required>
<option value="" disabled selected>--- Pilih Kriteria ---</option>
@foreach($datakriteria as $kriteria)
<option value="{{ $kriteria->id }}">{{ $kriteria->nama_kriteria }}</option>
@endforeach
</select>
</div>
<!-- Tombol Simpan & Batal -->
<div class="d-flex justify-content-end" style="gap: 10px;">
<button type="button" class="btn btn-warning" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit" tabindex="-1" aria-labelledby="modalEditLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEditLabel">Edit Sub Kriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="formEdit" method="POST">
@csrf
@method('PUT')
<div class="modal-body">
<input type="hidden" id="edit_id" name="id">
<div class="mb-3">
<label for="edit_nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="edit_nama_subkriteria" name="nama_subkriteria" required>
</div>
<div class="mb-3">
<label for="edit_nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="edit_nilai" name="nilai" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>
<script>
$(document).on('click', '.btn-edit', function() {
var id = $(this).data('id');
$.get("/admin/subkriteria/" + id + "/edit", function(data) {
$('#edit_id').val(data.id);
$('#edit_nama_subkriteria').val(data.nama_subkriteria);
$('#edit_nilai').val(data.nilai);
// Update form action
$('#formEdit').attr('action', '/admin/subkriteria/' + id);
// Tampilkan modal
$('#modalEdit').modal('show');
});
});
</script>
<script>
document.querySelectorAll('button[data-bs-target="#modalEdit"]').forEach(button => {
button.addEventListener('click', function () {
const id = this.getAttribute('data-id');
const nama = this.getAttribute('data-nama');
const nilai = this.getAttribute('data-nilai');
const kriteria = this.getAttribute('data-kriteria');
document.getElementById('edit_id').value = id;
document.getElementById('edit_nama_subkriteria').value = nama;
document.getElementById('edit_nilai').value = nilai;
document.getElementById('formEdit').action = `/admin/subkriteria/${id}`;
});
});
</script>
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// Fungsi untuk memperbarui nomor urut setelah penghapusan
function updateRowNumbers() {
let rows = document.querySelectorAll("#dataTable tbody tr");
rows.forEach((row, index) => {
let numberCell = row.querySelector("td:first-child");
if (numberCell) {
numberCell.textContent = index + 1; // Perbarui nomor urut
}
});
}
// SweetAlert untuk konfirmasi hapus data
document.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function(event) {
event.preventDefault();
Swal.fire({
title: "Apakah Anda yakin?",
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Ya, hapus!",
cancelButtonText: "Batal"
}).then((result) => {
if (result.isConfirmed) {
let form = this.closest('form');
let url = form.action;
fetch(url, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Accept': 'application/json'
},
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById(`subkriteria_${data.id}`)?.remove();
updateRowNumbers();
Swal.fire({
icon: 'success',
title: 'Data Terhapus!',
text: 'Data berhasil dihapus.',
showConfirmButton: false,
timer: 1500
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat dihapus.", "error");
}
})
.catch(error => {
Swal.fire("Error!", "Terjadi kesalahan saat menghapus data.", "error");
});
}
});
});
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -1,303 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria
</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 text-primary">
<i class="bi bi-table"></i> Jenis Pakaian (C3)
</h6>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalTambah">
<i class="bi bi-plus-circle"></i> Tambah Data
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Sub Kriteria</th>
<th class="text-center">Nilai</th>
<th class="text-center">Kriteria</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($subkriteria as $key => $item)
<tr id="subkriteria_{{ $item->id }}">
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center nama">{{ $item->nama_subkriteria }}</td>
<td class="text-center nilai">{{ $item->nilai }}</td>
<td class="text-center">{{ $item->datakriteria->nama_kriteria ?? $item->kriteria_id }}</td>
<td class="text-center">
<div class="d-flex justify-content-center" style="gap: 10px;">
<button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#modalEdit"
data-id="{{ $item->id }}"
data-nama="{{ $item->nama_subkriteria }}"
data-nilai="{{ $item->nilai }}"
data-kriteria="{{ $item->kriteria_id }}">
<i class="bi bi-pencil"></i>
</button>
<form action="{{ route('admin.subkriteria.destroy', $item->id) }}" method="POST" class="delete-form">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm delete-button">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Modal Tambah Data -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Sub Kriteria
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{{ route('admin.subkriteria.jenispakaian.store') }}" method="POST">
@csrf
<!-- Nama Sub Kriteria -->
<div class="mb-3">
<label for="nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="nama_subkriteria" name="nama_subkriteria" required>
</div>
<!-- Nilai -->
<div class="mb-3">
<label for="nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="nilai" name="nilai" min="1" max="5" required>
</div>
<!-- Kriteria -->
<div class="mb-3">
<label for="kriteria_id" class="form-label fw-bold">Kriteria</label>
<select class="form-select" id="kriteria_id" name="kriteria_id" required>
<option value="" disabled selected>--- Pilih Kriteria ---</option>
@foreach($datakriteria as $kriteria)
<option value="{{ $kriteria->id }}">{{ $kriteria->nama_kriteria }}</option>
@endforeach
</select>
</div>
<!-- Tombol Simpan & Batal -->
<div class="d-flex justify-content-end" style="gap: 10px;">
<button type="button" class="btn btn-warning" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit" tabindex="-1" aria-labelledby="modalEditLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEditLabel">Edit Sub Kriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="formEdit" method="POST">
@csrf
@method('PUT')
<div class="modal-body">
<input type="hidden" id="edit_id" name="id">
<div class="mb-3">
<label for="edit_nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="edit_nama_subkriteria" name="nama_subkriteria" required>
</div>
<div class="mb-3">
<label for="edit_nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="edit_nilai" name="nilai" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>
<script>
$(document).on('click', '.btn-edit', function() {
var id = $(this).data('id');
$.get("/admin/subkriteria/" + id + "/edit", function(data) {
$('#edit_id').val(data.id);
$('#edit_nama_subkriteria').val(data.nama_subkriteria);
$('#edit_nilai').val(data.nilai);
// Update form action
$('#formEdit').attr('action', '/admin/subkriteria/' + id);
// Tampilkan modal
$('#modalEdit').modal('show');
});
});
</script>
<script>
document.querySelectorAll('button[data-bs-target="#modalEdit"]').forEach(button => {
button.addEventListener('click', function () {
const id = this.getAttribute('data-id');
const nama = this.getAttribute('data-nama');
const nilai = this.getAttribute('data-nilai');
const kriteria = this.getAttribute('data-kriteria');
document.getElementById('edit_id').value = id;
document.getElementById('edit_nama_subkriteria').value = nama;
document.getElementById('edit_nilai').value = nilai;
document.getElementById('formEdit').action = `/admin/subkriteria/${id}`;
});
});
</script>
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// Fungsi untuk memperbarui nomor urut setelah penghapusan
function updateRowNumbers() {
let rows = document.querySelectorAll("#dataTable tbody tr");
rows.forEach((row, index) => {
let numberCell = row.querySelector("td:first-child");
if (numberCell) {
numberCell.textContent = index + 1; // Perbarui nomor urut
}
});
}
// SweetAlert untuk konfirmasi hapus data
document.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function(event) {
event.preventDefault();
Swal.fire({
title: "Apakah Anda yakin?",
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Ya, hapus!",
cancelButtonText: "Batal"
}).then((result) => {
if (result.isConfirmed) {
let form = this.closest('form');
let url = form.action;
fetch(url, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Accept': 'application/json'
},
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById(`subkriteria_${data.id}`)?.remove();
updateRowNumbers();
Swal.fire({
icon: 'success',
title: 'Data Terhapus!',
text: 'Data berhasil dihapus.',
showConfirmButton: false,
timer: 1500
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat dihapus.", "error");
}
})
.catch(error => {
Swal.fire("Error!", "Terjadi kesalahan saat menghapus data.", "error");
});
}
});
});
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -1,303 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria
</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 text-primary">
<i class="bi bi-table"></i> Lokasi Acara (C5)
</h6>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalTambah">
<i class="bi bi-plus-circle"></i> Tambah Data
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Sub Kriteria</th>
<th class="text-center">Nilai</th>
<th class="text-center">Kriteria</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($subkriteria as $key => $item)
<tr id="subkriteria_{{ $item->id }}">
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center nama">{{ $item->nama_subkriteria }}</td>
<td class="text-center nilai">{{ $item->nilai }}</td>
<td class="text-center">{{ $item->datakriteria->nama_kriteria ?? $item->kriteria_id }}</td>
<td class="text-center">
<div class="d-flex justify-content-center" style="gap: 10px;">
<button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#modalEdit"
data-id="{{ $item->id }}"
data-nama="{{ $item->nama_subkriteria }}"
data-nilai="{{ $item->nilai }}"
data-kriteria="{{ $item->kriteria_id }}">
<i class="bi bi-pencil"></i>
</button>
<form action="{{ route('admin.subkriteria.destroy', $item->id) }}" method="POST" class="delete-form">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm delete-button">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Modal Tambah Data -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Sub Kriteria
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{{ route('admin.subkriteria.lokasiacara.store') }}" method="POST">
@csrf
<!-- Nama Sub Kriteria -->
<div class="mb-3">
<label for="nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="nama_subkriteria" name="nama_subkriteria" required>
</div>
<!-- Nilai -->
<div class="mb-3">
<label for="nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="nilai" name="nilai" min="1" max="5" required>
</div>
<!-- Kriteria -->
<div class="mb-3">
<label for="kriteria_id" class="form-label fw-bold">Kriteria</label>
<select class="form-select" id="kriteria_id" name="kriteria_id" required>
<option value="" disabled selected>--- Pilih Kriteria ---</option>
@foreach($datakriteria as $kriteria)
<option value="{{ $kriteria->id }}">{{ $kriteria->nama_kriteria }}</option>
@endforeach
</select>
</div>
<!-- Tombol Simpan & Batal -->
<div class="d-flex justify-content-end" style="gap: 10px;">
<button type="button" class="btn btn-warning" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit" tabindex="-1" aria-labelledby="modalEditLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEditLabel">Edit Sub Kriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="formEdit" method="POST">
@csrf
@method('PUT')
<div class="modal-body">
<input type="hidden" id="edit_id" name="id">
<div class="mb-3">
<label for="edit_nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="edit_nama_subkriteria" name="nama_subkriteria" required>
</div>
<div class="mb-3">
<label for="edit_nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="edit_nilai" name="nilai" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>
<script>
$(document).on('click', '.btn-edit', function() {
var id = $(this).data('id');
$.get("/admin/subkriteria/" + id + "/edit", function(data) {
$('#edit_id').val(data.id);
$('#edit_nama_subkriteria').val(data.nama_subkriteria);
$('#edit_nilai').val(data.nilai);
// Update form action
$('#formEdit').attr('action', '/admin/subkriteria/' + id);
// Tampilkan modal
$('#modalEdit').modal('show');
});
});
</script>
<script>
document.querySelectorAll('button[data-bs-target="#modalEdit"]').forEach(button => {
button.addEventListener('click', function () {
const id = this.getAttribute('data-id');
const nama = this.getAttribute('data-nama');
const nilai = this.getAttribute('data-nilai');
const kriteria = this.getAttribute('data-kriteria');
document.getElementById('edit_id').value = id;
document.getElementById('edit_nama_subkriteria').value = nama;
document.getElementById('edit_nilai').value = nilai;
document.getElementById('formEdit').action = `/admin/subkriteria/${id}`;
});
});
</script>
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// Fungsi untuk memperbarui nomor urut setelah penghapusan
function updateRowNumbers() {
let rows = document.querySelectorAll("#dataTable tbody tr");
rows.forEach((row, index) => {
let numberCell = row.querySelector("td:first-child");
if (numberCell) {
numberCell.textContent = index + 1; // Perbarui nomor urut
}
});
}
// SweetAlert untuk konfirmasi hapus data
document.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function(event) {
event.preventDefault();
Swal.fire({
title: "Apakah Anda yakin?",
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Ya, hapus!",
cancelButtonText: "Batal"
}).then((result) => {
if (result.isConfirmed) {
let form = this.closest('form');
let url = form.action;
fetch(url, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Accept': 'application/json'
},
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById(`subkriteria_${data.id}`)?.remove();
updateRowNumbers();
Swal.fire({
icon: 'success',
title: 'Data Terhapus!',
text: 'Data berhasil dihapus.',
showConfirmButton: false,
timer: 1500
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat dihapus.", "error");
}
})
.catch(error => {
Swal.fire("Error!", "Terjadi kesalahan saat menghapus data.", "error");
});
}
});
});
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -1,303 +0,0 @@
@extends('admin.layouts.base')
@section('title', 'Data Sub Kriteria')
@section('content')
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 text-grey-800">
<i class="bi bi-boxes"></i> Data Sub Kriteria
</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 text-primary">
<i class="bi bi-table"></i> Warna Pakaian (C4)
</h6>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalTambah">
<i class="bi bi-plus-circle"></i> Tambah Data
</button>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th class="text-center">No</th>
<th class="text-center">Nama Sub Kriteria</th>
<th class="text-center">Nilai</th>
<th class="text-center">Kriteria</th>
<th class="text-center">Aksi</th>
</tr>
</thead>
<tbody>
@foreach ($subkriteria as $key => $item)
<tr id="subkriteria_{{ $item->id }}">
<td class="text-center">{{ $key + 1 }}</td>
<td class="text-center nama">{{ $item->nama_subkriteria }}</td>
<td class="text-center nilai">{{ $item->nilai }}</td>
<td class="text-center">{{ $item->datakriteria->nama_kriteria ?? $item->kriteria_id }}</td>
<td class="text-center">
<div class="d-flex justify-content-center" style="gap: 10px;">
<button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#modalEdit"
data-id="{{ $item->id }}"
data-nama="{{ $item->nama_subkriteria }}"
data-nilai="{{ $item->nilai }}"
data-kriteria="{{ $item->kriteria_id }}">
<i class="bi bi-pencil"></i>
</button>
<form action="{{ route('admin.subkriteria.destroy', $item->id) }}" method="POST" class="delete-form">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger btn-sm delete-button">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<!-- Modal Tambah Data -->
<div class="modal fade" id="modalTambah" tabindex="-1" aria-labelledby="modalTambahLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalTambahLabel">
<i class="bi bi-plus-circle"></i> Tambah Sub Kriteria
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form action="{{ route('admin.subkriteria.warnapakaian.store') }}" method="POST">
@csrf
<!-- Nama Sub Kriteria -->
<div class="mb-3">
<label for="nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="nama_subkriteria" name="nama_subkriteria" required>
</div>
<!-- Nilai -->
<div class="mb-3">
<label for="nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="nilai" name="nilai" min="1" max="5" required>
</div>
<!-- Kriteria -->
<div class="mb-3">
<label for="kriteria_id" class="form-label fw-bold">Kriteria</label>
<select class="form-select" id="kriteria_id" name="kriteria_id" required>
<option value="" disabled selected>--- Pilih Kriteria ---</option>
@foreach($datakriteria as $kriteria)
<option value="{{ $kriteria->id }}">{{ $kriteria->nama_kriteria }}</option>
@endforeach
</select>
</div>
<!-- Tombol Simpan & Batal -->
<div class="d-flex justify-content-end" style="gap: 10px;">
<button type="button" class="btn btn-warning" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-success">Simpan</button>
</div>
</form>
</div>
</div>
</div>
</div>
<!-- Modal Edit -->
<div class="modal fade" id="modalEdit" tabindex="-1" aria-labelledby="modalEditLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="modalEditLabel">Edit Sub Kriteria</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form id="formEdit" method="POST">
@csrf
@method('PUT')
<div class="modal-body">
<input type="hidden" id="edit_id" name="id">
<div class="mb-3">
<label for="edit_nama_subkriteria" class="form-label">Nama Sub Kriteria</label>
<input type="text" class="form-control" id="edit_nama_subkriteria" name="nama_subkriteria" required>
</div>
<div class="mb-3">
<label for="edit_nilai" class="form-label">Nilai</label>
<input type="number" class="form-control" id="edit_nilai" name="nilai" required>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>
<script>
$(document).on('click', '.btn-edit', function() {
var id = $(this).data('id');
$.get("/admin/subkriteria/" + id + "/edit", function(data) {
$('#edit_id').val(data.id);
$('#edit_nama_subkriteria').val(data.nama_subkriteria);
$('#edit_nilai').val(data.nilai);
// Update form action
$('#formEdit').attr('action', '/admin/subkriteria/' + id);
// Tampilkan modal
$('#modalEdit').modal('show');
});
});
</script>
<script>
document.querySelectorAll('button[data-bs-target="#modalEdit"]').forEach(button => {
button.addEventListener('click', function () {
const id = this.getAttribute('data-id');
const nama = this.getAttribute('data-nama');
const nilai = this.getAttribute('data-nilai');
const kriteria = this.getAttribute('data-kriteria');
document.getElementById('edit_id').value = id;
document.getElementById('edit_nama_subkriteria').value = nama;
document.getElementById('edit_nilai').value = nilai;
document.getElementById('formEdit').action = `/admin/subkriteria/${id}`;
});
});
</script>
<!-- Tambahkan SweetAlert2 -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
// Fungsi untuk menampilkan SweetAlert sukses
function showSuccessMessage(message) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: message,
showConfirmButton: false,
timer: 1500
});
}
// Fungsi untuk memperbarui nomor urut setelah penghapusan
function updateRowNumbers() {
let rows = document.querySelectorAll("#dataTable tbody tr");
rows.forEach((row, index) => {
let numberCell = row.querySelector("td:first-child");
if (numberCell) {
numberCell.textContent = index + 1; // Perbarui nomor urut
}
});
}
// SweetAlert untuk konfirmasi hapus data
document.querySelectorAll('.delete-button').forEach(button => {
button.addEventListener('click', function(event) {
event.preventDefault();
Swal.fire({
title: "Apakah Anda yakin?",
text: "Data yang dihapus tidak dapat dikembalikan!",
icon: "warning",
showCancelButton: true,
confirmButtonColor: "#d33",
cancelButtonColor: "#3085d6",
confirmButtonText: "Ya, hapus!",
cancelButtonText: "Batal"
}).then((result) => {
if (result.isConfirmed) {
let form = this.closest('form');
let url = form.action;
fetch(url, {
method: 'DELETE',
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'Accept': 'application/json'
},
})
.then(response => response.json())
.then(data => {
if (data.success) {
document.getElementById(`subkriteria_${data.id}`)?.remove();
updateRowNumbers();
Swal.fire({
icon: 'success',
title: 'Data Terhapus!',
text: 'Data berhasil dihapus.',
showConfirmButton: false,
timer: 1500
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat dihapus.", "error");
}
})
.catch(error => {
Swal.fire("Error!", "Terjadi kesalahan saat menghapus data.", "error");
});
}
});
});
});
// SweetAlert setelah menambah data
document.addEventListener("DOMContentLoaded", function() {
const successMessage = "{{ session('success') }}";
if (successMessage.trim() !== "") {
showSuccessMessage(successMessage);
}
});
// SweetAlert setelah edit data
document.getElementById('formEdit')?.addEventListener('submit', function(event) {
event.preventDefault();
let form = this;
let url = form.action;
let formData = new FormData(form);
fetch(url, {
method: 'POST', // atau 'PUT' jika pakai PUT
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content,
'X-Requested-With': 'XMLHttpRequest'
},
})
.then(response => response.json())
.then(data => {
console.log(data);
if (data.success) {
Swal.fire({
icon: 'success',
title: 'Berhasil!',
text: 'Data berhasil diperbarui!',
showConfirmButton: false,
timer: 1500
}).then(() => {
location.reload();
});
} else {
Swal.fire("Gagal!", data.message || "Data tidak dapat diperbarui.", "error");
}
})
.catch(error => {
console.log("Error di fetch:", error);
Swal.fire("Error!", "Terjadi kesalahan saat mengupdate data.", "error");
});
});
</script>
@endsection

View File

@ -1,22 +1,15 @@
<?php
use App\Http\Controllers\Admin\AlternatifController;
use App\Http\Controllers\Admin\AuthController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Admin\DataKriteriaController;
use App\Http\Controllers\Admin\HasilAkhirController;
use App\Http\Controllers\Admin\PenilaianController;
use App\Http\Controllers\Admin\PerhitunganController;
use App\Http\Controllers\Admin\ResetPasswordController;
use App\Http\Controllers\Admin\RiwayatController;
use App\Http\Controllers\Admin\SubkriteriaController;
use App\Http\Controllers\Admin\UserController;
use App\Http\Controllers\ForgotPasswordController;
use App\Http\Controllers\Landingpage\DressController;
use App\Http\Controllers\Landingpage\HomeController;
use App\Http\Controllers\QuizController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\KriteriaController;
use App\Http\Controllers\Admin\AuthController;
use App\Http\Controllers\Admin\DashboardController;
use App\Http\Controllers\Landingpage\HomeController;
use App\Http\Controllers\SubKriteriaController;
use App\Http\Controllers\Admin\ResetPasswordController;
use App\Http\Controllers\PakaianController;
use App\Http\Controllers\SubKriteriaShowController;
/*
|--------------------------------------------------------------------------
@ -65,51 +58,58 @@ Route::post('/logout', function () {
})->name('logout');
// Dashboard
Route::get('/dashboard', [DashboardController::class, 'indexPage'])->name('dashboard');
Route::prefix('admin')->middleware(['auth'])->as('admin.')->group(function () {
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::resource('kriteria', KriteriaController::class);
Route::resource('subkriteria', SubkriteriaController::class);
Route::get('kriteria/subkriteria/{nama_kriteria}', [SubKriteriaShowController::class, 'indexShow'])->name('kriteria.subkriteria.index');
// Kriteria
Route::get('/kriteria', [DataKriteriaController::class, 'indexPage'])->name('admin.kriteria.index');
Route::get('/kriteria/create', [DataKriteriaController::class, 'create'])->name('admin.kriteria.create');
Route::post('/kriteria/store', [DataKriteriaController::class, 'store'])->name('admin.kriteria.store');
Route::get('/kriteria/{id}/edit', [DataKriteriaController::class, 'edit'])->name('admin.kriteria.edit');
Route::put('/kriteria/{id}/update', [DataKriteriaController::class, 'update'])->name('admin.kriteria.update');
Route::delete('/kriteria/{id}/delete', [DataKriteriaController::class, 'destroy'])->name('admin.kriteria.destroy');
Route::resource('pakaian', PakaianController::class);
});
// Sub Kriteria
Route::get('/admin/subkriteria/kriteria/{id}', [SubkriteriaController::class, 'showByKriteria'])->name('admin.pages.subkriteria.kriteria');
Route::get('/admin/subkriteria/kriteria/{id}/create', [SubkriteriaController::class, 'create'])->name('admin.subkriteria.create');
Route::post('/admin/subkriteria/store', [SubKriteriaController::class, 'store'])->name('admin.subkriteria.store');
Route::get('/admin/subkriteria/{id}/edit', [SubkriteriaController::class, 'edit'])->name('admin.subkriteria.edit');
Route::put('/admin/subkriteria/{id}', [SubkriteriaController::class, 'update'])->name('admin.pages.subkriteria.update');
Route::delete('/admin/subkriteria/{id}', [SubkriteriaController::class, 'destroy'])->name('subkriteria.destroy');
// // Kriteria
// Route::get('/kriteria', [DataKriteriaController::class, 'indexPage'])->name('admin.kriteria.index');
// Route::get('/kriteria/create', [DataKriteriaController::class, 'create'])->name('admin.kriteria.create');
// Route::post('/kriteria/store', [DataKriteriaController::class, 'store'])->name('admin.kriteria.store');
// Route::get('/kriteria/{id}/edit', [DataKriteriaController::class, 'edit'])->name('admin.kriteria.edit');
// Route::put('/kriteria/{id}/update', [DataKriteriaController::class, 'update'])->name('admin.kriteria.update');
// Route::delete('/kriteria/{id}/delete', [DataKriteriaController::class, 'destroy'])->name('admin.kriteria.destroy');
// Data alternatif
Route::get('/alternatif', [AlternatifController::class, 'indexPage'])->name('admin.alternatif.index');
Route::post('/admin/alternatif', [AlternatifController::class, 'store'])->name('admin.alternatif.store');
Route::get('/alternatif/{id}/edit', [AlternatifController::class, 'edit'])->name('admin.alternatif.edit');
Route::put('/alternatif/{id}', [AlternatifController::class, 'update'])->name('admin.alternatif.update');
Route::delete('/alternatif/{id}', [AlternatifController::class, 'destroy'])->name('admin.alternatif.destroy');
// // Sub Kriteria
// Route::get('/admin/subkriteria/kriteria/{id}', [SubkriteriaController::class, 'showByKriteria'])->name('admin.pages.subkriteria.kriteria');
// Route::get('/admin/subkriteria/kriteria/{id}/create', [SubkriteriaController::class, 'create'])->name('admin.subkriteria.create');
// Route::post('/admin/subkriteria/store', [SubKriteriaController::class, 'store'])->name('admin.subkriteria.store');
// Route::get('/admin/subkriteria/{id}/edit', [SubkriteriaController::class, 'edit'])->name('admin.subkriteria.edit');
// Route::put('/admin/subkriteria/{id}', [SubkriteriaController::class, 'update'])->name('admin.pages.subkriteria.update');
// Route::delete('/admin/subkriteria/{id}', [SubkriteriaController::class, 'destroy'])->name('subkriteria.destroy');
// Penilaian alternatif
Route::get('/penilaian', [PenilaianController::class, 'indexPage'])->name('admin.penilaian.index');
Route::get('/penilaian/create', [PenilaianController::class, 'create'])->name('admin.penilaian.create');
Route::get('/penilaian/{id}/edit', [PenilaianController::class, 'edit'])->name('admin.penilaian.edit');
Route::put('/penilaian/{id}', [PenilaianController::class, 'update'])->name('admin.penilaian.update');
// // Data alternatif
// Route::get('/alternatif', [AlternatifController::class, 'indexPage'])->name('admin.alternatif.index');
// Route::post('/admin/alternatif', [AlternatifController::class, 'store'])->name('admin.alternatif.store');
// Route::get('/alternatif/{id}/edit', [AlternatifController::class, 'edit'])->name('admin.alternatif.edit');
// Route::put('/alternatif/{id}', [AlternatifController::class, 'update'])->name('admin.alternatif.update');
// Route::delete('/alternatif/{id}', [AlternatifController::class, 'destroy'])->name('admin.alternatif.destroy');
// Data user
// Route::get('/user', [UserController::class, 'index'])->name('users.index');
Route::get('/user/{id}', [UserController::class, 'show'])->name('user.show');
Route::get('/user/{id}/edit', [UserController::class, 'edit'])->name('user.edit');
Route::put('/user/{id}', [UserController::class, 'update'])->name('user.update');
// Route::delete('/user/{id}', [UserController::class, 'destroy'])->name('user.destroy');
// // Penilaian alternatif
// Route::get('/penilaian', [PenilaianController::class, 'indexPage'])->name('admin.penilaian.index');
// Route::get('/penilaian/create', [PenilaianController::class, 'create'])->name('admin.penilaian.create');
// Route::get('/penilaian/{id}/edit', [PenilaianController::class, 'edit'])->name('admin.penilaian.edit');
// Route::put('/penilaian/{id}', [PenilaianController::class, 'update'])->name('admin.penilaian.update');
// Data perhitungan
Route::get('/perhitungan/dress', [PerhitunganController::class, 'dress'])->name('admin.perhitungan.dress');
Route::get('/perhitungan/blouse', [PerhitunganController::class, 'blouse'])->name('admin.perhitungan.blouse');
Route::get('/perhitungan/cardigan', [PerhitunganController::class, 'cardigan'])->name('admin.perhitungan.cardigan');
Route::get('/perhitungan/rok', [PerhitunganController::class, 'rok'])->name('admin.perhitungan.rok');
Route::get('/perhitungan/celana', [PerhitunganController::class, 'celana'])->name('admin.perhitungan.celana');
// // Data user
// // Route::get('/user', [UserController::class, 'index'])->name('users.index');
// Route::get('/user/{id}', [UserController::class, 'show'])->name('user.show');
// Route::get('/user/{id}/edit', [UserController::class, 'edit'])->name('user.edit');
// Route::put('/user/{id}', [UserController::class, 'update'])->name('user.update');
// // Route::delete('/user/{id}', [UserController::class, 'destroy'])->name('user.destroy');
// Riwayat
Route::get('/riwayat', [RiwayatController::class, 'index'])->name('admin.riwayat.index');
Route::delete('/riwayat/{id}', [RiwayatController::class, 'destroy'])->name('admin.riwayat.destroy');
// // Data perhitungan
// Route::get('/perhitungan/dress', [PerhitunganController::class, 'dress'])->name('admin.perhitungan.dress');
// Route::get('/perhitungan/blouse', [PerhitunganController::class, 'blouse'])->name('admin.perhitungan.blouse');
// Route::get('/perhitungan/cardigan', [PerhitunganController::class, 'cardigan'])->name('admin.perhitungan.cardigan');
// Route::get('/perhitungan/rok', [PerhitunganController::class, 'rok'])->name('admin.perhitungan.rok');
// Route::get('/perhitungan/celana', [PerhitunganController::class, 'celana'])->name('admin.perhitungan.celana');
// // Riwayat
// Route::get('/riwayat', [RiwayatController::class, 'index'])->name('admin.riwayat.index');
// Route::delete('/riwayat/{id}', [RiwayatController::class, 'destroy'])->name('admin.riwayat.destroy');