diff --git a/src/App.js b/src/App.js index 610e47d694..7ac0e9bc14 100644 --- a/src/App.js +++ b/src/App.js @@ -4,6 +4,12 @@ import 'bootstrap/dist/css/bootstrap.min.css'; //Code to import Budget.js import Budget from './components/Budget'; +import Remaining from './components/Remaining'; +import ExpenseTotal from './components/ExpenseTotal'; +import ExpenseList from './components/ExpenseList'; +import ExpenseItem from './components/ExpenseItem'; +import AllocationForm from './components/AllocationForm'; + // Add code to import the other components here under @@ -17,26 +23,47 @@ const App = () => { <div className='row mt-3'> { /* Add Budget component here */ + // Budget component + <div className='col-sm'> + <Budget /> + </div> } { /* Add Remaining component here*/ + //Remaining component + <div className='col-sm'> + <Remaining /> + </div> } { /* Add ExpenseTotal component here */ + //ExpenseTotal component + <div className='col-sm'> + <ExpenseTotal /> + </div> } { /* Add ExpenseList component here */ + <div className='col-sm'> + <ExpenseList /> + </div> } { /* Add ExpenseItem component here */ + <div className='col-sm'> + <ExpenseItem /> + </div> } { /* Add AllocationForm component here under */ + <div className='col-sm'> + <AllocationForm /> + </div> } </div> diff --git a/src/components/AllocationForm.js b/src/components/AllocationForm.js index 8b13789179..4c4d32c5e4 100644 --- a/src/components/AllocationForm.js +++ b/src/components/AllocationForm.js @@ -1 +1,81 @@ +import React, { useContext, useState } from 'react'; +import { AppContext } from '../context/AppContext'; +const AllocationForm = (props) => { + const { dispatch,remaining } = useContext(AppContext); + + const [name, setName] = useState(''); + const [cost, setCost] = useState(''); + const [action, setAction] = useState(''); + + const submitEvent = () => { + + if(cost > remaining) { + alert("The value cannot exceed remaining funds £"+remaining); + setCost(""); + return; + } + + const expense = { + name: name, + cost: parseInt(cost), + }; + if(action === "Reduce") { + dispatch({ + type: 'RED_EXPENSE', + payload: expense, + }); + } else { + dispatch({ + type: 'ADD_EXPENSE', + payload: expense, + }); + } + }; + + return ( + <div> + <div className='row'> + + <div className="input-group mb-3" style={{ marginLeft: '2rem' }}> + <div className="input-group-prepend"> + <label className="input-group-text" htmlFor="inputGroupSelect01">Department</label> + </div> + <select className="custom-select" id="inputGroupSelect01" onChange={(event) => setName(event.target.value)}> + <option defaultValue>Choose...</option> + <option value="Marketing" name="marketing"> Marketing</option> + <option value="Sales" name="sales">Sales</option> + <option value="Finance" name="finance">Finance</option> + <option value="HR" name="hr">HR</option> + <option value="IT" name="it">IT</option> + <option value="Admin" name="admin">Admin</option> + </select> + + <div className="input-group-prepend" style={{ marginLeft: '2rem' }}> + <label className="input-group-text" htmlFor="inputGroupSelect02">Allocation</label> + </div> + <select className="custom-select" id="inputGroupSelect02" onChange={(event) => setAction(event.target.value)}> + <option defaultValue value="Add" name="Add">Add</option> + <option value="Reduce" name="Reduce">Reduce</option> + </select> + + <input + required='required' + type='number' + id='cost' + value={cost} + style={{ marginLeft: '2rem' , size: 10}} + onChange={(event) => setCost(event.target.value)}> + </input> + + <button className="btn btn-primary" onClick={submitEvent} style={{ marginLeft: '2rem' }}> + Save + </button> + </div> + </div> + + </div> + ); +}; + +export default AllocationForm; diff --git a/src/components/Budget.js b/src/components/Budget.js index 8b13789179..73e2bc1955 100644 --- a/src/components/Budget.js +++ b/src/components/Budget.js @@ -1 +1,17 @@ +import React, { useContext, useState } from 'react'; +import { AppContext } from '../context/AppContext'; +const Budget = () => { + const { budget } = useContext(AppContext); + const [newBudget, setNewBudget] = useState(budget); + const handleBudgetChange = (event) => { + setNewBudget(event.target.value); + } + return ( +<div className='alert alert-secondary'> +<span>Budget: £{budget}</span> +<input type="number" step="10" value={newBudget} onChange={handleBudgetChange}></input> +</div> + ); +}; +export default Budget; diff --git a/src/components/ExpenseItem.js b/src/components/ExpenseItem.js index 8b13789179..7b9f9919db 100644 --- a/src/components/ExpenseItem.js +++ b/src/components/ExpenseItem.js @@ -1 +1,38 @@ +import React, { useContext } from 'react'; +import { TiDelete } from 'react-icons/ti'; +import { AppContext } from '../context/AppContext'; +const ExpenseItem = (props) => { + const { dispatch } = useContext(AppContext); + + const handleDeleteExpense = () => { + dispatch({ + type: 'DELETE_EXPENSE', + payload: props.id, + }); + }; + + const increaseAllocation = (name) => { + const expense = { + name: name, + cost: 10, + }; + + dispatch({ + type: 'ADD_EXPENSE', + payload: expense + }); + + } + + return ( + <tr> + <td>{props.name}</td> + <td>£{props.cost}</td> + <td><button onClick={event=> increaseAllocation(props.name)}>+</button></td> + <td><TiDelete size='1.5em' onClick={handleDeleteExpense}></TiDelete></td> + </tr> + ); +}; + +export default ExpenseItem; diff --git a/src/components/ExpenseList.js b/src/components/ExpenseList.js index 8b13789179..34f88a4028 100644 --- a/src/components/ExpenseList.js +++ b/src/components/ExpenseList.js @@ -1 +1,27 @@ +import React, { useContext } from 'react'; +import ExpenseItem from './ExpenseItem'; +import { AppContext } from '../context/AppContext'; +const ExpenseList = () => { + const { expenses } = useContext(AppContext); + + return ( + <table className='table'> + <thead className="thead-light"> + <tr> + <th scope="col">Department</th> + <th scope="col">Allocated Budget</th> + <th scope="col">Increase by 10</th> + <th scope="col">Delete</th> + </tr> + </thead> + <tbody> + {expenses.map((expense) => ( + <ExpenseItem id={expense.id} key={expense.id} name={expense.name} cost={expense.cost} /> + ))} + </tbody> + </table> + ); +}; + +export default ExpenseList; diff --git a/src/components/ExpenseTotal.js b/src/components/ExpenseTotal.js index 8b13789179..dfee1975c9 100644 --- a/src/components/ExpenseTotal.js +++ b/src/components/ExpenseTotal.js @@ -1 +1,14 @@ - +import React, { useContext } from 'react'; +import { AppContext } from '../context/AppContext'; +const ExpenseTotal = () => { + const { expenses } = useContext(AppContext); + const totalExpenses = expenses.reduce((total, item) => { + return (total += item.cost); + }, 0); + return ( + <div className='alert alert-primary'> + <span>Spent so far: £{totalExpenses}</span> + </div> + ); +}; +export default ExpenseTotal; diff --git a/src/components/Remaining.js b/src/components/Remaining.js index 8b13789179..3b40443bd8 100644 --- a/src/components/Remaining.js +++ b/src/components/Remaining.js @@ -1 +1,15 @@ - +import React, { useContext } from 'react'; +import { AppContext } from '../context/AppContext'; +const Remaining = () => { + const { expenses, budget } = useContext(AppContext); + const totalExpenses = expenses.reduce((total, item) => { + return (total = total + item.cost); + }, 0); + const alertType = totalExpenses > budget ? 'alert-danger' : 'alert-success'; + return ( + <div className={`alert ${alertType}`}> + <span>Remaining: £{budget - totalExpenses}</span> + </div> + ); +}; +export default Remaining;