From 2864a00814049b17d6bf53442ce4166d98eef8e3 Mon Sep 17 00:00:00 2001 From: zadit <75159257+insvrgent@users.noreply.github.com> Date: Sun, 12 Jan 2025 18:16:16 +0700 Subject: [PATCH] ok --- src/components/Carousel.js | 11 +- src/components/Carousel.module.css | 1 - src/components/Header.js | 4 +- src/pages/MaterialList.js | 297 ++++++++++++++++++++--------- 4 files changed, 212 insertions(+), 101 deletions(-) diff --git a/src/components/Carousel.js b/src/components/Carousel.js index 7573573..820b3a9 100644 --- a/src/components/Carousel.js +++ b/src/components/Carousel.js @@ -1,21 +1,18 @@ import React, { useState } from "react"; import styles from "./Carousel.module.css"; // Import CSS module -const Carousel = ({ items, onSelect }) => { - const [selectedIndex, setSelectedIndex] = useState(0); // Start at the first item +const Carousel = ({ selectedIndex, items, onSelect }) => { const moveToNext = () => { console.log('aa') if (selectedIndex < items.length - 1) { console.log('bb') - setSelectedIndex(selectedIndex + 1); onSelect(selectedIndex + 1); // Send the next index to the parent } }; const moveToPrev = () => { if (selectedIndex > -1) { - setSelectedIndex(selectedIndex - 1); onSelect(selectedIndex - 1); // Send the previous index to the parent } }; @@ -27,9 +24,9 @@ const Carousel = ({ items, onSelect }) => {
0 ? "hidden" : "visible" , backgroundColor: items.length < 1 ? '#919191':'#007bff'}} > - {selectedIndex === -1 ? "+" : items[selectedIndex - 1]?.name || "+"} + {selectedIndex === -1 ? (items.length > 0 ? "+" : "") : items[selectedIndex - 1]?.name || "+"}
{/* Current Item */} @@ -42,7 +39,7 @@ const Carousel = ({ items, onSelect }) => { className={`${styles.carouselItem} ${styles.next}`} onClick={moveToNext} style={{ - visibility: selectedIndex === items.length -1 ? "hidden" : "visible", + visibility: selectedIndex === items.length -1 && items.length > 0 ? "hidden" : "visible", backgroundColor: items.length < 1 ? '#919191':'#007bff' }} > {selectedIndex < items.length - 1 && items[selectedIndex + 1]?.name} diff --git a/src/components/Carousel.module.css b/src/components/Carousel.module.css index b3b786f..a6cbe11 100644 --- a/src/components/Carousel.module.css +++ b/src/components/Carousel.module.css @@ -44,7 +44,6 @@ position: absolute; top: 50%; transform: translateY(-50%); - background-color: #007bff; color: white; border: none; padding: 10px 20px; diff --git a/src/components/Header.js b/src/components/Header.js index a74a5b0..43f29f6 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -354,9 +354,9 @@ const Header = ({ onChange={() => setIsEditMode(!isEditMode)} /> - setModal("reports")}>Laporan + setModal("reports")}>Lihat laporan setModal("add_material")}> - Stok + Kelola bahan baku diff --git a/src/pages/MaterialList.js b/src/pages/MaterialList.js index 1d6aa98..87b4933 100644 --- a/src/pages/MaterialList.js +++ b/src/pages/MaterialList.js @@ -30,14 +30,19 @@ const SetPaymentQr = ({ cafeId }) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showForm, setShowForm] = useState(false); - const [selectedMaterialId, setSelectedMaterialId] = useState(null); + const [selectedMaterialIndex, setSelectedMaterialIndex] = useState(-1); const [latestMutation, setLatestMutation] = useState([]); const [currentQuantity, setCurrentQuantity] = useState(-1); const [currentPrice, setCurrentPrice] = useState(0); const [quantityChange, setQuantityChange] = useState(0); const [sortOrder, setSortOrder] = useState("desc"); const [isEditCurrentPrice, setIsEditCurrentPrice] = useState(false); + const [isViewingHistory, setIsViewingHistory] = useState(false); + const convertToInteger = (formattedValue) => { + // Remove dots and convert to integer + return parseInt(formattedValue.replace(/\./g, ""), 10); + }; const formatCurrency = (value) => { if (!value) return ""; @@ -53,12 +58,14 @@ const SetPaymentQr = ({ cafeId }) => { useEffect(() => { const fetchMaterials = async () => { - setLoading(true); try { const data = await getMaterials(cafeId); setMaterials(data); console.log(data) setError(null); + if (data.length > 0) { + setSelectedMaterialIndex(0); + } } catch (error) { console.error("Error fetching materials:", error); setError("Failed to fetch materials."); @@ -69,9 +76,6 @@ const SetPaymentQr = ({ cafeId }) => { try { const data = await getMaterialMutations(cafeId); setMutations(data); - if (data.length > 0) { - setSelectedMaterialId(0); - } } catch (err) { setError(err.message); } finally { @@ -82,17 +86,15 @@ const SetPaymentQr = ({ cafeId }) => { fetchMaterials(); fetchMutations(); }, [cafeId]); - + const handleSortChange = (e) => { setSortOrder(e.target.value); }; - const filteredMutations = selectedMaterialId - ? mutations.filter((mutation) => mutation.materialId === selectedMaterialId) - : []; + const filteredMutations = mutations.filter((mutation) => mutation.materialId === materials[selectedMaterialIndex].materialId) || []; const sortedMutations = filteredMutations - .filter((mutation) => mutation.materialId === selectedMaterialId) + .filter((mutation) => mutation.materialId === materials[selectedMaterialIndex].materialId) .sort((a, b) => { if (sortOrder === "asc") { return new Date(a.createdAt) - new Date(b.createdAt); @@ -122,7 +124,7 @@ const SetPaymentQr = ({ cafeId }) => { setMaterials(data); setError(null); if (data.length > 0) { - setSelectedMaterialId(0); + setSelectedMaterialIndex(0); } } catch (error) { console.error("Error creating material:", error); @@ -141,8 +143,8 @@ const SetPaymentQr = ({ cafeId }) => { ); setMaterials(updatedMaterials); setError(null); - if (selectedMaterialId === materialId) { - setSelectedMaterialId( + if (selectedMaterialIndex === materialId) { + setSelectedMaterialIndex( updatedMaterials.length > 0 ? updatedMaterials[0].materialId : null ); } @@ -155,25 +157,25 @@ const SetPaymentQr = ({ cafeId }) => { }; const handlePrevious = () => { - if (selectedMaterialId) { + if (selectedMaterialIndex) { setQuantityChange(0); const currentIndex = materials.findIndex( - (material) => material.materialId === selectedMaterialId + (material) => material.materialId === selectedMaterialIndex ); if (currentIndex > 0) { - setSelectedMaterialId(materials[currentIndex - 1].materialId); + setSelectedMaterialIndex(materials[currentIndex - 1].materialId); } } }; const handleNext = () => { - if (selectedMaterialId) { + if (selectedMaterialIndex) { setQuantityChange(0); const currentIndex = materials.findIndex( - (material) => material.materialId === selectedMaterialId + (material) => material.materialId === selectedMaterialIndex ); if (currentIndex < materials.length - 1) { - setSelectedMaterialId(materials[currentIndex + 1].materialId); + setSelectedMaterialIndex(materials[currentIndex + 1].materialId); } } }; @@ -184,10 +186,9 @@ const SetPaymentQr = ({ cafeId }) => { useEffect(() => { setQuantityChange(0); - console.log(selectedMaterialId) - if (selectedMaterialId > -1) { + if (materials.length > 0 || selectedMaterialIndex > -1) { const materialMutations = mutations.filter( - (mutation) => mutation.materialId === materials[selectedMaterialId]?.materialId + (mutation) => mutation.materialId === materials[selectedMaterialIndex]?.materialId ); console.log(materialMutations) if (materialMutations.length > 0) { @@ -203,40 +204,40 @@ const SetPaymentQr = ({ cafeId }) => { setCurrentPrice(formatCurrency(latestMutation.priceAtp)); } else { setCurrentQuantity(0); // Default value if no mutations exist - setLatestMutation({newStock: 0}); + setLatestMutation({ newStock: 0 }); setCurrentPrice(0); } } - }, [selectedMaterialId]); + + }, [materials, mutations, selectedMaterialIndex]); const handleUpdateStock = async () => { - if (selectedMaterialId) { - setLoading(true); - try { - const newStock = currentQuantity + quantityChange; - const formData = new FormData(); - formData.append("newStock", newStock); - formData.append("priceAtp", currentPrice); - formData.append("reason", "Stock update"); + setLoading(true); + try { + const newPrice = convertToInteger(currentPrice) + const newStock = currentQuantity + quantityChange; + const formData = new FormData(); + formData.append("newStock", newStock); + formData.append("priceAtp", newPrice); + formData.append("reason", "Stock update"); - await createMaterialMutation(selectedMaterialId, formData); - setQuantityChange(0); - const updatedMutations = await getMaterialMutations(cafeId); - setMutations(updatedMutations); - setCurrentQuantity(newStock); - setError(null); - } catch (error) { - console.error("Error updating stock:", error); - setError("Failed to update stock."); - } finally { - setLoading(false); - } + await createMaterialMutation(materials[selectedMaterialIndex].materialId, formData); + setQuantityChange(0); + const updatedMutations = await getMaterialMutations(cafeId); + setMutations(updatedMutations); + setCurrentQuantity(newStock); + setError(null); + } catch (error) { + console.error("Error updating stock:", error); + setError("Failed to update stock."); + } finally { + setLoading(false); } }; const currentMaterial = materials.find( - (material) => material.materialId === selectedMaterialId + (material) => material.materialId === selectedMaterialIndex ); const formatDate = (timestamp) => { const date = new Date(timestamp); @@ -246,48 +247,130 @@ const SetPaymentQr = ({ cafeId }) => { return (
-

Stok

- setSelectedMaterialId(e)}/> -
-

harga per {materials && materials[selectedMaterialId]?.unit} sekarang

-
-
+ {loading ? + <> + + : + <> +

Bahan baku

+ setSelectedMaterialIndex(e)} selectedIndex={selectedMaterialIndex} /> + {selectedMaterialIndex != -1 ? + <> +
+

Stok sekarang {currentQuantity}

+
- -
setIsEditCurrentPrice(!isEditCurrentPrice)} style={styles.uploadButton}>{isEditCurrentPrice ? 'Terapkan' : 'Ganti'}
-
-
-

Stok sekarang {currentQuantity}

-
+
+ +

{currentQuantity + quantityChange}

+ +
+
+

harga per {materials && materials[selectedMaterialIndex]?.unit} sekarang

+
+
-
- -

{currentQuantity + quantityChange}

- -
-
- -
-
-

> Riwayat stok

-
+ +
quantityChange < 1 ? null : setIsEditCurrentPrice(!isEditCurrentPrice)} style={quantityChange < 1 ? styles.changeButtonDisabled : styles.changeButtonEnabled}>{isEditCurrentPrice ? 'Terapkan' : 'Ganti'}
+
+
+ +
+
setIsViewingHistory(!isViewingHistory)} style={styles.historyTab}> +

{isViewingHistory ? '˅' : '˃'} Riwayat stok

+
+ {selectedMaterialIndex != -1 && isViewingHistory && !loading && ( +
+ {sortedMutations.length > 0 ? ( + sortedMutations.map((mutation) => ( +
+

+ {formatDate(mutation.createdAt)} +

+

Details: {mutation.reason}

+

stok {mutation.newStock}

+
+ )) + ) : ( +

No mutations available.

+ )} +
+ )} +
+
+ : + <> +
+
+
+ Fitur ini mempermudah mengelola biaya dan memantau pengeluaran bahan. +
+
+ +
+

Buat bahan baru

+
+
+ + setNewMaterialName(event.target.value)} + placeholder="Masukkan nama barang" + /> +
+ + + +
+ +
+ + } + + }
); }; @@ -296,6 +379,7 @@ const SetPaymentQr = ({ cafeId }) => { const styles = { container: { width: '100%', + minHeight: '50vh', backgroundColor: "white", padding: "20px", borderRadius: "8px", @@ -320,7 +404,7 @@ const styles = { fontWeight: 600, textAlign: "left", }, - uploadButton: { + changeButtonEnabled: { paddingRight: '10px', backgroundColor: 'green', borderRadius: '30px', @@ -331,6 +415,17 @@ const styles = { paddingLeft: '10px', paddingHeight: '10px', }, + changeButtonDisabled: { + paddingRight: '10px', + backgroundColor: '#a1a1a1', + borderRadius: '30px', + color: 'white', + fontWeight: 700, + height: '36px', + lineHeight: '36px', + paddingLeft: '10px', + paddingHeight: '10px', + }, resultMessage: { marginTop: "-13px", textAlign: "left", @@ -341,15 +436,26 @@ const styles = { display: 'flex', justifyContent: 'space-evenly', alignItems: 'center', - marginTop: '20px', - marginTop: "20px", + marginTop: '18px', + marginBottom: "6px", textAlign: "left", }, buttonContainer: { - marginTop: "20px", + marginTop: "11px", textAlign: "left", }, + stockButton: { + padding: "10px 20px", + fontSize: "3.5vw", + backgroundColor: "#28a745", + color: "#fff", + border: "none", + borderRadius: "30px", + cursor: "pointer", + transition: "background-color 0.3s", + }, saveButton: { + width: '100%', padding: "10px 20px", fontSize: "3.5vw", backgroundColor: "#28a745", @@ -363,15 +469,24 @@ const styles = { marginTop: "20px", textAlign: "left", }, - historyContainer: { - marginTop: "20px", + historyTab: { textAlign: "left", }, + historyContainer: { + textAlign: "left", + maxHeight: '200px', + overflowY: 'auto' + }, description: { margin: "10px 0", fontSize: "14px", color: "#666", }, + unit: { + marginTop: '11px', + width: '100%', + height: '31px', + }, }; export default SetPaymentQr;