Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
W
warehouse-management
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ascend
warehouse-management
Commits
6527d4a3
Commit
6527d4a3
authored
May 10, 2021
by
Philippe Fonzin
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feat/style' into 'master'
Feat/style See merge request
!11
parents
8cbcc3c4
7a30287d
Changes
35
Hide whitespace changes
Inline
Side-by-side
Showing
35 changed files
with
505 additions
and
161 deletions
+505
-161
filter.css
frontend/public/stylesheets/filter.css
+37
-25
header.css
frontend/public/stylesheets/header.css
+17
-2
master.css
frontend/public/stylesheets/master.css
+10
-1
order.css
frontend/public/stylesheets/order.css
+79
-18
reset.css
frontend/public/stylesheets/reset.css
+3
-0
session.css
frontend/public/stylesheets/session.css
+5
-0
App.jsx
frontend/src/App.jsx
+27
-9
Root.jsx
frontend/src/Root.jsx
+26
-0
order_actions.js
frontend/src/actions/order_actions.js
+0
-1
session_actions.js
frontend/src/actions/session_actions.js
+26
-0
Image.jsx
frontend/src/components/atoms/Image.jsx
+5
-0
Input.jsx
frontend/src/components/atoms/Input.jsx
+11
-2
Select.jsx
frontend/src/components/atoms/Select.jsx
+2
-1
Filter.jsx
frontend/src/components/filter/Filter.jsx
+5
-1
FilterSearch.jsx
frontend/src/components/filter/FilterSearch.jsx
+8
-4
Search.jsx
frontend/src/components/filter/Search.jsx
+29
-14
Header.jsx
frontend/src/components/header/Header.jsx
+16
-8
ItemDetails.jsx
frontend/src/components/order/ItemDetails.jsx
+10
-8
NoOrders.jsx
frontend/src/components/order/NoOrders.jsx
+2
-2
OrderDetails.jsx
frontend/src/components/order/OrderDetails.jsx
+48
-10
OrderIndex.jsx
frontend/src/components/order/OrderIndex.jsx
+15
-2
OrderIndexItem.jsx
frontend/src/components/order/OrderIndexItem.jsx
+39
-21
Login.jsx
frontend/src/components/session/Login.jsx
+19
-11
Logout.jsx
frontend/src/components/session/Logout.jsx
+13
-8
index.jsx
frontend/src/index.jsx
+2
-2
root_reducer.js
frontend/src/reducers/root_reducer.js
+2
-0
session_reducer.js
frontend/src/reducers/session/session_reducer.js
+23
-0
orders_api_util.jsx
frontend/src/util/orders_api_util.jsx
+0
-1
session_api_util.jsx
frontend/src/util/session_api_util.jsx
+7
-0
SessionController.java
...finalproject/warehouse/controllers/SessionController.java
+2
-2
WarehouseController.java
...nalproject/warehouse/controllers/WarehouseController.java
+1
-0
Item.java
...in/java/com/ascendfinalproject/warehouse/models/Item.java
+2
-2
OrderResponse.java
...om/ascendfinalproject/warehouse/models/OrderResponse.java
+8
-2
SessionService.java
...ascendfinalproject/warehouse/services/SessionService.java
+3
-2
WarehouseOrderService.java
...inalproject/warehouse/services/WarehouseOrderService.java
+3
-2
No files found.
frontend/public/stylesheets/filter.css
View file @
6527d4a3
.filter-search
{
.filter-search
{
/* width: 50%; */
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
padding
:
20px
;
padding
:
20px
;
...
@@ -11,7 +10,7 @@
...
@@ -11,7 +10,7 @@
}
}
.filter-search
>
*
~
*
{
.filter-search
>
*
~
*
{
margin-left
:
10
0px
;
margin-left
:
5
0px
;
}
}
.filter
{
.filter
{
...
@@ -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
;
...
@@ -46,32 +49,32 @@
...
@@ -46,32 +49,32 @@
}
}
.filter-all
:hover
{
.filter-all
:hover
{
background
:
orange
;
background
:
#2b4162
;
color
:
white
;
color
:
white
;
}
}
.filter-all.selected
{
.filter-all.selected
{
background
:
orange
;
background
:
#2b4162
;
}
}
.filter-rec
:hover
{
.filter-rec
:hover
{
background
:
blue
;
background
:
#2292A4
;
color
:
white
;
color
:
white
;
}
}
.filter-rec.selected
{
.filter-rec.selected
{
background
:
blue
;
background
:
#2292A4
;
}
}
.filter-ful
:hover
{
.filter-ful
:hover
{
background
:
green
;
background
:
#4daa57
;
color
:
white
;
color
:
white
;
}
}
.filter-ful.selected
{
.filter-ful.selected
{
background
:
green
;
background
:
#4daa57
;
}
}
.filter-can
:hover
{
.filter-can
:hover
{
background
:
red
;
background
:
#c1292e
;
color
:
white
;
color
:
white
;
}
}
.filter-can.selected
{
.filter-can.selected
{
background
:
red
;
background
:
#c1292e
;
}
}
.search
{
.search
{
...
@@ -85,30 +88,39 @@
...
@@ -85,30 +88,39 @@
.search
>
select
{
.search
>
select
{
cursor
:
pointer
;
cursor
:
pointer
;
border
:
none
;
padding
:
10px
0
;
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
,
.expand-btn
:hover
{
color
:
white
;
background
:
#2b4162
;
}
.search-select-error
,
.search-input-error
{
border
:
2px
solid
#c1292e
;
}
.fs-collapse
{
display
:
flex
;
display
:
flex
;
padding
:
10px
20px
;
justify-content
:
space-between
;
border-radius
:
5px
;
border
:
1px
solid
black
;
}
}
.
search-btn
:hover
{
.
collapse-expand
{
color
:
white
;
display
:
flex
;
background
:
gray
;
padding
:
20px
;
}
}
.error
{
.collapse-expand
>
*
~
*
{
color
:
red
;
margin-left
:
10px
;
}
}
\ No newline at end of file
frontend/public/stylesheets/header.css
View file @
6527d4a3
.header
{
.header
{
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
align-items
:
center
;
padding
:
10px
20px
;
height
:
50px
;
height
:
50px
;
background
:
gray
;
background
:
#2b4162
;
color
:
white
;
color
:
#fff
;
;
font-size
:
28px
;
font-weight
:
700
;
}
.header
>
div
{
display
:
flex
;
align-items
:
center
;
}
.header
img
{
margin-right
:
10px
;
width
:
32px
;
height
:
32px
;
}
}
\ No newline at end of file
frontend/public/stylesheets/master.css
View file @
6527d4a3
...
@@ -2,4 +2,13 @@
...
@@ -2,4 +2,13 @@
@import
'./header.css'
;
@import
'./header.css'
;
@import
'./footer.css'
;
@import
'./footer.css'
;
@import
'./filter.css'
;
@import
'./filter.css'
;
@import
'./order.css'
;
@import
'./order.css'
;
\ No newline at end of file
@import
'./session.css'
;
/* background: #2b4162; */
/* background: #4daa57 */
/* background: #c1292e */
/* background: #2292A4; */
/* background: #f5f0f6; */
/* background: #acb0bd; */
frontend/public/stylesheets/order.css
View file @
6527d4a3
...
@@ -4,9 +4,10 @@
...
@@ -4,9 +4,10 @@
.order-index
>
h1
{
.order-index
>
h1
{
padding
:
10px
20px
;
padding
:
10px
20px
;
margin-bottom
:
2px
;
margin-bottom
:
2px
;
background
:
blue
;
background
:
#2b4162
;
color
:
white
;
color
:
white
;
font-size
:
20px
;
font-size
:
24px
;
font-weight
:
700
;
}
}
.order-index
.oii
~
.oii
{
.order-index
.oii
~
.oii
{
margin-top
:
15px
;
margin-top
:
15px
;
...
@@ -17,8 +18,9 @@
...
@@ -17,8 +18,9 @@
flex-direction
:
column
;
flex-direction
:
column
;
justify-content
:
center
;
justify-content
:
center
;
min-height
:
70px
;
min-height
:
70px
;
background
:
lightgray
;
background
:
#eee
;
border-radius
:
5px
;
border-radius
:
5px
;
font-size
:
24px
;
}
}
.oii-container
{
.oii-container
{
...
@@ -58,7 +60,8 @@
...
@@ -58,7 +60,8 @@
display
:
flex
;
display
:
flex
;
justify-content
:
center
;
justify-content
:
center
;
align-items
:
center
;
align-items
:
center
;
width
:
180px
;
width
:
200px
;
font-size
:
20px
;
}
}
.oii-buttons
>
div
{
.oii-buttons
>
div
{
...
@@ -75,37 +78,37 @@
...
@@ -75,37 +78,37 @@
}
}
.oii-status.fulfilled
{
.oii-status.fulfilled
{
color
:
green
;
color
:
#4daa57
;
}
}
.oii-status.cancelled
{
.oii-status.cancelled
{
color
:
red
;
color
:
#c1292e
;
}
}
.fulfill-btn
{
.fulfill-btn
{
position
:
relative
;
position
:
relative
;
border
:
1px
solid
green
;
border
:
1px
solid
#4daa57
;
color
:
green
;
color
:
#4daa57
;
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.4
),
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.4
),
0
1px
1px
rgba
(
0
,
0
,
0
,
0.5
);
0
1px
1px
rgba
(
0
,
0
,
0
,
0.5
);
}
}
.fulfill-btn
:hover
{
.fulfill-btn
:hover
{
color
:
white
;
color
:
white
;
background
:
green
;
background
:
#4daa57
;
box-shadow
:
none
;
box-shadow
:
none
;
}
}
.cancel-btn
{
.cancel-btn
{
position
:
relative
;
position
:
relative
;
border
:
1px
solid
red
;
border
:
1px
solid
#c1292e
;
color
:
red
;
color
:
#c1292e
;
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.4
),
box-shadow
:
inset
0
1px
0
rgba
(
255
,
255
,
255
,
0.4
),
0
1px
1px
rgba
(
0
,
0
,
0
,
0.5
);
0
1px
1px
rgba
(
0
,
0
,
0
,
0.5
);
}
}
.cancel-btn
:hover
{
.cancel-btn
:hover
{
color
:
white
;
color
:
white
;
background
:
red
;
background
:
#c1292e
;
}
}
.fulfill-btn
:active
,
.cancel-btn
:active
{
.fulfill-btn
:active
,
.cancel-btn
:active
{
...
@@ -115,7 +118,7 @@
...
@@ -115,7 +118,7 @@
.order-details
{
.order-details
{
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
/* min-height: 0px; */
font-size
:
18px
;
max-height
:
0px
;
max-height
:
0px
;
overflow
:
hidden
;
overflow
:
hidden
;
transition
:
max-height
1s
ease-out
;
transition
:
max-height
1s
ease-out
;
...
@@ -123,15 +126,73 @@
...
@@ -123,15 +126,73 @@
.order-details-container
{
.order-details-container
{
overflow
:
hidden
;
overflow
:
hidden
;
padding
:
0
50px
2
0px
;
padding
:
20px
5
0px
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
overflow
:
scroll
;
}
}
.animate
{
.animate
{
transition
:
max-height
1s
ease
-out
;
transition
:
max-height
0.75s
ease-in
-out
;
max-height
:
2
00px
;
max-height
:
4
00px
;
}
}
.item-detail
~
.item-detail
{
.order-details-header
{
margin-top
:
10px
;
padding
:
4px
0
;
font-size
:
20px
;
font-weight
:
700
;
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
:
275px
;
}
.order-details-dates
>
div
{
display
:
flex
;
justify-content
:
space-between
;
}
.order-detail-table
{
margin
:
15px
;
}
.order-detail-table
thead
{
font-weight
:
700
;
border-bottom
:
1px
solid
black
;
}
.order-detail-table
th
,
.order-detail-table
td
{
padding
:
5px
20px
;
}
.item-sku
,
.item-qty
{
text-align
:
center
;
}
.item-price
{
text-align
:
end
;
}
.order-detail-table
th
~
th
,
.order-detail-table
td
~
td
{
border-left
:
1px
solid
black
;
}
.no-orders
{
padding
:
50px
;
display
:
flex
;
justify-content
:
center
;
font-size
:
28px
;
}
}
\ No newline at end of file
frontend/public/stylesheets/reset.css
View file @
6527d4a3
...
@@ -40,4 +40,7 @@ q:before, q:after {
...
@@ -40,4 +40,7 @@ q:before, q:after {
table
{
table
{
border-collapse
:
collapse
;
border-collapse
:
collapse
;
border-spacing
:
0
;
border-spacing
:
0
;
}
select
:focus
,
input
:focus
{
outline
:
none
;
}
}
\ No newline at end of file
frontend/public/stylesheets/session.css
0 → 100644
View file @
6527d4a3
.login
{
padding
:
50px
;
display
:
flex
;
justify-content
:
center
;
}
\ No newline at end of file
frontend/src/App.jsx
View file @
6527d4a3
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
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
)
{
...
@@ -23,16 +22,35 @@ const App = ({ orders, fetchOrders }) => {
...
@@ -23,16 +22,35 @@ const App = ({ orders, fetchOrders }) => {
return
(
return
(
<
div
className=
"app"
>
<
div
className=
"app"
>
<
Header
/>
<
div
className=
"fs-collapse"
>
<
FilterSearch
setOrdersToShow=
{
setOrdersToShow
}
/>
<
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
,
...
...
frontend/src/Root.jsx
0 → 100644
View file @
6527d4a3
import
{
connect
}
from
"react-redux"
;
import
Header
from
"./components/header/Header"
;
import
App
from
"./App"
import
Login
from
"./components/session/Login"
;
const
Root
=
({
isLoggedIn
})
=>
{
return
(
<
div
>
<
Header
/>
{
isLoggedIn
?
<
App
/>
:
<
Login
/>
}
</
div
>
);
}
const
mapStateToProps
=
(
state
)
=>
({
isLoggedIn
:
state
.
session
.
isAuthenticated
,
});
const
mapDispatchToProps
=
(
dispatch
)
=>
({
});
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
Root
);
\ No newline at end of file
frontend/src/actions/order_actions.js
View file @
6527d4a3
...
@@ -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
frontend/src/actions/session_actions.js
0 → 100644
View file @
6527d4a3
import
*
as
SessionAPIUtil
from
"../util/session_api_util"
;
export
const
LOGIN_USER
=
"LOGIN_USER"
;
export
const
LOGOUT_USER
=
"LOGOUT_USER"
;
const
receiveLogin
=
(
user
)
=>
({
type
:
LOGIN_USER
,
user
,
});
const
receiveLogout
=
()
=>
({
type
:
LOGOUT_USER
,
});
export
const
login
=
(
payload
)
=>
(
dispatch
)
=>
{
SessionAPIUtil
.
createSession
(
payload
).
then
((
res
)
=>
{
const
{
status
,
data
}
=
res
;
if
(
status
<
299
)
{
dispatch
(
receiveLogin
(
data
));
}
});
};
export
const
logout
=
()
=>
(
dispatch
)
=>
{
dispatch
(
receiveLogout
());
};
frontend/src/components/atoms/Image.jsx
0 → 100644
View file @
6527d4a3
const
Image
=
({
src
})
=>
(
<
img
src=
{
src
}
alt=
""
/>
)
export
default
Image
;
\ No newline at end of file
frontend/src/components/atoms/Input.jsx
View file @
6527d4a3
const
Input
=
({
className
,
type
,
placeholder
,
value
,
onChange
,
onKeyPress
})
=>
(
const
Input
=
({
<
input
className
,
type
,
placeholder
,
value
,
onChange
,
onBlur
,
onKeyPress
,
})
=>
(
<
input
type=
{
type
||
"text"
}
type=
{
type
||
"text"
}
className=
{
className
}
className=
{
className
}
placeholder=
{
placeholder
}
placeholder=
{
placeholder
}
value=
{
value
}
value=
{
value
}
onChange=
{
onChange
}
onChange=
{
onChange
}
onBlur=
{
onBlur
}
onKeyPress=
{
onKeyPress
}
onKeyPress=
{
onKeyPress
}
/>
/>
);
);
...
...
frontend/src/components/atoms/Select.jsx
View file @
6527d4a3
const
Select
=
({
defaultVal
,
value
,
onChange
,
options
})
=>
(
const
Select
=
({
className
,
defaultVal
,
value
,
onChange
,
options
})
=>
(
<
select
<
select
className=
{
className
}
value=
{
value
?
value
:
defaultVal
}
value=
{
value
?
value
:
defaultVal
}
onChange=
{
onChange
}
onChange=
{
onChange
}
>
>
...
...
frontend/src/components/filter/Filter.jsx
View file @
6527d4a3
...
@@ -2,7 +2,7 @@ import { useEffect, useState } from "react";
...
@@ -2,7 +2,7 @@ import { useEffect, useState } from "react";
import
{
connect
}
from
"react-redux"
;
import
{
connect
}
from
"react-redux"
;
import
Button
from
"../atoms/Button"
;
import
Button
from
"../atoms/Button"
;
const
Filter
=
({
orders
,
filtersOn
,
setOrdersToShow
})
=>
{
const
Filter
=
({
orders
,
filtersOn
,
set
FiltersOn
,
set
OrdersToShow
})
=>
{
const
[
all
,
setAll
]
=
useState
(
false
);
const
[
all
,
setAll
]
=
useState
(
false
);
const
[
received
,
setReceived
]
=
useState
(
false
);
const
[
received
,
setReceived
]
=
useState
(
false
);
const
[
fulfilled
,
setFulfilled
]
=
useState
(
false
);
const
[
fulfilled
,
setFulfilled
]
=
useState
(
false
);
...
@@ -14,12 +14,14 @@ const Filter = ({ orders, filtersOn, setOrdersToShow }) => {
...
@@ -14,12 +14,14 @@ const Filter = ({ orders, filtersOn, setOrdersToShow }) => {
const
reset
=
()
=>
{
const
reset
=
()
=>
{
setAll
(
true
);
setAll
(
true
);
setFiltersOn
(
true
);
setReceived
(
false
);
setReceived
(
false
);
setFulfilled
(
false
);
setFulfilled
(
false
);
setCancelled
(
false
);
setCancelled
(
false
);
};
};
const
receive
=
()
=>
{
const
receive
=
()
=>
{
setAll
(
false
);
setAll
(
false
);
setFiltersOn
(
true
);
setReceived
(
!
received
);
setReceived
(
!
received
);
if
(
received
&&
!
fulfilled
&&
!
cancelled
)
{
if
(
received
&&
!
fulfilled
&&
!
cancelled
)
{
setAll
(
true
);
setAll
(
true
);
...
@@ -27,6 +29,7 @@ const Filter = ({ orders, filtersOn, setOrdersToShow }) => {
...
@@ -27,6 +29,7 @@ const Filter = ({ orders, filtersOn, setOrdersToShow }) => {
};
};
const
fulfill
=
()
=>
{
const
fulfill
=
()
=>
{
setAll
(
false
);
setAll
(
false
);
setFiltersOn
(
true
);
setFulfilled
(
!
fulfilled
);
setFulfilled
(
!
fulfilled
);
if
(
!
received
&&
fulfilled
&&
!
cancelled
)
{
if
(
!
received
&&
fulfilled
&&
!
cancelled
)
{
setAll
(
true
);
setAll
(
true
);
...
@@ -34,6 +37,7 @@ const Filter = ({ orders, filtersOn, setOrdersToShow }) => {
...
@@ -34,6 +37,7 @@ const Filter = ({ orders, filtersOn, setOrdersToShow }) => {
};
};
const
cancel
=
()
=>
{
const
cancel
=
()
=>
{
setAll
(
false
);
setAll
(
false
);
setFiltersOn
(
true
);
setCancelled
(
!
cancelled
);
setCancelled
(
!
cancelled
);
if
(
!
received
&&
!
fulfilled
&&
cancelled
)
{
if
(
!
received
&&
!
fulfilled
&&
cancelled
)
{
setAll
(
true
);
setAll
(
true
);
...
...
frontend/src/components/filter/FilterSearch.jsx
View file @
6527d4a3
import
{
use
Effect
,
use
State
}
from
"react"
;
import
{
useState
}
from
"react"
;
import
Filter
from
"./Filter"
;
import
Filter
from
"./Filter"
;
import
Search
from
"./Search"
;
import
Search
from
"./Search"
;
const
FilterSearch
=
({
orders
,
setOrdersToShow
})
=>
{
const
FilterSearch
=
({
setOrdersToShow
})
=>
{
const
[
filtersOn
,
setFiltersOn
]
=
useState
(
true
);
const
[
filtersOn
,
setFiltersOn
]
=
useState
(
true
);
return
(
return
(
<
div
className=
"filter-search"
>
<
div
className=
"filter-search"
>
<
Filter
filtersOn=
{
filtersOn
}
setOrdersToShow=
{
setOrdersToShow
}
/>
<
Filter
<
Search
setOrdersToShow=
{
setOrdersToShow
}
setFiltersOn=
{
setFiltersOn
}
/>
filtersOn=
{
filtersOn
}
setFiltersOn=
{
setFiltersOn
}
setOrdersToShow=
{
setOrdersToShow
}
/>
<
Search
setOrdersToShow=
{
setOrdersToShow
}
setFiltersOn=
{
setFiltersOn
}
/>
</
div
>
</
div
>
);
);
};
};
...
...
frontend/src/components/filter/Search.jsx
View file @
6527d4a3
...
@@ -3,20 +3,25 @@ import { connect } from "react-redux";
...
@@ -3,20 +3,25 @@ import { connect } from "react-redux";
import
Select
from
"../atoms/Select"
;
import
Select
from
"../atoms/Select"
;
import
Input
from
"../atoms/Input"
;
import
Input
from
"../atoms/Input"
;
import
Button
from
"../atoms/Button"
;
import
Button
from
"../atoms/Button"
;
import
Error
from
"../atoms/Error"
;
const
Search
=
({
orders
,
setOrdersToShow
,
setFiltersOn
})
=>
{
const
Search
=
({
orders
,
setOrdersToShow
,
setFiltersOn
})
=>
{
const
[
searchInput
,
setSearchInput
]
=
useState
(
""
);
const
[
searchInput
,
setSearchInput
]
=
useState
(
""
);
const
[
searchBy
,
setSearchBy
]
=
useState
(
""
);
const
[
searchBy
,
setSearchBy
]
=
useState
(
""
);
const
[
error
,
setError
]
=
useState
(
""
);
const
[
inputError
,
setInputError
]
=
useState
(
false
);
const
[
byError
,
setByError
]
=
useState
(
false
);
const
searchOptions
=
[
"
by Warehouse ID"
,
"by
Order ID"
];
const
searchOptions
=
[
"
Warehouse ID"
,
"
Order ID"
];
const
search
=
()
=>
{
const
search
=
()
=>
{
if
(
!
searchInput
.
length
)
{
setInputError
(
false
);
setError
(
"Please enter a search parameter."
);
setByError
(
false
);
if
(
!
searchInput
.
length
&&
!
searchBy
.
length
)
{
setInputError
(
true
);
setByError
(
true
);
}
else
if
(
!
searchInput
.
length
)
{
setInputError
(
true
);
}
else
if
(
!
searchBy
.
length
)
{
}
else
if
(
!
searchBy
.
length
)
{
set
Error
(
"Please enter search method."
);
set
ByError
(
true
);
}
else
{
}
else
{
const
searchResult
=
{
allIds
:
[],
byId
:
{}
};
const
searchResult
=
{
allIds
:
[],
byId
:
{}
};
const
searchedOrder
=
const
searchedOrder
=
...
@@ -33,10 +38,15 @@ const Search = ({ orders, setOrdersToShow, setFiltersOn }) => {
...
@@ -33,10 +38,15 @@ const Search = ({ orders, setOrdersToShow, setFiltersOn }) => {
if
(
searchBy
.
length
)
{
if
(
searchBy
.
length
)
{
setOrdersToShow
(
searchResult
);
setOrdersToShow
(
searchResult
);
}
}
setError
(
""
);
setSearchInput
(
""
);
setSearchInput
(
""
);
setFiltersOn
(
false
);
setFiltersOn
(
false
);
}
}
};
const
handleInputBlur
=
(
e
)
=>
{
if
(
!
e
.
target
.
value
.
length
)
{
setInputError
(
true
);
}
};
};
const
handleSearchEnter
=
(
e
)
=>
{
const
handleSearchEnter
=
(
e
)
=>
{
...
@@ -47,23 +57,29 @@ const Search = ({ orders, setOrdersToShow, setFiltersOn }) => {
...
@@ -47,23 +57,29 @@ const Search = ({ orders, setOrdersToShow, setFiltersOn }) => {
return
(
return
(
<
div
className=
"search"
>
<
div
className=
"search"
>
<
div
className=
"text"
>
Search
</
div
>
<
div
className=
"text"
>
Search
:
</
div
>
<
Select
<
Select
defaultVal=
{
"By:"
}
className=
{
byError
?
"search-select-error"
:
""
}
defaultVal=
{
"Choose one.."
}
value=
{
searchBy
}
value=
{
searchBy
}
options=
{
searchOptions
}
options=
{
searchOptions
}
onChange=
{
(
e
)
=>
{
onChange=
{
(
e
)
=>
{
setByError
(
false
);
setSearchBy
(
e
.
target
.
selectedOptions
[
0
].
value
);
setSearchBy
(
e
.
target
.
selectedOptions
[
0
].
value
);
}
}
}
}
/>
/>
<
Input
<
Input
className=
{
inputError
?
"search-input-error"
:
""
}
placeholder=
{
"Search by ID"
}
placeholder=
{
"Search by ID"
}
value=
{
searchInput
}
value=
{
searchInput
}
onChange=
{
(
e
)
=>
setSearchInput
(
e
.
target
.
value
)
}
onChange=
{
(
e
)
=>
{
setInputError
(
false
);
setSearchInput
(
e
.
target
.
value
);
}
}
onBlur=
{
handleInputBlur
}
onKeyPress=
{
handleSearchEnter
}
onKeyPress=
{
handleSearchEnter
}
/>
/>
<
Button
className=
"search-btn"
text=
"Search"
onClick=
{
search
}
/>
<
Button
className=
"search-btn"
text=
"Search"
onClick=
{
search
}
/>
{
error
.
length
?
<
Error
text=
{
error
}
/>
:
null
}
</
div
>
</
div
>
);
);
};
};
...
@@ -72,7 +88,6 @@ const mapStateToProps = (state) => ({
...
@@ -72,7 +88,6 @@ const mapStateToProps = (state) => ({
orders
:
state
.
entities
.
orders
,
orders
:
state
.
entities
.
orders
,
});
});
const
mapDispatchToProps
=
(
dispatch
)
=>
({
const
mapDispatchToProps
=
(
dispatch
)
=>
({});
});
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
Search
);
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
Search
);
frontend/src/components/header/Header.jsx
View file @
6527d4a3
import
React
from
'react'
;
import
{
connect
}
from
"react-redux"
;
import
Login
from
"../session/Login
"
;
import
Image
from
"../atoms/Image
"
;
import
Logout
from
"../session/Logout"
;
import
Logout
from
"../session/Logout"
;
const
Header
=
()
=>
{
const
Header
=
(
{
isLoggedIn
,
logout
}
)
=>
{
return
(
return
(
<
div
className=
"header"
>
<
div
className=
"header"
>
Warehouse Management
<
div
>
<
Login
/>
<
Image
src=
"https://www.flaticon.com/svg/vstatic/svg/2562/2562296.svg?token=exp=1620448865~hmac=b6bb0b0a072e16f423c481f7a3175fa9"
/>
<
Logout
/>
<
div
>
Warehouse Management
</
div
>
</
div
>
{
isLoggedIn
?
<
Logout
onClick=
{
logout
}
/>
:
null
}
</
div
>
</
div
>
);
);
}
}
;
export
default
Header
;
const
mapStateToProps
=
(
state
)
=>
({
\ No newline at end of file
isLoggedIn
:
state
.
session
.
isAuthenticated
,
});
const
mapDispatchToProps
=
(
dispatch
)
=>
({});
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
Header
);
frontend/src/components/order/ItemDetails.jsx
View file @
6527d4a3
const
ItemDetails
=
({
item
})
=>
{
const
ItemDetails
=
({
item
})
=>
{
const
{
itemName
,
itemQuantity
,
itemPrice
,
itemSku
}
=
item
;
const
{
itemId
,
itemName
,
itemQuantity
,
itemPrice
,
itemSku
}
=
item
;
return
(
return
(
<
li
className=
"item-detail"
>
<
tr
className=
"item-detail"
>
{
`${itemName} -- x ${itemQuantity} bought at ${itemPrice}/ea.`
}
<
td
className=
"item-sku"
>
{
itemSku
}
</
td
>
</
li
>
<
td
className=
"item-name"
>
{
itemName
}
</
td
>
)
<
td
className=
"item-qty"
>
{
itemQuantity
}
</
td
>
}
<
td
className=
"item-price"
>
{
`$${itemPrice.toFixed(2)}`
}
</
td
>
</
tr
>
);
};
export
default
ItemDetails
;
export
default
ItemDetails
;
\ No newline at end of file
frontend/src/components/order/NoOrders.jsx
View file @
6527d4a3
const
NoOrders
=
()
=>
(
const
NoOrders
=
()
=>
(
<
div
>
<
div
className=
"no-orders"
>
No Orders To Show
Hmm, it doesn't seem like there were any orders found...
</
div
>
</
div
>
)
)
export
default
NoOrders
;
export
default
NoOrders
;
\ No newline at end of file
frontend/src/components/order/OrderDetails.jsx
View file @
6527d4a3
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
hour
=
date
.
getHours
();
const
cHour
=
hour
>
12
?
hour
-
12
:
hour
;
const
minute
=
date
.
getMinutes
();
const
time
=
`
${
cHour
>
9
?
cHour
:
`0
${
cHour
}
`
}
:
${
minute
>
9
?
minute
:
`0
${
minute
}
`
}
`
;
return
`
${
month
}
${
day
>
9
?
day
:
`0
${
day
}
`
}
,
${
year
}
at
${
time
}
${
hour
>
11
?
"PM"
:
"AM"
}
`
;
};
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
>
<
div
className=
"order-details-header"
>
{
`Order Details - Warehouse Order #: ${order.id}`
}
<
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
>
</
div
>
<
ul
>
<
table
className=
"order-detail-table"
>
{
order
.
orderItems
.
map
(
item
=>
(
<
thead
>
<
ItemDetails
key=
{
item
.
itemId
}
item=
{
item
}
/>
<
tr
>
))
}
<
th
>
SKU #
</
th
>
</
ul
>
<
th
>
Name
</
th
>
<
th
>
Quantity
</
th
>
<
th
>
Price
</
th
>
</
tr
>
</
thead
>
<
tbody
>
{
order
.
orderItems
.
map
((
item
)
=>
(
<
ItemDetails
key=
{
item
.
itemId
}
item=
{
item
}
/>
))
}
</
tbody
>
</
table
>
{
`Warehouse Order #: ${order.id}`
}
</
div
>
</
div
>
</
div
>
</
div
>
)
)
;
}
}
;
export
default
OrderDetails
;
export
default
OrderDetails
;
\ No newline at end of file
frontend/src/components/order/OrderIndex.jsx
View file @
6527d4a3
...
@@ -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
s
</
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
>
);
);
...
...
frontend/src/components/order/OrderIndexItem.jsx
View file @
6527d4a3
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
,
setCollapseAll
,
setExpandAll
]);
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
;
frontend/src/components/session/Login.jsx
View file @
6527d4a3
import
React
from
'react'
;
import
React
from
"react"
;
import
{
connect
}
from
"react-redux"
;
import
{
GoogleLogin
}
from
"react-google-login"
;
import
{
GoogleLogin
}
from
"react-google-login"
;
import
keys
from
"../../config/keys_dev"
import
keys
from
"../../config/keys_dev"
;
import
{
login
}
from
"../../actions/session_actions"
;
const
clientId
=
keys
.
clientId
;
const
clientId
=
keys
.
clientId
;
const
Login
=
()
=>
{
const
Login
=
(
{
login
}
)
=>
{
const
responseGoogle
=
(
googleResponse
)
=>
{
const
responseGoogle
=
(
response
)
=>
{
const
{
tokenId
,
profileObj
}
=
googleResponse
;
console
.
log
(
response
);
login
({
token
:
tokenId
,
user
:
profileObj
}
);
};
};
return
(
return
(
<
div
>
<
div
className=
"login"
>
<
GoogleLogin
<
GoogleLogin
clientId=
{
clientId
}
clientId=
{
clientId
}
buttonText=
"Login with Google"
buttonText=
"Login with Google"
onSuccess=
{
responseGoogle
}
onSuccess=
{
responseGoogle
}
onFailure=
{
responseGoogle
}
onFailure=
{
responseGoogle
}
cookiePolicy=
{
"single_host_origin"
}
cookiePolicy=
{
"single_host_origin"
}
//
isSignedIn={true}
isSignedIn=
{
true
}
/>
/>
</
div
>
</
div
>
);
);
}
};
const
mapStateToProps
=
(
state
)
=>
({});
const
mapDispatchToProps
=
(
dispatch
)
=>
({
login
:
(
token
)
=>
dispatch
(
login
(
token
)),
});
export
default
Login
;
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
Login
);
\ No newline at end of file
frontend/src/components/session/Logout.jsx
View file @
6527d4a3
import
React
from
"react
"
;
import
{
connect
}
from
"react-redux
"
;
import
{
GoogleLogout
}
from
"react-google-login"
;
import
{
GoogleLogout
}
from
"react-google-login"
;
import
{
logout
}
from
"../../actions/session_actions"
;
import
keys
from
"../../config/keys_dev"
;
import
keys
from
"../../config/keys_dev"
;
const
clientId
=
keys
.
clientId
;
const
clientId
=
keys
.
clientId
;
const
Logout
=
()
=>
{
const
Logout
=
({
logout
})
=>
{
const
responseGoogle
=
(
googleResponse
)
=>
{
const
responseGoogle
=
(
response
)
=>
{
logout
();
console
.
log
(
response
);
};
};
return
(
return
(
<
div
>
<
div
>
<
GoogleLogout
<
GoogleLogout
clientId=
{
clientId
}
clientId=
{
clientId
}
buttonText=
"Logout"
buttonText=
"Logout"
onLogoutSuccess=
{
responseGoogle
}
onLogoutSuccess=
{
responseGoogle
}
isSignedIn=
{
true
}
/>
/>
</
div
>
</
div
>
);
);
};
};
export
default
Logout
;
const
mapStateToProps
=
(
state
)
=>
({});
const
mapDispatchToProps
=
(
dispatch
)
=>
({
logout
:
()
=>
dispatch
(
logout
()),
});
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
Logout
);
frontend/src/index.jsx
View file @
6527d4a3
import
React
from
'react'
;
import
React
from
'react'
;
import
ReactDOM
from
'react-dom'
;
import
ReactDOM
from
'react-dom'
;
import
App
from
'./App'
;
import
reportWebVitals
from
'./reportWebVitals'
;
import
reportWebVitals
from
'./reportWebVitals'
;
import
configureStore
from
'./store/store'
;
import
configureStore
from
'./store/store'
;
import
{
Provider
}
from
'react-redux'
;
import
{
Provider
}
from
'react-redux'
;
import
Root
from
'./Root'
;
document
.
addEventListener
(
'DOMContentLoaded'
,
()
=>
{
document
.
addEventListener
(
'DOMContentLoaded'
,
()
=>
{
...
@@ -11,7 +11,7 @@ document.addEventListener('DOMContentLoaded', () => {
...
@@ -11,7 +11,7 @@ document.addEventListener('DOMContentLoaded', () => {
ReactDOM
.
render
(
ReactDOM
.
render
(
<
Provider
store=
{
store
}
>
<
Provider
store=
{
store
}
>
<
App
/>
<
Root
/>
</
Provider
>,
</
Provider
>,
document
.
getElementById
(
'root'
)
document
.
getElementById
(
'root'
)
);
);
...
...
frontend/src/reducers/root_reducer.js
View file @
6527d4a3
import
{
combineReducers
}
from
"redux"
;
import
{
combineReducers
}
from
"redux"
;
import
entities
from
"./entities/entities_reducer"
;
import
entities
from
"./entities/entities_reducer"
;
import
session
from
"./session/session_reducer"
;
const
RootReducer
=
combineReducers
({
const
RootReducer
=
combineReducers
({
entities
,
entities
,
session
,
});
});
export
default
RootReducer
;
export
default
RootReducer
;
frontend/src/reducers/session/session_reducer.js
0 → 100644
View file @
6527d4a3
import
{
LOGIN_USER
,
LOGOUT_USER
}
from
"../../actions/session_actions"
;
const
initialState
=
{
isAuthenticated
:
false
,
user
:
null
}
const
SessionState
=
(
oldState
=
initialState
,
action
)
=>
{
Object
.
freeze
(
oldState
);
switch
(
action
.
type
)
{
case
LOGIN_USER
:
return
{
isAuthenticated
:
!!
action
.
user
,
user
:
action
.
user
,
}
case
LOGOUT_USER
:
return
initialState
;
default
:
return
oldState
;
}
}
export
default
SessionState
;
\ No newline at end of file
frontend/src/util/orders_api_util.jsx
View file @
6527d4a3
...
@@ -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
)
}
}
frontend/src/util/session_api_util.jsx
0 → 100644
View file @
6527d4a3
import
axios
from
"axios"
;
export
const
createSession
=
(
payload
)
=>
{
return
axios
.
post
(
"http://localhost:8080/api/auth"
,
payload
)
.
catch
((
err
)
=>
err
.
response
);
};
src/main/java/com/ascendfinalproject/warehouse/controllers/
Authenticat
ionController.java
→
src/main/java/com/ascendfinalproject/warehouse/controllers/
Sess
ionController.java
View file @
6527d4a3
...
@@ -7,8 +7,8 @@ import org.springframework.http.ResponseEntity;
...
@@ -7,8 +7,8 @@ import org.springframework.http.ResponseEntity;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
@RestController
@RestController
@RequestMapping
(
value
=
""
)
@RequestMapping
(
value
=
"
/api
"
)
public
class
Authenticat
ionController
{
public
class
Sess
ionController
{
@Autowired
@Autowired
SessionService
sessionService
;
SessionService
sessionService
;
...
...
src/main/java/com/ascendfinalproject/warehouse/controllers/WarehouseController.java
View file @
6527d4a3
...
@@ -7,6 +7,7 @@ import com.ascendfinalproject.warehouse.services.SessionService;
...
@@ -7,6 +7,7 @@ import com.ascendfinalproject.warehouse.services.SessionService;
import
com.ascendfinalproject.warehouse.services.WarehouseOrderService
;
import
com.ascendfinalproject.warehouse.services.WarehouseOrderService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.http.MediaType
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
import
reactor.core.publisher.Mono
;
...
...
src/main/java/com/ascendfinalproject/warehouse/models/Item.java
View file @
6527d4a3
...
@@ -12,10 +12,10 @@ public class Item {
...
@@ -12,10 +12,10 @@ public class Item {
private
String
itemId
;
private
String
itemId
;
private
String
itemName
;
private
String
itemName
;
private
int
itemQuantity
;
private
int
itemQuantity
;
private
int
itemPrice
;
private
double
itemPrice
;
private
int
itemSku
;
private
int
itemSku
;
public
Item
(
String
itemId
,
String
itemName
,
int
itemQuantity
,
int
itemPrice
,
int
itemSku
)
{
public
Item
(
String
itemId
,
String
itemName
,
int
itemQuantity
,
double
itemPrice
,
int
itemSku
)
{
this
.
itemId
=
itemId
;
this
.
itemId
=
itemId
;
this
.
itemName
=
itemName
;
this
.
itemName
=
itemName
;
this
.
itemQuantity
=
itemQuantity
;
this
.
itemQuantity
=
itemQuantity
;
...
...
src/main/java/com/ascendfinalproject/warehouse/models/OrderResponse.java
View file @
6527d4a3
...
@@ -3,20 +3,26 @@ package com.ascendfinalproject.warehouse.models;
...
@@ -3,20 +3,26 @@ package com.ascendfinalproject.warehouse.models;
import
lombok.Getter
;
import
lombok.Getter
;
import
lombok.Setter
;
import
lombok.Setter
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
@Getter
@Getter
@Setter
@Setter
public
class
OrderResponse
{
public
class
OrderResponse
{
private
List
<
String
>
allIds
;
private
List
<
String
>
allIds
=
new
ArrayList
<>()
;
private
HashMap
<
String
,
WarehouseOrder
>
byId
;
private
Map
<
String
,
WarehouseOrder
>
byId
=
new
HashMap
<>()
;
public
void
appendId
(
String
id
)
{
public
void
appendId
(
String
id
)
{
allIds
.
add
(
id
);
allIds
.
add
(
id
);
}
}
public
void
addOrder
(
WarehouseOrder
order
)
{
byId
.
put
(
order
.
getId
(),
order
);
}
@Override
@Override
public
String
toString
()
{
public
String
toString
()
{
return
"OrderResponse{"
+
return
"OrderResponse{"
+
...
...
src/main/java/com/ascendfinalproject/warehouse/services/SessionService.java
View file @
6527d4a3
...
@@ -7,6 +7,7 @@ import org.springframework.stereotype.Service;
...
@@ -7,6 +7,7 @@ import org.springframework.stereotype.Service;
import
java.net.HttpURLConnection
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.net.URL
;
import
java.util.Scanner
;
@Service
@Service
public
class
SessionService
{
public
class
SessionService
{
...
@@ -29,8 +30,8 @@ public class SessionService {
...
@@ -29,8 +30,8 @@ public class SessionService {
.
body
(
session
);
.
body
(
session
);
}
}
return
ResponseEntity
return
ResponseEntity
.
status
(
HttpStatus
.
BAD_REQUEST
)
.
status
(
HttpStatus
.
UNAUTHORIZED
)
.
body
(
null
);
.
body
(
session
);
}
}
...
...
src/main/java/com/ascendfinalproject/warehouse/services/WarehouseOrderService.java
View file @
6527d4a3
package
com
.
ascendfinalproject
.
warehouse
.
services
;
package
com
.
ascendfinalproject
.
warehouse
.
services
;
import
com.ascendfinalproject.warehouse.models.Item
;
import
com.ascendfinalproject.warehouse.models.Item
;
import
com.ascendfinalproject.warehouse.models.OrderResponse
;
import
com.ascendfinalproject.warehouse.models.WarehouseOrder
;
import
com.ascendfinalproject.warehouse.models.WarehouseOrder
;
import
com.ascendfinalproject.warehouse.repositories.WarehouseOrderRepository
;
import
com.ascendfinalproject.warehouse.repositories.WarehouseOrderRepository
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.Mono
;
import
reactor.core.publisher.Mono
;
...
@@ -24,13 +26,12 @@ public class WarehouseOrderService {
...
@@ -24,13 +26,12 @@ public class WarehouseOrderService {
}
}
public
Flux
<
WarehouseOrder
>
getOrders
()
{
public
Flux
<
WarehouseOrder
>
getOrders
()
{
return
orderRepository
.
findAll
();
return
orderRepository
.
findAll
();
}
}
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
()));
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
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment