/* OpenBills-web - Web based libre billing software * Copyright (C) 2022 Vidhu Kant Sharma * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { Item, saveItem, editItem } from './../../classes/item'; import { Brand, getAllBrands } from './../../classes/brand'; import { notificationConfig } from "./../../classes/notifications"; import './scss/item-editor.scss'; import { useState, useEffect } from 'react'; import { Store } from "react-notifications-component"; const ItemEditor = (props) => { const [name, setName] = useState(props.item.Name); const [desc, setDesc] = useState(props.item.Description); const [HSN, setHSN] = useState(props.item.HSN); const [unit, setUnit] = useState(props.item.UnitOfMeasure); const [unitPrice, setUnitPrice] = useState(props.item.UnitPrice); const [gstP, setGSTP] = useState(props.item.GSTPercentage); const [minQty, setMinQty] = useState(props.item.MinQuantity > 0 ? props.item.MinQuantity : 1); const [maxQty, setMaxQty] = useState(props.item.MaxQuantity); const [brand, setBrand] = useState(props.item.Brand); const [savedBrands, setSavedBrands] = useState([]); const [hasDecimalQty, setHasDecimalQty] = useState(props.item.HasDecimalQuantity); // get saved brands from API // needed by the brands dropdown menu useEffect(() => { getAllBrands(setSavedBrands, err => { Store.addNotification({ title: "Error while getting Brands list.", message: err.message, ...notificationConfig("danger") }); }); }, []) const handleSubmit = (e) => { e.preventDefault(); const minQuantity = parseFloat(minQty) const maxQuantity = parseFloat(maxQty) // show error if minQty > maxQty if (maxQuantity > 0) { if (minQuantity > maxQuantity) { // TODO: handle error console.log("shiat") return } } const item = new Item(); item.Id = props.item.Id; item.Name = name; item.Description = desc; item.HSN = HSN; item.UnitOfMeasure = unit; item.UnitPrice = parseFloat(unitPrice); item.GSTPercentage = parseFloat(gstP); item.MinQuantity = minQuantity; item.MaxQuantity = maxQuantity; item.Brand = brand; item.HasDecimalQuantity = hasDecimalQty; // TODO: Save is for new items. implement modification too props.editing ? editItem(item, handleSuccess, handleFail) : saveItem(item, handleSuccess, handleFail); } const handleSuccess = () => { Store.addNotification({ title: `Successfully ${props.editing ? "edited" : "added"} item!`, message: `${name} has successfully been ${props.editing ? "edited" : "saved"}.`, ...notificationConfig("success") }); clearAll(); props.callback(); props.editing && props.hide(); } const handleFail = err => { Store.addNotification({ title: "An error occoured", message: `Failed to ${props.editing ? "edit" : "add"} item ${name}. ${err.message}`, ...notificationConfig("danger") }); } const handleBrandSelect = (e) => { const b = savedBrands.filter(i => i.Id === e.target.value )[0]; setBrand(b ? b : new Brand()); } const clearAll = () => { setName(""); setDesc(""); setHSN(""); setUnit(""); setUnitPrice(0.00); setGSTP(0.00); setMinQty(0.00); setMaxQty(0.00); setBrand(new Brand()) } const handleCancel = () => { clearAll(); props.editing && props.hide(); } return (

{props.heading}

{savedBrands && savedBrands.length > 0 && }
); } export default ItemEditor;