Commit 1abc5ed2 authored by Alex Segers's avatar Alex Segers

🔀 [AFP-135] Merge branch 'dev' of...

🔀  [AFP-135] Merge branch 'dev' of https://gitlab.mynisum.com/ascend/order-management-react into AFP-135 (@asegers)
parents d5f3e16d 592cb41f
......@@ -2,7 +2,7 @@
"name": "order-management-client",
"version": "0.1.0",
"private": true,
"proxy": "http://localhost:8080",
"proxy": "http://localhost:4",
"dependencies": {
"@chakra-ui/icons": "^1.0.13",
"@chakra-ui/react": "^1.6.0",
......
import React, { useMemo} from 'react'
import React, { useMemo, useRef, useState, useEffect } from 'react'
import { Link } from 'react-router-dom'
import {useGoogleAuth} from 'hooks'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faUser } from '@fortawesome/free-solid-svg-icons'
import { Box, Heading, Flex, Spacer, Button, Image, Avatar } from "@chakra-ui/react"
import { AccountPage } from 'pages'
import { Box, Heading, Flex, Spacer, Button, Image, Avatar, HStack, Input } from "@chakra-ui/react"
import Logo from '../img/logo.png'
import {
Drawer,
DrawerBody,
DrawerHeader,
DrawerOverlay,
DrawerContent,
DrawerCloseButton,
useDisclosure
} from "@chakra-ui/react"
import {
Menu,
MenuButton,
MenuList,
MenuItem,
MenuItemOption,
MenuGroup,
MenuOptionGroup,
MenuIcon,
MenuCommand,
MenuDivider,
} from "@chakra-ui/react"
import { ChevronDownIcon } from '@chakra-ui/icons'
const Nav = () => {
const { isSignedIn, signOut, signIn, manager } = useGoogleAuth();
const handleAuth = () => { isSignedIn ? signOut() : signIn();}
const loginIcon = faUser
const authLinkText = useMemo(() => isSignedIn ? "Logout" : "Login", [isSignedIn]);
const { isOpen, onOpen, onClose } = useDisclosure();
const btnRef = useRef<HTMLButtonElement>(null);
const userName = isSignedIn ? <p>{manager.firstName} {manager.lastName}</p> : null
const userIcon = isSignedIn ?
<Avatar name={manager.firstName + " " + manager.lastName} boxSize="40px" borderRadius="full" src={manager.imageUrl} alt="profile"/> : null
<Avatar boxSize="40px" borderRadius="full" src={manager.imageUrl} alt="profile"/> : <div>{authLinkText}</div>
return (
<Flex className="header">
<Box className="left-nav">
<Link to="/"><Image src={Logo} alt="project logo" height="90%" width="80%" /></Link>
<Flex className="header" justifyContent="space-between">
<Box >
<h1 className="header-title">Ascend Final Project</h1>
</Box>
<Box className="center-nav" display="-ms-inline-flexbox">
<HStack>
<Link to="/"><Image src={Logo} alt="project logo" className="logoImg"/></Link>
<h1>Order Management</h1>
{/* <Link to="/"><h1>Order Management</h1></Link> */}
</HStack>
</Box>
{/* <HStack className="right-nav" spacing="1px">
<Box><button onClick={handleAuth}>{authLinkText}</button></Box>
<Box><button ref={btnRef} onClick={onOpen}>{userIcon}</button></Box>
<Drawer
isOpen={isOpen}
placement="right"
onClose={onClose}
finalFocusRef={btnRef}
>
<DrawerOverlay />
<DrawerContent>
<DrawerCloseButton size="sm"/>
<DrawerHeader align="center" >User Account</DrawerHeader>
<DrawerBody>
<AccountPage />
</DrawerBody>
</DrawerContent>
</Drawer>
</HStack> */}
<Box >
<Menu>
<MenuButton rightIcon={<ChevronDownIcon />} onClick={onOpen} width="300px" className="right-nav">
<HStack>
<span>{userIcon}</span>
<span>{userName}</span>
{/* <span>{authLinkText}</span> */}
</HStack>
</MenuButton>
<MenuList>
<MenuItem color="black"><Link to="/orders">Orders</Link></MenuItem>
<MenuItem color="black"><Link to="/account">Account</Link></MenuItem>
<MenuItem color="black"><button onClick={handleAuth}>{authLinkText}</button></MenuItem>
</MenuList>
</Menu>
</Box>
<Spacer />
<Flex className="right-nav">
<Link className="nav-link" to="/account">{userIcon}</Link>
<Button
p={2}
size="sm"
color="white"
fontWeight="bold"
borderRadius="sm"
bgGradient="linear(to-r, teal.500,blue.500)"
_hover={{
bgGradient: "linear(to-r, blue.500, yellow.500)",
}}
><Link to="/orders">Orders</Link></Button>
<Button
p={2}
size="sm"
color="white"
fontWeight="bold"
borderRadius="sm"
bgGradient="linear(to-r, teal.500,blue.500)"
_hover={{
bgGradient: "linear(to-r, yellow.500, blue.500)",
}}
onClick={handleAuth}>{authLinkText}</Button>
</Flex>
</Flex>
)
}
......
......@@ -21,7 +21,7 @@ const OrderDetails = (props: any) => {
const status = props.status
return (
<>
<Td><Link to={"/orders/" + orderNumber}>{orderNumber.slice(orderNumber.length - 7).toUpperCase()}</Link></Td>
<Td><Link to={"/orders/" + orderNumber}>{orderNumber}</Link></Td>
<Td>{date}</Td>
<Td>{status}</Td>
</>
......
......@@ -23,12 +23,12 @@ const OrderShowDetails = (props: any) => {
const itemMap = (items: Item[]) => {
return items.map((item: Item, idx: number) => {
return (
<tr key={idx}>
<Tr key={idx} >
<Td >{item.itemId}</Td >
<Td >{item.itemPrice}</Td >
<Td >{item.itemQuantity}</Td >
<Td >{item.itemSku}</Td >
</tr>
</Tr>
)
});
}
......@@ -37,19 +37,19 @@ const OrderShowDetails = (props: any) => {
return (
items ?
<div className="table-div">
<Table variant="striped" colorScheme="messenger" size="lg">
<Tbody>
<Tr className="table-header">
<Th fontSize="22px" color="gray">ID</Th>
<Th fontSize="22px" color="gray">Price</Th>
<Th fontSize="22px" color="gray">Quantity</Th>
<Th fontSize="22px" color="gray">SKU</Th>
</Tr>
{itemDetails}
</Tbody>
</Table>
</div>
<Table variant="striped" colorScheme="messenger" size="lg">
<Thead >
<Tr className="table-header" >
<Th fontSize="21px" color="rgba(255, 166, 0, 0.897)">ID</Th>
<Th fontSize="21px" color="rgba(255, 166, 0, 0.897)">Price</Th>
<Th fontSize="21px" color="rgba(255, 166, 0, 0.897)">Quantity</Th>
<Th fontSize="21px" color="rgba(255, 166, 0, 0.897)">SKU</Th>
</Tr>
</Thead>
<Tbody>
{itemDetails}
</Tbody>
</Table>
:
<div className="Order without items">
This order didn't contain any items.
......
src/img/logo.png

10.3 KB | W: | H:

src/img/logo.png

4.22 KB | W: | H:

src/img/logo.png
src/img/logo.png
src/img/logo.png
src/img/logo.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -15,46 +15,106 @@ code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
}
html, body {
height: 100%;
}
body {
display: flex;
flex-direction: column;
}
.content {
min-height: calc(100vh - 70px);
}
/* homepage */
.homepage {
padding: 200px 0;
}
/* .svg-inline--fa {
display: inline-block;
font-size: 24px;
height: 1.7em;
overflow: visible;
vertical-align: -0.325em;
} */
/* header */
.header {
border-bottom: 1.5px solid orange;
border-top: 1.5px solid rgba(80, 76, 69, 0.603);
background-color: #00567D;
height: 50px;
color: #EBEBEB;
}
.header-title {
margin-left: 70px;
margin-top: 10px;
}
.header h1 {
color: #EBEBEB;
}
.header span {
color: #EBEBEB;
}
.center-nav {
padding: 0 0 0 10px;
}
.center-nav p {
margin-left: -250px;
}
.logoImg {
width: 150px;
height: 45px;
}
.left-nav {
padding: 10px 0px 0px 50px;
.left-nav Link {
color: red;
}
.right-nav {
padding: 30px 120px 0px 0px;
margin-top: 2.5px;
}
.right-nav Button {
background-color: rgb(235, 221, 178);
/* .right-nav button {
background-color: transparent;
margin-right: 15px;
margin-top: 4px;
} */
/* .right-nav span {
margin-left: 10px;
margin-right: 25px;
font-weight: 600;
} */
.chakra-stack.right-nav.css-193rmy8 {
margin-bottom: 50%;
}
.chakra-menu__menu-button.css-59llwj {
/* margin-right: 500px; */
width: 250px;
}
.nav-link {
margin-right: 15px;
margin-left: 15px;
}
......@@ -62,9 +122,45 @@ code {
/* body */
.table-div {
padding: 150px;
padding-top: 80px;
.content {
flex: 1 0 auto;
}
.search-div {
padding: 2px;
}
input[type=text] {
width: 220px;
border: 2px solid rgb(184, 180, 180);
border-radius: 4px;
font-size: 14px;
background-color: white;
background-image: url('./img/searchicon.png');
background-size: 18px;
background-position: 10px 8px;
background-repeat: no-repeat;
padding: 12px 20px 12px 40px;
transition: width 0.4s ease-in-out;
height: 35px;
}
input[type=text]:focus {
width: 100%;
}
.searchbar:focus {
outline: none;
}
.body-content-div {
padding: 120px;
padding-top: 20px;
}
.index-table {
......@@ -72,30 +168,53 @@ code {
padding: 0 10px 15px 10px;
border-radius: 2px;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
padding-top: 10px;
}
.show-div {
padding: 80px 150px;
padding: 80px 100px;
}
.show-table {
border: 1px solid rgb(110, 106, 106);
/* padding: 0 10px 15px 10px; */
padding: 0 10px 15px 10px;
border-radius: 2px;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
}
.table-header {
background-color: rgba(228, 158, 67, 0.5);
color: black;
background-color: #00557ddc;
}
/* User Drawer */
.account {
padding: 40px 0;
border-top: 1px solid rgba(68, 64, 64, 0.363);
border-bottom: 1px solid rgba(68, 64, 64, 0.363);
}
/* .user-name {
padding-top: 3.5px;
} */
/* .chakra-stack__divider.css-vhtjkn {
height: -140px;
} */
/* footer */
.footer {
padding: 10px 0;
border-top: 1.5px solid orange;
padding: 5px 0;
border-bottom: 2.5px solid rgba(80, 76, 69, 0.603);
background-color: rgba(216, 130, 32, 0.404);
flex-shrink: 0;
font-size: 12px;
}
\ No newline at end of file
import { Box, Avatar, Center } from '@chakra-ui/react'
import { Box, Avatar, Center, VStack, StackDivider, Spacer, Flex } from '@chakra-ui/react'
import {useGoogleAuth} from 'hooks'
const AccountPage = () => {
const { manager } = useGoogleAuth();
return (
<Center>
<Box>
<Box>
<Avatar name={manager.firstName + " " + manager.lastName} size="2xl" src={manager.imageUrl} alt="profile" />
</Box>
<Box>
Email: {manager.email}
</Box>
<Box>
First Name: {manager.firstName}
</Box>
<Box>
Last Name: {manager.lastName}
<VStack className="account">
<Avatar name={manager.firstName + " " + manager.lastName} size="2xl" src={manager.imageUrl} alt="profile" />
<Box w="270px" >
<VStack
divider={<StackDivider borderColor="gray.200" />}
spacing={4}
align="center"
>
<Box h="5px" className="user-name">{manager.firstName} {manager.lastName}</Box>
<Box h="28px"
w="280px"
size="sm"
align="center"
color="white"
fontWeight="bold"
borderRadius="md"
bgGradient="linear(to-r, teal.500,blue.500)"
// _hover={{
// bgGradient: "linear(to-r, blue.500, yellow.500)",
// }}
>{manager.email }
</Box>
</VStack>
</Box>
</Center>
</VStack>
)
}
......
......@@ -19,11 +19,12 @@ const OrderIndexPage = () => {
const [orderDetailsArr, setOrderDetailsArr] = useState<any>([])
const orderDetailsArrCreator = (orders: Order[]) => {
return orders.map((order: Order, idx: any) => {
return <Tr key={idx}><OrderDetails
date={new Date(order.orderCreatedAt).toLocaleDateString()}
orderNumber={order.id}
status={order.orderStatus}
/></Tr>
return <Tr key={idx}>
<OrderDetails
date={new Date(order.orderCreatedAt).toLocaleDateString()}
orderNumber={order.id}
status={order.orderStatus}/>
</Tr>
})
}
......@@ -43,7 +44,7 @@ const OrderIndexPage = () => {
useEffect(() => {
const newArray: Order[] = []
for (const ele of allOrders) {
if (ele.id.includes(searchInput)) {
if (ele.id.includes(searchInput.toLowerCase())) {
newArray.push(ele)
}
}
......@@ -56,24 +57,26 @@ const OrderIndexPage = () => {
}
return (
<div className="table-div">
<Input
type="text"
placeholder="Search by Order Number"
focusBorderColor="telegram.400"
value={searchInput}
onChange={handleChange}
onKeyDown={handleChange}
>
</Input>
<br/>
<div className="body-content-div">
<div className="search-div">
<input
type="text"
placeholder="Search Order Number"
value={searchInput}
onChange={handleChange}
onKeyDown={handleChange}
className="searchbar"
>
</input>
</div>
<br/>
<div className="index-table">
<Table variant="striped" colorScheme="messenger" size="sm">
<Table variant="striped" colorScheme="messenger" size="md">
<Thead>
<Tr className="table-header">
<Th fontSize="26px" color="gray">Order number</Th>
<Th fontSize="26px" color="gray">Order Date</Th>
<Th fontSize="26px" color="gray">Order Status</Th>
<Th fontSize="24px" color="rgba(255, 166, 0, 0.897)">Order number</Th>
<Th fontSize="24px" color="rgba(255, 166, 0, 0.897)">Order Date</Th>
<Th fontSize="24px" color="rgba(255, 166, 0, 0.897)">Order Status</Th>
</Tr>
</Thead>
<Tbody>
......
......@@ -15,7 +15,7 @@ const OrderShowPage = (props: any) => {
// const { id } = useParams<any>();
// const { order } = useOrder(id)
const location = props.match.params.id;
const apiUrl = 'http://localhost:8080/api/orders/' + location;
const apiUrl = 'http://localhost:8084/api/orders/' + location;
const [order, setOrder] = useState<Order>();
const [items, setItems] = useState<Item[]>()
......@@ -36,7 +36,7 @@ const OrderShowPage = (props: any) => {
<div className="show-div">
<Flex justify="space-around">
<Box><strong>Order Date:</strong> {new Date(order.orderCreatedAt).toLocaleDateString()}</Box>
<Box><strong>Order Number:</strong> {order.id.slice(order.id.length - 7).toUpperCase()}</Box>
<Box><strong>Order Number:</strong> {order.id}</Box>
<Box><strong>Order Status:</strong> {order.orderStatus}</Box>
</Flex>
<br/>
......
......@@ -11,17 +11,19 @@ const MainRouter: React.FC = () => {
<StyleProvider>
<BrowserRouter>
<GoogleAuthProvider>
<Nav />
<main>
<Switch>
<PrivateRoute path="/account" component={AccountPage} />
<PublicRoute exact path="/" component={HomePage} />
<PrivateRoute path="/orders/:id" component={OrderShowPage} />
<PrivateRoute path="/orders" component={OrderIndexPage} />
{/* <Route component={NotFoundPage} /> */}
</Switch>
</main>
<Footer />
<body>
<Nav />
<main className="content">
<Switch>
<PrivateRoute path="/account" component={AccountPage} />
<PublicRoute exact path="/" component={HomePage} />
<PrivateRoute path="/orders/:id" component={OrderShowPage} />
<PrivateRoute path="/orders" component={OrderIndexPage} />
{/* <Route component={NotFoundPage} /> */}
</Switch>
</main>
<Footer />
</body>
</GoogleAuthProvider>
</BrowserRouter>
......
......@@ -6,7 +6,7 @@ import { sleep } from 'utils'
const BASE_PATH = '/api/orders'
export const allOrders = () => {
const apiUrl = 'http://localhost:8080/api/orders';
const apiUrl = 'http://localhost:8084/api/orders';
return fetch(apiUrl).then((response) => response.json())
}
......
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