aboutsummaryrefslogtreecommitdiff
path: root/src/components/Form/Items/AddNewItemForm.tsx
diff options
context:
space:
mode:
authorMikunoNaka <bokuwakanojogahoshii@yahoo.com>2021-06-24 15:53:42 +0530
committerMikunoNaka <bokuwakanojogahoshii@yahoo.com>2021-06-24 15:53:42 +0530
commit5329b1fd16d0b8940f9526b523676dfb1cdbf317 (patch)
treed65963f6a797e72c2fae8332568bddc00d2293a9 /src/components/Form/Items/AddNewItemForm.tsx
parente21a1c15a2e4bf3e51cdd7a5671bbfee5837ef13 (diff)
switching to typescript
Diffstat (limited to 'src/components/Form/Items/AddNewItemForm.tsx')
-rw-r--r--src/components/Form/Items/AddNewItemForm.tsx219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/components/Form/Items/AddNewItemForm.tsx b/src/components/Form/Items/AddNewItemForm.tsx
new file mode 100644
index 0000000..283d779
--- /dev/null
+++ b/src/components/Form/Items/AddNewItemForm.tsx
@@ -0,0 +1,219 @@
+/*
+ * OpenBills - Self hosted browser app to generate and keep track of simple invoices
+ * Version - 0
+ * Licensed under the MIT license - https://opensource.org/licenses/MIT
+ *
+ * Copyright (c) 2021 Vidhu Kant Sharma
+*/
+
+import React, { useState } from "react";
+import "./../Form.scss";
+import { Item } from "../../../interfaces";
+
+interface props {
+ savedItems: Item[]
+ addItem: (item: Item) => void
+ defGSTValue: number,
+ registerItemFormVisibility: any,
+ registerPersonFormVisibility: any
+}
+
+const AddNewItemForm: React.FC<props> = (props) => {
+ console.log(props)
+ const [itemNameValue, setItemNameValue] = useState<string>("");
+ const [itemDescValue, setItemDescValue] = useState<string>("");
+ const [itemPriceValue, setItemPriceValue] = useState<number>(0.00);
+ const [itemDiscountValue, setItemDiscountValue] = useState<number>(0.00);
+ const [itemGSTValue, setItemGSTValue] = useState<number>(props.defGSTValue);
+ const [itemQTYValue, setItemQTYValue] = useState<number>(1);
+ const [itemHSNValue, setItemHSNValue] = useState<number>(0);
+
+ // to be handled by DocumentInfo
+ // check if client is in same state
+ // and apply cgst+sgst or igst accordingly
+ // const inState: boolean = true;
+
+ const enterItemNamePrompt: string = "start typing here";
+ const registerItemPrompt: string = "add new";
+ const emptyItemNames: any[] = [enterItemNamePrompt, registerItemPrompt, ""];
+
+ // set description and price if match found in DB
+ const applyItemInfo = (i: any) => {
+ setItemDescValue(i.Description);
+ setItemPriceValue(i.Price);
+ setItemHSNValue(i.HSN);
+ setItemGSTValue(i.GST);
+ }
+
+ // check the item name value and do stuff accordingly
+ const setItemInfo = (itemName: any) =>
+ (props.savedItems === null || itemName === registerItemPrompt)
+ ? props.registerItemFormVisibility(true)
+ : props.savedItems.some((i) =>
+ itemName === i.Model.toLowerCase() && applyItemInfo(i))
+
+ const resetAllValues = () => {
+ setItemNameValue("");
+ setItemDescValue("");
+ setItemQTYValue(1);
+ setItemPriceValue(1);
+ setItemDiscountValue(0);
+ setItemHSNValue(0);
+ setItemGSTValue(props.defGSTValue);
+ }
+
+ return (
+ <div className={"formContainer"}>
+ <form className={"threePaneForm"} onSubmit={
+ (event) => {
+ event.preventDefault();
+
+ // TODO: maybe move calculation of GST and Discount here
+ const newInvoiceItem: Item = {
+ Model: itemNameValue,
+ Description: itemDescValue,
+ Quantity: itemQTYValue,
+ UnitPrice: itemPriceValue,
+ TotalValue: (itemPriceValue * itemQTYValue),
+ Discount: itemDiscountValue,
+ HSN: itemHSNValue,
+
+ // this also checks if igst applies or not
+ // TODO: fix this
+ sgst: 0,
+ cgst: 0,
+ igst: 0
+ // sgst: inState ? parseInt(itemGSTValue) / 2 : "",
+ // cgst: inState ? parseInt(itemGSTValue) / 2 : "",
+ // igst: inState ? "" : parseInt(itemGSTValue)
+ }
+ props.addItem(newInvoiceItem);
+
+ resetAllValues();
+ }
+ }>
+ <div className={"widePane formPane"}>
+ <label>
+ Item/Service:
+ <select
+ className={"selectInputBox"}
+ value={itemNameValue}
+ onChange={
+ (event) => {
+ setItemNameValue(event.target.value);
+ setItemInfo(event.target.value.toLowerCase());
+ }
+ }>
+ <option key={enterItemNamePrompt}>{enterItemNamePrompt}</option>
+ {props.savedItems !== null && props.savedItems.map(
+ (i) => <option key={i.Model}>{i.Model}</option>
+ )}
+ <option key={registerItemPrompt}>{registerItemPrompt}</option>
+ </select>
+ </label>
+
+ <label>
+ Description:
+ <input className={"wideInputBox"} type="text" value={itemDescValue}
+ onChange={
+ (event) => {
+ setItemDescValue(event.target.value);
+ }
+ }
+ />
+ </label>
+ </div>
+
+ <div className={"widePane formPane"}>
+ <label>
+ Quantity:
+ <input className={"smallInputBox"} type="number" min="1" value={itemQTYValue}
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseInt(event.currentTarget.value);
+ setItemQTYValue(value);
+ }
+ }
+ required />
+ </label>
+
+ <label>
+ Price:
+ <input className={"smallInputBox"} type="number" min="1.00" step="0.001" value={itemPriceValue}
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseFloat(event.currentTarget.value);
+ setItemPriceValue(value);
+ }
+ }
+ required />
+ </label>
+
+ <label>
+ Discount:
+ <input className={"smallInputBox"} type="number" min="0" step="0.001" value={itemDiscountValue}
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseInt(event.currentTarget.value);
+ setItemDiscountValue(value);
+ }
+ }
+ />
+ </label>
+
+ <label>
+ HSN:
+ <input className={"smallInputBox"} type="number" min="0" value={itemHSNValue}
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseInt(event.currentTarget.value);
+ setItemHSNValue(value);
+ }
+ }
+ required />
+ </label>
+
+ <label>
+ GST:
+ <input className={"smallInputBox"} type="number" min="0" value={itemGSTValue}
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseInt(event.currentTarget.value);
+ setItemGSTValue(value);
+ }
+ }
+ required />
+ </label>
+ </div>
+
+ <div className={"smallPane formPane"}>
+ <input type="button"
+ value="Register New Client"
+ onClick={() => props.registerPersonFormVisibility(true)}
+ />
+
+ <input type="button"
+ value="Register New Item"
+ onClick={() => props.registerItemFormVisibility(true)}
+ />
+
+ <input type="button" value="Placeholder1" />
+ <input type="button" value="Placeholder2" />
+ <input type="submit" value="Force Add" />
+
+ <input type="submit" value="add"
+ disabled={
+ (emptyItemNames.includes(itemNameValue)
+ || itemQTYValue <= 0
+ || itemPriceValue <= 0
+ || itemGSTValue <= 0
+ ) ? true : false
+ }
+ />
+ </div>
+ </form>
+ </div>
+ )
+}
+
+export default AddNewItemForm;