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
6d230f5d
Commit
6d230f5d
authored
May 06, 2021
by
Darrick Yong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
separate search and filter
parent
15edcb2a
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
326 additions
and
124 deletions
+326
-124
filter.css
frontend/public/stylesheets/filter.css
+74
-5
order.css
frontend/public/stylesheets/order.css
+8
-2
App.jsx
frontend/src/App.jsx
+7
-3
Error.jsx
frontend/src/components/atoms/Error.jsx
+7
-0
Input.jsx
frontend/src/components/atoms/Input.jsx
+12
-0
Select.jsx
frontend/src/components/atoms/Select.jsx
+18
-0
Filter.jsx
frontend/src/components/filter/Filter.jsx
+0
-109
FilterSearch.jsx
frontend/src/components/filter/FilterSearch.jsx
+119
-0
Search.jsx
frontend/src/components/filter/Search.jsx
+69
-0
NoOrders.jsx
frontend/src/components/order/NoOrders.jsx
+6
-0
OrderDetails.jsx
frontend/src/components/order/OrderDetails.jsx
+3
-1
OrderIndex.jsx
frontend/src/components/order/OrderIndex.jsx
+0
-3
OrderIndexItem.jsx
frontend/src/components/order/OrderIndexItem.jsx
+1
-1
orders_reducer.js
frontend/src/reducers/entities/orders_reducer.js
+2
-0
No files found.
frontend/public/stylesheets/filter.css
View file @
6d230f5d
.filter
{
.filter
-search
{
/* width: 50%; */
/* width: 50%; */
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
padding
:
20px
;
padding
:
20px
;
}
}
.filter-search
.text
{
font-size
:
20px
;
font-weight
:
700
;
}
.filter-search
>
*
~
*
{
margin-left
:
100px
;
}
.filter
{
display
:
flex
;
align-items
:
center
;
}
.filter
>
*
~
*
{
margin-left
:
10px
;
}
.filter-btns
{
.filter-btns
{
display
:
flex
;
display
:
flex
;
justify-content
:
space-between
;
justify-content
:
space-between
;
...
@@ -15,27 +33,78 @@
...
@@ -15,27 +33,78 @@
cursor
:
pointer
;
cursor
:
pointer
;
display
:
flex
;
display
:
flex
;
padding
:
10px
20px
;
padding
:
10px
20px
;
margin-left
:
10px
;
border-radius
:
5px
;
border-radius
:
5px
;
border
:
1px
solid
black
;
border
:
1px
solid
black
;
}
}
.filter-btns
>
*
~
*
{
margin-left
:
10px
;
}
.selected
{
.selected
{
color
:
white
;
color
:
white
;
}
}
.filter-all
:hover
{
background
:
orange
;
color
:
white
;
}
.filter-all.selected
{
.filter-all.selected
{
background
:
orange
;
background
:
orange
;
}
}
.filter-rec
:hover
{
background
:
blue
;
color
:
white
;
}
.filter-rec.selected
{
.filter-rec.selected
{
background
:
blue
;
background
:
blue
;
}
}
.filter-ful
:hover
{
background
:
green
;
color
:
white
;
}
.filter-ful.selected
{
.filter-ful.selected
{
background
:
green
;
background
:
green
;
}
}
.filter-can
:hover
{
background
:
red
;
color
:
white
;
}
.filter-can.selected
{
.filter-can.selected
{
background
:
red
;
background
:
red
;
}
}
.search
{
display
:
flex
;
align-items
:
center
;
}
.search
>
*
~
*
{
margin-left
:
10px
;
}
.search
>
select
{
cursor
:
pointer
;
border
:
none
;
font-size
:
16px
;
font-family
:
'Times New Roman'
,
Times
,
serif
;
}
.search
>
input
{
padding
:
10px
;
font-size
:
16px
;
font-family
:
'Times New Roman'
,
Times
,
serif
;
}
.search-btn
{
cursor
:
pointer
;
display
:
flex
;
padding
:
10px
20px
;
border-radius
:
5px
;
border
:
1px
solid
black
;
}
.search-btn
:hover
{
color
:
white
;
background
:
gray
;
}
\ No newline at end of file
frontend/public/stylesheets/order.css
View file @
6d230f5d
.order-index
{
.order-index
{
padding
:
20px
;
padding
:
0
20px
20px
;
}
.order-index
>
h1
{
padding
:
10px
20px
;
margin-bottom
:
2px
;
background
:
blue
;
color
:
white
;
font-size
:
20px
;
}
}
.order-index
.oii
~
.oii
{
.order-index
.oii
~
.oii
{
margin-top
:
15px
;
margin-top
:
15px
;
}
}
...
...
frontend/src/App.jsx
View file @
6d230f5d
...
@@ -2,8 +2,9 @@ import { useEffect, useState } from "react";
...
@@ -2,8 +2,9 @@ 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
{
fetchOrders
}
from
"./actions/order_actions"
;
import
{
fetchOrders
}
from
"./actions/order_actions"
;
import
Filter
from
"./components/filter/Filter
"
;
import
Filter
Search
from
"./components/filter/FilterSearch
"
;
const
App
=
({
orders
,
fetchOrders
})
=>
{
const
App
=
({
orders
,
fetchOrders
})
=>
{
...
@@ -21,8 +22,11 @@ const App = ({ orders, fetchOrders }) => {
...
@@ -21,8 +22,11 @@ const App = ({ orders, fetchOrders }) => {
return
(
return
(
<
div
className=
"app"
>
<
div
className=
"app"
>
<
Header
/>
<
Header
/>
<
Filter
orders=
{
orders
}
setOrdersToShow=
{
setOrdersToShow
}
/>
<
FilterSearch
orders=
{
orders
}
setOrdersToShow=
{
setOrdersToShow
}
/>
<
OrderIndex
orders=
{
ordersToShow
}
/>
{
ordersToShow
.
allIds
.
length
?
<
OrderIndex
orders=
{
ordersToShow
}
/>
:
<
NoOrders
/>
}
</
div
>
</
div
>
);
);
}
}
...
...
frontend/src/components/atoms/Error.jsx
0 → 100644
View file @
6d230f5d
const
Error
=
({
text
})
=>
(
<
div
>
{
text
}
</
div
>
)
export
default
Error
;
\ No newline at end of file
frontend/src/components/atoms/Input.jsx
0 → 100644
View file @
6d230f5d
const
Input
=
({
className
,
type
,
placeholder
,
value
,
onChange
,
onKeyPress
})
=>
(
<
input
type=
{
type
||
"text"
}
className=
{
className
}
placeholder=
{
placeholder
}
value=
{
value
}
onChange=
{
onChange
}
onKeyPress=
{
onKeyPress
}
/>
);
export
default
Input
;
frontend/src/components/atoms/Select.jsx
0 → 100644
View file @
6d230f5d
const
Select
=
({
defaultVal
,
value
,
onChange
,
options
})
=>
(
<
select
value=
{
value
?
value
:
defaultVal
}
onChange=
{
onChange
}
>
{
defaultVal
?
(
<
option
disabled
>
{
defaultVal
}
</
option
>
)
:
null
}
{
options
.
map
(
option
=>
(
<
option
key=
{
option
}
value=
{
option
}
>
{
option
}
</
option
>
))
}
</
select
>
)
export
default
Select
;
\ No newline at end of file
frontend/src/components/filter/Filter.jsx
View file @
6d230f5d
import
{
useEffect
,
useState
}
from
"react"
;
import
Button
from
"../atoms/Button"
;
const
Filter
=
({
orders
,
setOrdersToShow
})
=>
{
const
[
all
,
setAll
]
=
useState
(
true
);
const
[
received
,
setReceived
]
=
useState
(
false
);
const
[
fulfilled
,
setFulfilled
]
=
useState
(
false
);
const
[
cancelled
,
setCancelled
]
=
useState
(
false
);
const
RECEIVED
=
"RECEIVED"
;
const
FULFILLED
=
"FULFILLED"
;
const
CANCELLED
=
"CANCELLED"
;
const
reset
=
()
=>
{
setAll
(
true
);
setReceived
(
false
);
setFulfilled
(
false
);
setCancelled
(
false
);
};
const
receive
=
()
=>
{
setAll
(
false
);
setReceived
(
!
received
);
if
(
received
&&
!
fulfilled
&&
!
cancelled
)
{
setAll
(
true
);
}
};
const
fulfill
=
()
=>
{
setAll
(
false
);
setFulfilled
(
!
fulfilled
);
if
(
!
received
&&
fulfilled
&&
!
cancelled
)
{
setAll
(
true
);
}
};
const
cancel
=
()
=>
{
setAll
(
false
);
setCancelled
(
!
cancelled
);
if
(
!
received
&&
!
fulfilled
&&
cancelled
)
{
setAll
(
true
);
}
};
useEffect
(()
=>
{
if
(
all
)
{
setOrdersToShow
(
orders
);
}
else
{
const
newOrders
=
{
allIds
:
[],
byId
:
{}
};
orders
.
allIds
.
forEach
((
wareId
)
=>
{
const
order
=
orders
.
byId
[
wareId
];
switch
(
order
.
status
)
{
case
RECEIVED
:
if
(
all
||
received
)
{
newOrders
.
allIds
.
push
(
wareId
);
newOrders
.
byId
[
wareId
]
=
order
;
}
break
;
case
FULFILLED
:
if
(
all
||
fulfilled
)
{
newOrders
.
allIds
.
push
(
wareId
);
newOrders
.
byId
[
wareId
]
=
order
;
}
break
;
case
CANCELLED
:
if
(
all
||
cancelled
)
{
newOrders
.
allIds
.
push
(
wareId
);
newOrders
.
byId
[
wareId
]
=
order
;
}
break
;
default
:
break
;
}
});
setOrdersToShow
(
newOrders
);
}
},
[
orders
,
setOrdersToShow
,
all
,
received
,
fulfilled
,
cancelled
]);
if
(
!
orders
.
allIds
.
length
)
return
null
;
return
(
<
div
className=
"filter"
>
<
div
>
Filter:
</
div
>
<
div
className=
"filter-btns"
>
<
Button
className=
{
`filter-all ${all ? "selected" : ""}`
}
onClick=
{
reset
}
text=
"All"
/>
<
Button
className=
{
`filter-rec ${received ? "selected" : ""}`
}
onClick=
{
receive
}
text=
"Received"
/>
<
Button
className=
{
`filter-ful ${fulfilled ? "selected" : ""}`
}
onClick=
{
fulfill
}
text=
"Fulfilled"
/>
<
Button
className=
{
`filter-can ${cancelled ? "selected" : ""}`
}
onClick=
{
cancel
}
text=
"Cancelled"
/>
</
div
>
</
div
>
);
};;
export
default
Filter
;
frontend/src/components/filter/FilterSearch.jsx
0 → 100644
View file @
6d230f5d
import
{
useEffect
,
useState
}
from
"react"
;
import
Button
from
"../atoms/Button"
;
import
Input
from
"../atoms/Input"
;
import
Select
from
"../atoms/Select"
;
import
Search
from
"./Search"
;
const
FilterSearch
=
({
orders
,
setOrdersToShow
})
=>
{
const
[
all
,
setAll
]
=
useState
(
false
);
const
[
received
,
setReceived
]
=
useState
(
false
);
const
[
fulfilled
,
setFulfilled
]
=
useState
(
false
);
const
[
cancelled
,
setCancelled
]
=
useState
(
false
);
const
RECEIVED
=
"RECEIVED"
;
const
FULFILLED
=
"FULFILLED"
;
const
CANCELLED
=
"CANCELLED"
;
const
reset
=
()
=>
{
setAll
(
true
);
setReceived
(
false
);
setFulfilled
(
false
);
setCancelled
(
false
);
};
const
receive
=
()
=>
{
setAll
(
false
);
setReceived
(
!
received
);
if
(
received
&&
!
fulfilled
&&
!
cancelled
)
{
setAll
(
true
);
}
};
const
fulfill
=
()
=>
{
setAll
(
false
);
setFulfilled
(
!
fulfilled
);
if
(
!
received
&&
fulfilled
&&
!
cancelled
)
{
setAll
(
true
);
}
};
const
cancel
=
()
=>
{
setAll
(
false
);
setCancelled
(
!
cancelled
);
if
(
!
received
&&
!
fulfilled
&&
cancelled
)
{
setAll
(
true
);
}
};
useEffect
(()
=>
{
if
(
all
)
{
setOrdersToShow
(
orders
);
}
else
{
const
newOrders
=
{
allIds
:
[],
byId
:
{}
};
orders
.
allIds
.
forEach
((
wareId
)
=>
{
const
order
=
orders
.
byId
[
wareId
];
switch
(
order
.
status
)
{
case
RECEIVED
:
if
(
all
||
received
)
{
newOrders
.
allIds
.
push
(
wareId
);
newOrders
.
byId
[
wareId
]
=
order
;
}
break
;
case
FULFILLED
:
if
(
all
||
fulfilled
)
{
newOrders
.
allIds
.
push
(
wareId
);
newOrders
.
byId
[
wareId
]
=
order
;
}
break
;
case
CANCELLED
:
if
(
all
||
cancelled
)
{
newOrders
.
allIds
.
push
(
wareId
);
newOrders
.
byId
[
wareId
]
=
order
;
}
break
;
default
:
break
;
}
});
setOrdersToShow
(
newOrders
);
}
},
[
orders
,
setOrdersToShow
,
all
,
received
,
fulfilled
,
cancelled
]);
if
(
!
orders
.
allIds
.
length
)
return
null
;
return
(
<
div
className=
"filter-search"
>
<
div
className=
"filter"
>
<
div
className=
"text"
>
Filter:
</
div
>
<
div
className=
"filter-btns"
>
<
Button
className=
{
`filter-all ${all ? "selected" : ""}`
}
onClick=
{
reset
}
text=
"All"
/>
<
Button
className=
{
`filter-rec ${received ? "selected" : ""}`
}
onClick=
{
receive
}
text=
"Received"
/>
<
Button
className=
{
`filter-ful ${fulfilled ? "selected" : ""}`
}
onClick=
{
fulfill
}
text=
"Fulfilled"
/>
<
Button
className=
{
`filter-can ${cancelled ? "selected" : ""}`
}
onClick=
{
cancel
}
text=
"Cancelled"
/>
</
div
>
</
div
>
<
Search
setOrdersToShow=
{
setOrdersToShow
}
/>
</
div
>
);
};;
export
default
FilterSearch
;
frontend/src/components/filter/Search.jsx
0 → 100644
View file @
6d230f5d
import
{
useState
}
from
"react"
;
import
{
connect
}
from
"react-redux"
;
import
Select
from
"../atoms/Select"
;
import
Input
from
"../atoms/Input"
;
import
Button
from
"../atoms/Button"
;
const
Search
=
({
orders
,
setOrdersToShow
})
=>
{
const
[
searchInput
,
setSearchInput
]
=
useState
(
""
);
const
[
searchBy
,
setSearchBy
]
=
useState
(
""
);
const
searchOptions
=
[
"by Warehouse ID"
,
"by Order ID"
];
const
search
=
()
=>
{
const
searchResult
=
{
allIds
:
[],
byId
:
{}
};
const
searchedOrder
=
searchBy
===
searchOptions
[
0
]
?
orders
.
byId
[
searchInput
]
:
searchBy
===
searchOptions
[
1
]
?
orders
.
byOrderId
[
searchInput
]
:
null
;
if
(
searchedOrder
)
{
searchResult
.
allIds
.
push
(
searchedOrder
.
id
);
searchResult
.
byId
[
searchedOrder
.
id
]
=
searchedOrder
;
}
if
(
searchBy
.
length
)
{
setOrdersToShow
(
searchResult
);
}
setSearchInput
(
""
);
};
const
handleSearchEnter
=
(
e
)
=>
{
if
(
e
.
key
===
"Enter"
)
{
search
();
}
};
return
(
<
div
className=
"search"
>
<
div
className=
"text"
>
Search
</
div
>
<
Select
defaultVal=
{
"By:"
}
value=
{
searchBy
}
options=
{
searchOptions
}
onChange=
{
(
e
)
=>
{
setSearchBy
(
e
.
target
.
selectedOptions
[
0
].
value
);
}
}
/>
<
Input
placeholder=
{
"Search by ID"
}
value=
{
searchInput
}
onChange=
{
(
e
)
=>
setSearchInput
(
e
.
target
.
value
)
}
onKeyPress=
{
handleSearchEnter
}
/>
<
Button
className=
"search-btn"
text=
"Search"
onClick=
{
search
}
/>
</
div
>
);
};
const
mapStateToProps
=
(
state
)
=>
({
orders
:
state
.
entities
.
orders
,
});
const
mapDispatchToProps
=
(
dispatch
)
=>
({
// fetchOrders: () => dispatch(fetchOrders()),
});
export
default
connect
(
mapStateToProps
,
mapDispatchToProps
)(
Search
);
frontend/src/components/order/NoOrders.jsx
0 → 100644
View file @
6d230f5d
const
NoOrders
=
()
=>
(
<
div
>
No Orders To Show
</
div
>
)
export
default
NoOrders
;
\ No newline at end of file
frontend/src/components/order/OrderDetails.jsx
View file @
6d230f5d
...
@@ -44,7 +44,9 @@ const OrderDetails = ({ order, showDetails }) => {
...
@@ -44,7 +44,9 @@ const OrderDetails = ({ order, showDetails }) => {
return
(
return
(
<
div
className=
{
`order-details ${showDetails ? "animate" : ""}`
}
>
<
div
className=
{
`order-details ${showDetails ? "animate" : ""}`
}
>
<
div
className=
"order-details-container"
>
<
div
className=
"order-details-container"
>
Order Details
<
div
>
{
`Order Details - Warehouse Order #: ${order.id}`
}
</
div
>
<
ul
>
<
ul
>
{
sampleItems
.
map
(
item
=>
(
{
sampleItems
.
map
(
item
=>
(
<
ItemDetails
key=
{
item
.
itemId
}
item=
{
item
}
/>
<
ItemDetails
key=
{
item
.
itemId
}
item=
{
item
}
/>
...
...
frontend/src/components/order/OrderIndex.jsx
View file @
6d230f5d
...
@@ -6,9 +6,6 @@ const OrderIndex = ({
...
@@ -6,9 +6,6 @@ const OrderIndex = ({
return
(
return
(
<
div
className=
"order-index"
>
<
div
className=
"order-index"
>
<
h1
>
Order Index
</
h1
>
<
h1
>
Order Index
</
h1
>
<
br
/>
{
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
}
/>;
...
...
frontend/src/components/order/OrderIndexItem.jsx
View file @
6d230f5d
...
@@ -26,7 +26,7 @@ const OrderIndexItem = ({ order }) => {
...
@@ -26,7 +26,7 @@ const OrderIndexItem = ({ order }) => {
<
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=
{
()
=>
setShowDetails
(
!
showDetails
)
}
/>
<
div
className=
"oii-num"
>
{
`Order #:${orderId}
--`
}
{
`Warehouse #:${id}`
}
</
div
>
<
div
className=
"oii-num"
>
{
`Order #:${orderId}
`
}
</
div
>
</
div
>
</
div
>
{
actions
}
{
actions
}
</
div
>
</
div
>
...
...
frontend/src/reducers/entities/orders_reducer.js
View file @
6d230f5d
...
@@ -19,10 +19,12 @@ const OrdersReducer = (oldState = initialState, action) => {
...
@@ -19,10 +19,12 @@ const OrdersReducer = (oldState = initialState, action) => {
const
orderState
=
{
const
orderState
=
{
byId
:
{},
byId
:
{},
allIds
:
[],
allIds
:
[],
byOrderId
:
{},
};
};
action
.
orders
.
forEach
(
order
=>
{
action
.
orders
.
forEach
(
order
=>
{
orderState
.
allIds
.
push
(
order
.
id
);
orderState
.
allIds
.
push
(
order
.
id
);
orderState
.
byId
[
order
.
id
]
=
order
;
orderState
.
byId
[
order
.
id
]
=
order
;
orderState
.
byOrderId
[
order
.
orderId
]
=
order
;
})
})
return
orderState
;
return
orderState
;
case
RECEIVE_ORDER
:
case
RECEIVE_ORDER
:
...
...
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