[Update harga templete]

This commit is contained in:
Arief Dwi Wicaksono 2025-09-18 09:16:53 +07:00
parent 35d514749e
commit 51aa9cd751
2 changed files with 104 additions and 88 deletions

View File

@ -13,28 +13,27 @@ class TemplateController extends Controller
public function index() public function index()
{ {
// eager load fiturs & kategori // eager load fiturs & kategori
$templates = Template::with(['kategori', 'fiturs']) $templates = Template::with(['kategori', 'fiturs'])->paginate(5);
->paginate(5); // <= pagination 10 item per halaman
$kategoris = Kategori::all(); $kategoris = Kategori::all();
$fiturs = Fitur::all(); $fiturs = Fitur::all();
return view('admin.templates.index', compact('templates', 'kategoris', 'fiturs')); return view('admin.templates.index', compact('templates', 'kategoris', 'fiturs'));
} }
public function show($id) public function show($id)
{ {
return Template::with('kategori')->findOrFail($id); return Template::with('kategori')->findOrFail($id);
} }
public function store(Request $request)
public function store(Request $request) {
{
$data = $request->validate([ $data = $request->validate([
'nama_template' => 'required|string|max:255', 'nama_template' => 'required|string|max:255',
'kategori_id' => 'required|exists:kategoris,id', 'kategori_id' => 'required|exists:kategoris,id',
'fitur_id' => 'required|array', 'fitur_id' => 'required|array',
'fitur_id.*' => 'exists:fiturs,id', 'fitur_id.*' => 'exists:fiturs,id',
'foto' => 'nullable|image|mimes:jpg,jpeg,png,gif|max:5120', 'foto' => 'nullable|image|mimes:jpg,jpeg,png,gif|max:5120',
'harga' => 'required|string', // wajib string karena ada titik
]); ]);
// hitung total harga dari fitur yang dipilih // hitung total harga dari fitur yang dipilih
@ -44,31 +43,34 @@ public function store(Request $request)
$data['foto'] = $request->file('foto')->store('templates', 'public'); $data['foto'] = $request->file('foto')->store('templates', 'public');
} }
// store // Bersihkan titik ribuan sebelum simpan
$template = Template::create([ $hargaBersih = (int) str_replace('.', '', $request->harga);
// store
$template = Template::create([
'nama_template' => $data['nama_template'], 'nama_template' => $data['nama_template'],
'kategori_id' => $data['kategori_id'], 'kategori_id' => $data['kategori_id'],
'foto' => $data['foto'] ?? null, 'foto' => $data['foto'] ?? null,
'harga' => $request->harga, // ✅ ambil langsung dari input 'harga' => $hargaBersih,
]); ]);
$template->fiturs()->sync($data['fitur_id']); $template->fiturs()->sync($data['fitur_id']);
return redirect()->route('templates.index')->with('success', 'Template berhasil ditambahkan!'); return redirect()->route('templates.index')->with('success', 'Template berhasil ditambahkan!');
} }
public function update(Request $request, Template $template)
public function update(Request $request, Template $template) {
{
$data = $request->validate([ $data = $request->validate([
'nama_template' => 'required|string|max:255', 'nama_template' => 'required|string|max:255',
'kategori_id' => 'required|exists:kategoris,id', 'kategori_id' => 'required|exists:kategoris,id',
'fitur_id' => 'required|array', 'fitur_id' => 'required|array',
'fitur_id.*' => 'exists:fiturs,id', 'fitur_id.*' => 'exists:fiturs,id',
'foto' => 'nullable|image|mimes:jpg,jpeg,png,gif|max:5120', 'foto' => 'nullable|image|mimes:jpg,jpeg,png,gif|max:5120',
'harga' => 'required|string',
]); ]);
// hitung ulang harga // hitung ulang harga fitur
$totalHarga = Fitur::whereIn('id', $data['fitur_id'])->sum('harga'); $totalHarga = Fitur::whereIn('id', $data['fitur_id'])->sum('harga');
if ($request->hasFile('foto')) { if ($request->hasFile('foto')) {
@ -78,18 +80,21 @@ public function update(Request $request, Template $template)
$data['foto'] = $request->file('foto')->store('templates', 'public'); $data['foto'] = $request->file('foto')->store('templates', 'public');
} }
// update // Bersihkan titik ribuan
$template->update([ $hargaBersih = (int) str_replace('.', '', $request->harga);
// update
$template->update([
'nama_template' => $data['nama_template'], 'nama_template' => $data['nama_template'],
'kategori_id' => $data['kategori_id'], 'kategori_id' => $data['kategori_id'],
'foto' => $data['foto'] ?? $template->foto, 'foto' => $data['foto'] ?? $template->foto,
'harga' => $request->harga, // ✅ ambil langsung dari input 'harga' => $hargaBersih,
]); ]);
$template->fiturs()->sync($data['fitur_id']); $template->fiturs()->sync($data['fitur_id']);
return redirect()->route('templates.index')->with('success', 'Template berhasil diperbarui!'); return redirect()->route('templates.index')->with('success', 'Template berhasil diperbarui!');
} }
public function destroy(Template $template) public function destroy(Template $template)
{ {
@ -97,23 +102,21 @@ $template->update([
Storage::disk('public')->delete($template->foto); Storage::disk('public')->delete($template->foto);
} }
// detach fiturs otomatis karena cascade on pivot, tapi bisa explicit:
$template->fiturs()->detach(); $template->fiturs()->detach();
$template->delete(); $template->delete();
return redirect()->route('templates.index')->with('success', 'Template berhasil dihapus!'); return redirect()->route('templates.index')->with('success', 'Template berhasil dihapus!');
} }
public function byKategori($id) public function byKategori($id)
{ {
$kategori = Kategori::findOrFail($id); $kategori = Kategori::findOrFail($id);
$templates = Template::with(['kategori', 'fiturs']) $templates = Template::with(['kategori', 'fiturs'])
->where('kategori_id', $id) ->where('kategori_id', $id)
->paginate(5); // ✅ pakai paginate ->paginate(5);
$kategoris = Kategori::all(); $kategoris = Kategori::all();
$fiturs = Fitur::all(); $fiturs = Fitur::all();
return view('admin.templates.index', compact('templates', 'kategoris', 'fiturs', 'kategori')); return view('admin.templates.index', compact('templates', 'kategoris', 'fiturs', 'kategori'));
} }
} }

View File

@ -251,7 +251,7 @@
<div> <div>
<label class="block text-sm font-medium">Harga</label> <label class="block text-sm font-medium">Harga</label>
<input type="number" name="harga" class="w-full p-2 border rounded" required <input type="text" name="harga" class="w-full p-2 border rounded" required
min="0" value="{{ old('harga') }}"> min="0" value="{{ old('harga') }}">
</div> </div>
<div> <div>
@ -448,20 +448,33 @@ document.addEventListener('DOMContentLoaded', () => {
} }
// ========================= // =========================
// Fitur: Hitung Harga Otomatis // Fitur: Hitung Harga Otomatis + Format ribuan
// ========================= // =========================
function hitungHarga(container) { function formatRibuan(x) {
if (!x) return '';
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".");
}
function hitungHarga(container) {
let total = 0; let total = 0;
container.querySelectorAll('input[name="fitur_id[]"]:checked').forEach(cb => { container.querySelectorAll('input[name="fitur_id[]"]:checked').forEach(cb => {
total += parseInt(cb.dataset.harga) || 0; total += parseInt(cb.dataset.harga) || 0;
}); });
const inputHarga = container.querySelector('input[name="harga"]'); const inputHarga = container.querySelector('input[name="harga"]');
// hanya update kalau user belum ubah manual
if (inputHarga && !inputHarga.dataset.manual) { if (inputHarga && !inputHarga.dataset.manual) {
inputHarga.value = total; inputHarga.value = formatRibuan(total);
}
} }
}
// Update input text agar bisa ketik manual dengan format ribuan
document.querySelectorAll('.harga-input').forEach(input => {
input.addEventListener('input', (e) => {
let value = e.target.value.replace(/\D/g, ''); // hanya angka
e.target.value = formatRibuan(value);
e.target.dataset.manual = "true"; // kasih flag manual
});
});
// Modal Tambah // Modal Tambah
if (modalTambah) { if (modalTambah) {