+
+
+
-
{{ item.produk.nama }}
-
{{ item.produk.id }}
+
{{ item.produk.nama }}
+
{{ item.produk.kategori }}
+
{{ item.produk.harga_jual.toLocaleString() }}
-
{{ item.berat }}g
+
{{ item.produk.berat }}g
@@ -85,6 +101,8 @@ const props = defineProps({
},
});
+const emit = defineEmits(["edit", "delete"])
+
const trays = ref([]);
const loading = ref(true);
const error = ref(null);
@@ -92,15 +110,29 @@ const error = ref(null);
// hitung total berat
const totalWeight = (tray) => {
if (!tray.items) return 0;
- return tray.items.reduce((sum, item) => sum + (item.berat || 0), 0);
+ return tray.items.reduce((sum, item) => sum + (item.produk.berat || 0), 0);
};
// ambil data dari backend
onMounted(async () => {
try {
- const res = await axios.get("/api/nampan");
- trays.value = res.data; // harus array tray dengan items
- console.log("Data nampan:", res.data);
+ const [nampanRes, itemRes] = await Promise.all([
+ axios.get("/api/nampan"),
+ axios.get("/api/item")
+ ]);
+
+ const nampans = nampanRes.data;
+ const items = itemRes.data;
+
+ // mapping items ke nampan
+ trays.value = nampans.map(tray => {
+ return {
+ ...tray,
+ items: items.filter(item => item.id_nampan === tray.id)
+ };
+ });
+
+ console.log("Nampan dengan items:", trays.value);
} catch (err) {
error.value = err.message || "Gagal mengambil data";
} finally {
diff --git a/resources/js/pages/Tray.vue b/resources/js/pages/Tray.vue
index fde2d7e..a867775 100644
--- a/resources/js/pages/Tray.vue
+++ b/resources/js/pages/Tray.vue
@@ -1,16 +1,141 @@
+
NAMPAN
+
+
+
+
+
+
-
+
+
+
+
Tambah Nampan
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
+import searchbar from '../components/searchbar.vue'
+import TrayList from '../components/TrayList.vue'
+
+const searchQuery = ref("") // buat search
+const showModal = ref(false) // <-- ini penting, biar tidak undefined
+const trayName = ref("") // nama nampan baru
+
+// buka modal
+const openModal = () => {
+ showModal.value = true
+}
+
+// tutup modal
+const closeModal = () => {
+ trayName.value = ""
+ editingTrayId.value = null
+ showModal.value = false
+}
+// simpan nampan baru
+const saveTray = async () => {
+ if (!trayName.value.trim()) {
+ alert("Nama Nampan tidak boleh kosong")
+ return
+ }
+
+ try {
+ if (editingTrayId.value) {
+ // mode edit
+ await axios.put(`/api/nampan/${editingTrayId.value}`, { nama: trayName.value })
+ alert("Nampan berhasil diupdate")
+ } else {
+ // mode tambah
+ await axios.post("/api/nampan", { nama: trayName.value })
+ alert("Nampan berhasil ditambahkan")
+ }
+ closeModal()
+ location.reload()
+ } catch (error) {
+ console.error(error)
+ alert("Gagal menyimpan nampan")
+ }
+}
+
+
+// kosongkan semua nampan
+const emptyTray = async () => {
+ if (!confirm("Yakin ingin memindahkan semua item ke Brankas?")) return
+
+ try {
+ await axios.post("/api/brankas", { action: "move_all_from_tray" })
+ alert("Semua item berhasil dipindahkan ke Brankas")
+ location.reload()
+ } catch (error) {
+ console.error(error)
+ alert("Gagal mengosongkan nampan")
+ }
+}
+
+const editTray = (tray) => {
+ // buka modal edit, bisa pake sama seperti modal tambah
+ trayName.value = tray.nama
+ editingTrayId.value = tray.id
+ showModal.value = true
+}
+
+const deleteTray = async (id) => {
+ if (!confirm("Yakin ingin menghapus nampan ini?")) return
+ try {
+ await axios.delete(`/api/nampan/${id}`)
+ alert("Nampan berhasil dihapus")
+ location.reload()
+ } catch (error) {
+ console.error(error)
+ alert("Gagal menghapus nampan")
+ }
+}
+
+const editingTrayId = ref(null)
+
+