From 8ad64a986d12f5ceb5bfca015bddd2203d22c7c7 Mon Sep 17 00:00:00 2001 From: adityaalfarison Date: Thu, 23 Oct 2025 17:11:25 +0700 Subject: [PATCH] update 23 oktober --- app/Http/Controllers/AuthController.php | 2 +- resources/js/components/BrankasList.vue | 39 ++- resources/js/components/BrankasTabel.vue | 390 +++++++++++++++++++++++ resources/js/components/KasirForm.vue | 13 +- resources/js/pages/Brankas.vue | 32 +- resources/js/pages/InputProduk.vue | 95 +++--- resources/js/pages/Produk.vue | 23 +- routes/web.php | 2 +- 8 files changed, 524 insertions(+), 72 deletions(-) create mode 100644 resources/js/components/BrankasTabel.vue diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index e05cca7..58f2d37 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -18,7 +18,7 @@ class AuthController extends Controller ]); // cari user berdasarkan nama - $user = User::where('nama', $request->nama)->first(); + $user = User::whereRaw('BINARY nama = ?', [$request->nama])->first(); if (!$user || !Hash::check($request->password, $user->password)) { return response()->json([ diff --git a/resources/js/components/BrankasList.vue b/resources/js/components/BrankasList.vue index cdbe95a..7bf2a26 100644 --- a/resources/js/components/BrankasList.vue +++ b/resources/js/components/BrankasList.vue @@ -37,6 +37,16 @@ + +
+ + +
+
{{ props.search ? 'Item tidak ditemukan.' : 'Brankas kosong.' }} @@ -93,7 +103,7 @@ Batal - @@ -162,6 +172,7 @@ const trays = ref([]); const loading = ref(true); const alert = ref(null); const timer = ref(null); +const sortOrder = ref("asc"); // State modal pindah const isPopupVisible = ref(false); @@ -169,6 +180,7 @@ const selectedItem = ref(null); const selectedTrayId = ref(""); const errorMove = ref(""); const isMoving = ref(false); +const isAdmin = localStorage.getItem('role') == 'admin' const showDeleteConfirm = ref(false); @@ -188,11 +200,26 @@ const totalWeight = computed(() => { }); const filteredItems = computed(() => { - if (!props.search) return items.value; - return items.value.filter((item) => - item.produk?.nama?.toLowerCase().includes(props.search.toLowerCase()) || - item.kode_item?.toLowerCase().includes(props.search.toLowerCase()) - ); + let filtered = items.value; + + if (props.search) { + filtered = filtered.filter((item) => + item.produk?.nama?.toLowerCase().includes(props.search.toLowerCase()) || + item.kode_item?.toLowerCase().includes(props.search.toLowerCase()) + ); + } + + // Sorting berdasarkan nama produk + return filtered.sort((a, b) => { + const nameA = (a.produk?.nama || "").toLowerCase(); + const nameB = (b.produk?.nama || "").toLowerCase(); + + if (sortOrder.value === "asc") { + return nameA.localeCompare(nameB); + } else { + return nameB.localeCompare(nameA); + } + }); }); // Fungsi modal pindah diff --git a/resources/js/components/BrankasTabel.vue b/resources/js/components/BrankasTabel.vue new file mode 100644 index 0000000..eae6f26 --- /dev/null +++ b/resources/js/components/BrankasTabel.vue @@ -0,0 +1,390 @@ + + + + + \ No newline at end of file diff --git a/resources/js/components/KasirForm.vue b/resources/js/components/KasirForm.vue index 3377f9c..a9f76ce 100644 --- a/resources/js/components/KasirForm.vue +++ b/resources/js/components/KasirForm.vue @@ -20,7 +20,7 @@ @close="closeStrukView" /> -
+
@@ -61,10 +61,6 @@ class="w-full sm:w-auto px-4 py-2 rounded-md bg-C text-D font-medium hover:bg-C/80 transition"> Tambah Item -
@@ -125,7 +121,12 @@
- +
+ +
diff --git a/resources/js/pages/Brankas.vue b/resources/js/pages/Brankas.vue index ae8d591..154024e 100644 --- a/resources/js/pages/Brankas.vue +++ b/resources/js/pages/Brankas.vue @@ -2,12 +2,32 @@

BRANKAS

+
+
    + +
+
-
- +
+ +
@@ -17,5 +37,13 @@ import { ref } from 'vue'; import mainLayout from '../layouts/mainLayout.vue' import searchbar from '../components/Searchbar.vue'; import BrankasList from '../components/BrankasList.vue'; +import BrankasTabel from '../components/BrankasTabel.vue'; const searchQuery = ref(""); + +const activeTab = ref('tabel'); + +const tabs = [ + { name: 'Tabel', id: 'tabel' }, + { name: 'Kartu', id: 'card' }, +]; diff --git a/resources/js/pages/InputProduk.vue b/resources/js/pages/InputProduk.vue index dae1e0f..de159a8 100644 --- a/resources/js/pages/InputProduk.vue +++ b/resources/js/pages/InputProduk.vue @@ -11,7 +11,8 @@
- +

{{ errors.nama[0] }}

@@ -24,34 +25,25 @@
+ @input="calculateHargaJual" />
+

{{ errors.kadar }}

- +
- +
@@ -66,7 +58,7 @@
@@ -75,38 +67,38 @@
+ @dragleave.prevent="isDragging = false" @click="toggleUploadMenu" + class="w-full h-full bg-gray-50 border-2 border-dashed border-gray-300 rounded-lg flex flex-col items-center justify-center cursor-pointer hover:border-D hover:bg-blue-50 transition-colors group" + :class="{ 'border-blue-400 bg-blue-50': isDragging, 'cursor-not-allowed opacity-50': uploadLoading }">
+ class="w-12 h-12 bg-D rounded-lg flex items-center justify-center mx-auto mb-2 group-hover:bg-D transition-colors"> + d="M12 6v6m0 0v6m0-6h6m-6 0H6">
+ d="m4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z">

+ v-html="uploadLoading ? 'Uploading...' : 'Unggah
Foto'">

+ class="absolute top-full left-0 mt-2 w-60 bg-white border border-gray-200 rounded-lg shadow-lg z-20">
@@ -433,6 +425,12 @@ const submitForm = async (addItem) => { } loading.value = true; try { + if (form.value.kadar % 1 != 0) { + errors.value = { kadar: "Masukkan bilangan bulat" }; + return; + } + form.value.berat = Number(form.value.berat) + const response = await axios.post('/api/produk', form.value, { headers: { Authorization: `Bearer ${localStorage.getItem("token")}` }, }); @@ -470,21 +468,21 @@ const submitForm = async (addItem) => { const back = async () => { - loading.value = true; - try{ - console.log(localStorage.getItem("token")); + loading.value = true; + try { + console.log(localStorage.getItem("token")); - await axios.delete('/api/all/foto', { - headers: { - Authorization: `Bearer ${localStorage.getItem("token")}`, - }, - }); - router.push('/produk'); - } catch (e){ - console.error("Error image ", e); - } finally { - loading.value = false; - } + await axios.delete('/api/all/foto', { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + router.push('/produk'); + } catch (e) { + console.error("Error image ", e); + } finally { + loading.value = false; + } }; const openCreateItemModal = (product) => { @@ -503,4 +501,3 @@ onMounted(() => { loadKategori(); }); - diff --git a/resources/js/pages/Produk.vue b/resources/js/pages/Produk.vue index 5a4670d..d134bb3 100644 --- a/resources/js/pages/Produk.vue +++ b/resources/js/pages/Produk.vue @@ -28,16 +28,16 @@
-