Commit 0e805252 authored by Darrick Yong's avatar Darrick Yong

style order details, add collapse/expand

parent 995edcbc
.filter-search { .filter-search {
/* width: 50%; */
display: flex; display: flex;
align-items: center; align-items: center;
padding: 20px; padding: 20px;
...@@ -29,9 +28,13 @@ ...@@ -29,9 +28,13 @@
align-items: center; align-items: center;
} }
.filter-btns > * { .filter-btns > *,
.search-btn,
.collapse-btn,
.expand-btn {
cursor: pointer; cursor: pointer;
display: flex; display: flex;
align-items: center;
padding: 10px 20px; padding: 10px 20px;
border-radius: 5px; border-radius: 5px;
border: 1px solid black; border: 1px solid black;
...@@ -87,28 +90,36 @@ ...@@ -87,28 +90,36 @@
cursor: pointer; cursor: pointer;
border: none; border: none;
font-size: 16px; font-size: 16px;
font-family: 'Times New Roman', Times, serif; font-family: "Times New Roman", Times, serif;
} }
.search > input { .search > input {
padding: 10px; padding: 10px;
font-size: 16px; font-size: 16px;
font-family: 'Times New Roman', Times, serif; font-family: "Times New Roman", Times, serif;
} }
.search-btn { .search-btn:hover,
cursor: pointer; .collapse-btn:hover,
display: flex; .expand-btn:hover {
padding: 10px 20px; color: white;
border-radius: 5px;
border: 1px solid black;
}
.search-btn:hover {
color:white;
background: gray; background: gray;
} }
.error { .error {
color: red; color: red;
} }
\ No newline at end of file
.fs-collapse {
display: flex;
justify-content: space-between;
}
.collapse-expand {
display: flex;
padding: 20px;
}
.collapse-expand > * ~ * {
margin-left: 10px;
}
...@@ -129,7 +129,6 @@ ...@@ -129,7 +129,6 @@
padding: 20px 50px; padding: 20px 50px;
box-sizing: border-box; box-sizing: border-box;
overflow: scroll; overflow: scroll;
/* background: white; */
} }
.animate { .animate {
...@@ -142,6 +141,27 @@ ...@@ -142,6 +141,27 @@
font-size: 20px; font-size: 20px;
font-weight: 700; font-weight: 700;
border-bottom: 2px solid black; border-bottom: 2px solid black;
display: flex;
justify-content: space-between;
}
.order-details-name {
display: flex;
align-items: center;
}
.order-details-dates {
display: flex;
flex-direction: column;
font-weight: 400;
font-size: 16px;
font-style: italic;
width: 280px;
}
.order-details-dates > div {
display: flex;
justify-content: space-between;
} }
.order-detail-table { .order-detail-table {
...@@ -157,10 +177,6 @@ ...@@ -157,10 +177,6 @@
padding: 5px 20px; padding: 5px 20px;
} }
.item-detail ~ .item-detail {
/* border-top: 1px solid red; */
}
.item-sku, .item-qty { .item-sku, .item-qty {
text-align: center; text-align: center;
} }
......
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import Header from "./components/header/Header"; import Header from "./components/header/Header";
import OrderIndex from "./components/order/OrderIndex" import OrderIndex from "./components/order/OrderIndex";
import NoOrders from "./components/order/NoOrders"; import NoOrders from "./components/order/NoOrders";
import { fetchOrders } from "./actions/order_actions"; import { fetchOrders } from "./actions/order_actions";
import FilterSearch from "./components/filter/FilterSearch"; import FilterSearch from "./components/filter/FilterSearch";
import Button from "./components/atoms/Button";
const App = ({ orders, fetchOrders }) => { const App = ({ orders, fetchOrders }) => {
const [ordersToShow, setOrdersToShow] = useState(orders); const [ordersToShow, setOrdersToShow] = useState(orders);
const [fetchAttempted, setFetchAttempted] = useState(false); const [fetchAttempted, setFetchAttempted] = useState(false);
const [collapseAll, setCollapseAll] = useState(false);
// debugger const [expandAll, setExpandAll] = useState(false);
useEffect(() => { useEffect(() => {
if (!fetchAttempted) { if (!fetchAttempted) {
...@@ -24,15 +24,35 @@ const App = ({ orders, fetchOrders }) => { ...@@ -24,15 +24,35 @@ const App = ({ orders, fetchOrders }) => {
return ( return (
<div className="app"> <div className="app">
<Header /> <Header />
<FilterSearch setOrdersToShow={setOrdersToShow} /> <div className="fs-collapse">
<FilterSearch setOrdersToShow={setOrdersToShow} />
<div className="collapse-expand">
<Button
className="collapse-btn"
onClick={() => setCollapseAll(true)}
text={`Collapse All`}
/>
<Button
className="expand-btn"
onClick={() => setExpandAll(true)}
text={`Expand All`}
/>
</div>
</div>
{ordersToShow.allIds.length ? ( {ordersToShow.allIds.length ? (
<OrderIndex orders={ordersToShow} /> <OrderIndex
orders={ordersToShow}
collapseAll={collapseAll}
expandAll={expandAll}
setCollapseAll={setCollapseAll}
setExpandAll={setExpandAll}
/>
) : ( ) : (
<NoOrders /> <NoOrders />
)} )}
</div> </div>
); );
} };
const mapStateToProps = (state) => ({ const mapStateToProps = (state) => ({
orders: state.entities.orders, orders: state.entities.orders,
......
...@@ -23,7 +23,6 @@ export const fetchOrders = () => (dispatch) => { ...@@ -23,7 +23,6 @@ export const fetchOrders = () => (dispatch) => {
export const editOrder = (order) => (dispatch) => { export const editOrder = (order) => (dispatch) => {
OrderAPIUtil.editOrder(order) OrderAPIUtil.editOrder(order)
.then(res => { .then(res => {
debugger
dispatch(updateOrder(res.data)) dispatch(updateOrder(res.data))
}); });
} }
\ No newline at end of file
import { useEffect, useState } from "react"; import { useState } from "react";
import Filter from "./Filter"; import Filter from "./Filter";
import Search from "./Search"; import Search from "./Search";
......
import React from 'react'; import React from "react";
import Login from "../session/Login";
import Logout from "../session/Logout"; import Logout from "../session/Logout";
const Header = () => { const Header = () => {
...@@ -9,6 +8,6 @@ const Header = () => { ...@@ -9,6 +8,6 @@ const Header = () => {
<Logout /> <Logout />
</div> </div>
); );
} };
export default Header; export default Header;
\ No newline at end of file
const ItemDetails = ({ item }) => { const ItemDetails = ({ item }) => {
const { itemName, itemQuantity, itemPrice, itemSku } = item;
const { itemId, itemName, itemQuantity, itemPrice, itemSku } = item;
return ( return (
<tr className="item-detail"> <tr className="item-detail">
...@@ -9,10 +8,7 @@ const ItemDetails = ({ item }) => { ...@@ -9,10 +8,7 @@ const ItemDetails = ({ item }) => {
<td className="item-qty">{itemQuantity}</td> <td className="item-qty">{itemQuantity}</td>
<td className="item-price">{`$${itemPrice.toFixed(2)}`}</td> <td className="item-price">{`$${itemPrice.toFixed(2)}`}</td>
</tr> </tr>
// <li className="item-detail">
// {`${itemName} -- x ${itemQuantity} bought at ${itemPrice}/ea.`}
// </li>
); );
} };
export default ItemDetails; export default ItemDetails;
\ No newline at end of file
import ItemDetails from "./ItemDetails"; import ItemDetails from "./ItemDetails";
const OrderDetails = ({ order, showDetails }) => { const OrderDetails = ({ order, showDetails }) => {
const createdDate = new Date(order.createdAt);
const modifiedDate = new Date(order.modifiedAt);
const status =
order.status[0].toUpperCase() + order.status.substr(1).toLowerCase();
const dateToString = (date) => {
const month = date.toLocaleString("default", { month: "short" });
const day = date.getDate();
const year = date.getFullYear();
const time = date.toLocaleTimeString("en-US");
return `${month} ${day > 9 ? day : `0${day}`}, ${year} at ${time}`;
};
return ( return (
<div className={`order-details ${showDetails ? "animate" : ""}`}> <div className={`order-details ${showDetails ? "animate" : ""}`}>
<div className="order-details-container"> <div className="order-details-container">
<div className="order-details-header">Order Details:</div> <div className="order-details-header">
<div className="order-details-name">Order Details:</div>
<div className="order-details-dates">
<div>
<div>Created on:</div>
<div>{dateToString(createdDate)}</div>
</div>
{order.modifiedAt ? (
<div>
<div>{`${status} on:`}</div>
<div>{dateToString(modifiedDate)}</div>
</div>
) : null}
</div>
</div>
<table className="order-detail-table"> <table className="order-detail-table">
<thead> <thead>
<tr> <tr>
...@@ -25,6 +51,6 @@ const OrderDetails = ({ order, showDetails }) => { ...@@ -25,6 +51,6 @@ const OrderDetails = ({ order, showDetails }) => {
</div> </div>
</div> </div>
); );
} };
export default OrderDetails; export default OrderDetails;
\ No newline at end of file
...@@ -2,13 +2,26 @@ import OrderIndexItem from './OrderIndexItem'; ...@@ -2,13 +2,26 @@ import OrderIndexItem from './OrderIndexItem';
const OrderIndex = ({ const OrderIndex = ({
orders, orders,
collapseAll,
expandAll,
setCollapseAll,
setExpandAll,
}) => { }) => {
return ( return (
<div className="order-index"> <div className="order-index">
<h1>Order Index</h1> <h1>Order Index</h1>
{orders.allIds.map((orderId) => { {orders.allIds.map((orderId) => {
const order = orders.byId[orderId]; const order = orders.byId[orderId];
return <OrderIndexItem key={order.id} order={order} />; return (
<OrderIndexItem
key={order.id}
order={order}
collapseAll={collapseAll}
expandAll={expandAll}
setCollapseAll={setCollapseAll}
setExpandAll={setExpandAll}
/>
);
})} })}
</div> </div>
); );
......
import React, { useState } from 'react'; import React, { useEffect, useState } from "react";
import OrderButtons from './OrderButtons'; import OrderButtons from "./OrderButtons";
import { FiChevronRight } from 'react-icons/fi'; import { FiChevronRight } from "react-icons/fi";
import OrderDetails from './OrderDetails'; import OrderDetails from "./OrderDetails";
const OrderIndexItem = ({ order }) => { const OrderIndexItem = ({
order,
const { collapseAll,
id, expandAll,
orderId, setCollapseAll,
status, setExpandAll,
orderItems, }) => {
createdAt, const { orderId, status } = order;
modifiedAt
} = order;
const [showDetails, setShowDetails] = useState(false); const [showDetails, setShowDetails] = useState(false);
const actions = ( status === "FULFILLED" || status === "CANCELLED" ? useEffect(() => {
<div className={`oii-status ${status.toLowerCase()}`}>{status}</div> : if (collapseAll) {
<OrderButtons order={order} /> setShowDetails(false);
); }
if (expandAll) {
setShowDetails(true);
}
setCollapseAll(false);
setExpandAll(false);
}, [showDetails, collapseAll, expandAll]);
const handleDropDown = () => {
setShowDetails(!showDetails);
};
const actions =
status === "FULFILLED" || status === "CANCELLED" ? (
<div className={`oii-status ${status.toLowerCase()}`}>{status}</div>
) : (
<OrderButtons order={order} />
);
return ( return (
<div className="oii"> <div className="oii">
<div className="oii-container"> <div className="oii-container">
<div className="oii-left"> <div className="oii-left">
<FiChevronRight className={`oii-drop ${showDetails ? "rotate" : ""}`} onClick={() => setShowDetails(!showDetails)}/> <FiChevronRight
className={`oii-drop ${showDetails ? "rotate" : ""}`}
onClick={handleDropDown}
/>
<div className="oii-num">{`Order #: ${orderId}`}</div> <div className="oii-num">{`Order #: ${orderId}`}</div>
</div> </div>
{actions} {actions}
...@@ -33,7 +51,7 @@ const OrderIndexItem = ({ order }) => { ...@@ -33,7 +51,7 @@ const OrderIndexItem = ({ order }) => {
<OrderDetails showDetails={showDetails} order={order} /> <OrderDetails showDetails={showDetails} order={order} />
</div> </div>
) );
}; };
export default OrderIndexItem; export default OrderIndexItem;
...@@ -5,6 +5,5 @@ export const getOrders =() => { ...@@ -5,6 +5,5 @@ export const getOrders =() => {
} }
export const editOrder = (order) => { export const editOrder = (order) => {
debugger;
return axios.put(`http://localhost:8080/api/orders/${order.id}`, order) return axios.put(`http://localhost:8080/api/orders/${order.id}`, order)
} }
...@@ -32,7 +32,7 @@ public class WarehouseOrderService { ...@@ -32,7 +32,7 @@ public class WarehouseOrderService {
public Mono<WarehouseOrder> createOrder(WarehouseOrder order) { public Mono<WarehouseOrder> createOrder(WarehouseOrder order) {
order.setStatus("RECEIVED"); order.setStatus("RECEIVED");
order.setCreatedAt(new Date(System.currentTimeMillis())); order.setCreatedAt(new Date(System.currentTimeMillis()));
order.setModifiedAt(new Date(System.currentTimeMillis())); // order.setModifiedAt(new Date(System.currentTimeMillis()));
List<Item> itemList = Arrays.asList( List<Item> itemList = Arrays.asList(
new Item("3", "Hamburger", 3, 3, 33), new Item("3", "Hamburger", 3, 3, 33),
new Item("4", "Sausage", 4, 5, 66), new Item("4", "Sausage", 4, 5, 66),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment