aboutsummaryrefslogtreecommitdiff
path: root/src
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
parente21a1c15a2e4bf3e51cdd7a5671bbfee5837ef13 (diff)
switching to typescript
Diffstat (limited to 'src')
-rw-r--r--src/components/Form/Document/MetaInfoForm.tsx38
-rw-r--r--src/components/Form/Items/AddNewItemForm.tsx (renamed from src/components/Form/Items/AddNewItemForm.js)110
-rw-r--r--src/components/Form/MetaInfoForm.js22
-rw-r--r--src/components/Pages/BillingPage.tsx (renamed from src/components/Pages/BillingPage.js)17
-rw-r--r--src/interfaces.ts21
5 files changed, 132 insertions, 76 deletions
diff --git a/src/components/Form/Document/MetaInfoForm.tsx b/src/components/Form/Document/MetaInfoForm.tsx
new file mode 100644
index 0000000..da484ab
--- /dev/null
+++ b/src/components/Form/Document/MetaInfoForm.tsx
@@ -0,0 +1,38 @@
+/*
+ * 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 from "react";
+import "./../Form.scss";
+
+interface Transport {
+ name: string,
+ vehicleNum: string,
+ method: string, // shipment method
+ gstin: string,
+ builty: string // goods receipt
+}
+
+const MetaInfoForm: React.FC = () => {
+ // don't push it to github!
+ const sampleTransport: Transport = {
+ name: "Own Vehicle",
+ vehicleNum: "HR61C9220",
+ method: "By Road",
+ gstin: "",
+ builty: ""
+ }
+ console.log(sampleTransport);
+ return (
+ <div className={"MetaInfoForm"}>
+ <form>
+ </form>
+ </div>
+ );
+}
+
+export default MetaInfoForm;
diff --git a/src/components/Form/Items/AddNewItemForm.js b/src/components/Form/Items/AddNewItemForm.tsx
index 37167fd..283d779 100644
--- a/src/components/Form/Items/AddNewItemForm.js
+++ b/src/components/Form/Items/AddNewItemForm.tsx
@@ -8,27 +8,37 @@
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 = (props) => {
- const [itemNameValue, setItemNameValue] = useState("");
- const [itemDescValue, setItemDescValue] = useState("");
- const [itemPriceValue, setItemPriceValue] = useState(0.00);
- const [itemDiscountValue, setItemDiscountValue] = useState(0.00);
- const [itemGSTValue, setItemGSTValue] = useState(props.defGSTValue);
- const [itemQtyValue, setItemQtyValue] = useState(1);
- const [itemHSNValue, setItemHSNValue] = useState(0);
+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 = true;
+ // const inState: boolean = true;
- const enterItemNamePrompt = "start typing here";
- const registerItemPrompt = "add new";
- const emptyItemNames = [enterItemNamePrompt, registerItemPrompt, ""];
+ 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) => {
+ const applyItemInfo = (i: any) => {
setItemDescValue(i.Description);
setItemPriceValue(i.Price);
setItemHSNValue(i.HSN);
@@ -36,7 +46,7 @@ const AddNewItemForm = (props) => {
}
// check the item name value and do stuff accordingly
- const setItemInfo = (itemName) =>
+ const setItemInfo = (itemName: any) =>
(props.savedItems === null || itemName === registerItemPrompt)
? props.registerItemFormVisibility(true)
: props.savedItems.some((i) =>
@@ -45,7 +55,7 @@ const AddNewItemForm = (props) => {
const resetAllValues = () => {
setItemNameValue("");
setItemDescValue("");
- setItemQtyValue(1);
+ setItemQTYValue(1);
setItemPriceValue(1);
setItemDiscountValue(0);
setItemHSNValue(0);
@@ -57,22 +67,28 @@ const AddNewItemForm = (props) => {
<form className={"threePaneForm"} onSubmit={
(event) => {
event.preventDefault();
- const newInvoiceItem = {
- "Model": itemNameValue,
- "Description": itemDescValue,
- "Quantity": parseInt(itemQtyValue),
- "UnitPrice": parseFloat(itemPriceValue),
- "TotalPrice": parseFloat(itemPriceValue * itemQtyValue),
- "Discount": parseInt(itemDiscountValue),
- "HSN": parseInt(itemHSNValue),
+
+ // 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
- "sgst": inState ? parseInt(itemGSTValue) / 2 : "",
- "cgst": inState ? parseInt(itemGSTValue) / 2 : "",
- "igst": inState ? "" : parseInt(itemGSTValue)
- };
- console.log(newInvoiceItem);
+ // 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();
}
}>
@@ -111,11 +127,11 @@ const AddNewItemForm = (props) => {
<div className={"widePane formPane"}>
<label>
Quantity:
- <input className={"smallInputBox"} type="number" min="1" value={itemQtyValue}
+ <input className={"smallInputBox"} type="number" min="1" value={itemQTYValue}
onInput={
- (event) => {
- const value = event.target.value;
- setItemQtyValue(value);
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseInt(event.currentTarget.value);
+ setItemQTYValue(value);
}
}
required />
@@ -124,9 +140,9 @@ const AddNewItemForm = (props) => {
<label>
Price:
<input className={"smallInputBox"} type="number" min="1.00" step="0.001" value={itemPriceValue}
- onChange={
- (event) => {
- const value = event.target.value;
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseFloat(event.currentTarget.value);
setItemPriceValue(value);
}
}
@@ -136,21 +152,21 @@ const AddNewItemForm = (props) => {
<label>
Discount:
<input className={"smallInputBox"} type="number" min="0" step="0.001" value={itemDiscountValue}
- onChange={
- (event) => {
- const value = event.target.value;
+ 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}
- onChange={
- (event) => {
- const value = event.target.value;
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseInt(event.currentTarget.value);
setItemHSNValue(value);
}
}
@@ -160,9 +176,9 @@ const AddNewItemForm = (props) => {
<label>
GST:
<input className={"smallInputBox"} type="number" min="0" value={itemGSTValue}
- onChange={
- (event) => {
- const value = event.target.value;
+ onInput={
+ (event: React.FormEvent<HTMLInputElement>) => {
+ const value: number = parseInt(event.currentTarget.value);
setItemGSTValue(value);
}
}
@@ -188,10 +204,10 @@ const AddNewItemForm = (props) => {
<input type="submit" value="add"
disabled={
(emptyItemNames.includes(itemNameValue)
- || itemQtyValue <= 0
+ || itemQTYValue <= 0
|| itemPriceValue <= 0
|| itemGSTValue <= 0
- ) ? "disabled" : ""
+ ) ? true : false
}
/>
</div>
diff --git a/src/components/Form/MetaInfoForm.js b/src/components/Form/MetaInfoForm.js
deleted file mode 100644
index 5d9e3c3..0000000
--- a/src/components/Form/MetaInfoForm.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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";
-
-const MetaInfoForm = () => {
- return (
- <div className={"MetaInfoForm"}>
- <h1>This section of the app is missing</h1>
- <p>Please look at this waifu instead.</p>
- <img height="300" width="230" src="https://i.redd.it/te8tbxl1r9v61.jpg" alt="Shit where is the waifu"></img>
- </div>
- )
-}
-
-export default MetaInfoForm;
diff --git a/src/components/Pages/BillingPage.js b/src/components/Pages/BillingPage.tsx
index abb7b7d..9697a24 100644
--- a/src/components/Pages/BillingPage.js
+++ b/src/components/Pages/BillingPage.tsx
@@ -9,23 +9,25 @@
import React, { useState, useEffect } from "react";
import axios from "axios";
+import { Item } from "../../interfaces";
+
import AddNewItemForm from "./../Form/Items/AddNewItemForm";
import RegisterItemForm from "./../Form/Items/RegisterItemForm";
import RegisterPersonForm from "./../Form/People/RegisterPersonForm";
import DocumentInfoForm from "./../Form/Document/DocumentInfoForm";
-import MetaInfoForm from "./../Form/MetaInfoForm";
+import MetaInfoForm from "./../Form/Document/MetaInfoForm";
import ItemsDisplay from "./../Display/ItemsDisplay";
import SummaryDisplay from "./../Display/SummaryDisplay";
-const BillingPage = () => {
- const [savedItems, getSavedItems] = useState([]);
+const BillingPage: React.FC = () => {
+ const [savedItems, getSavedItems] = useState<Item[]>([]);
const [savedPeople, getSavedPeople] = useState([]);
- const [registerItemFormVisibility, setRegisterItemFormVisibility] = useState(false);
- const [registerPersonFormVisibility, setRegisterPersonFormVisibility] = useState(false);
- const [items, setItems] = useState([]);
+ const [registerItemFormVisibility, setRegisterItemFormVisibility] = useState<boolean>(false);
+ const [registerPersonFormVisibility, setRegisterPersonFormVisibility] = useState<boolean>(false);
+ const [items, setItems] = useState<Item[]>([]);
const getRegisteredItems = () =>
axios.get(`/api/items/get-all`)
@@ -42,11 +44,12 @@ const BillingPage = () => {
getRegisteredItems();
getRegisteredPeople();
}, []);
+
// TODO: to be handled by backend
const defGSTValue = 18;
// update the items from AddNewItemForm
- const getItems = (item) => setItems([...items, item]);
+ const getItems = (item: Item) => setItems([...items, item]);
return (
<>
diff --git a/src/interfaces.ts b/src/interfaces.ts
new file mode 100644
index 0000000..7090907
--- /dev/null
+++ b/src/interfaces.ts
@@ -0,0 +1,21 @@
+export interface Transport {
+ name: string,
+ vehicleNum: string,
+ method: string,
+ gstin: string,
+ builty: string
+}
+
+export interface Item {
+ Model: string,
+ Description: string,
+ Quantity: number,
+ UnitPrice: number,
+ TotalValue: number, // UnitPrice * Quantity
+ Discount: number,
+ HSN: number, // string??
+
+ sgst: number,
+ cgst: number,
+ igst: number
+}