Skip to content

Commit 24b46b1

Browse files
author
WebDeveloperGuide
committed
Products > Sort By Name/Price applied
1 parent 01838c2 commit 24b46b1

File tree

4 files changed

+44
-13
lines changed

4 files changed

+44
-13
lines changed

web_admin/src/components/pages/product/Products.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {useEffect} from 'react';
1+
import {useEffect, useState} from 'react';
22
import {Link} from 'react-router-dom';
33
import Product from './Product';
44
import Header from '../../Header';
@@ -11,21 +11,29 @@ import './product.css';
1111

1212
const Products = () => {
1313
const dispatch = useDispatch();
14+
const [currentPage, setCurrentPage] = useState(0);
1415

1516
const productList = useSelector((state) => state.productList);
16-
const { loading, error, products, numOfPages } = productList;
17+
const { loading, error, products, numOfPages, sortBy, searchText } = productList;
1718

1819
let pageNum = 0;
1920
let productsPerPage = 10;
2021
const handlePageClick = (data) => {
21-
pageNum = data.selected;
22-
dispatch(listProducts(pageNum,productsPerPage));
22+
pageNum = data.selected;
23+
setCurrentPage(pageNum);
24+
dispatch(listProducts(pageNum,productsPerPage, sortBy, searchText));
2325
}
2426

2527
useEffect(() => {
26-
dispatch(listProducts(pageNum,productsPerPage));
28+
dispatch(listProducts(pageNum,productsPerPage, sortBy, searchText));
2729
}, [productsPerPage]);
2830

31+
const handleSortBy = (e) => {
32+
const sortByValue = e.target.value;
33+
setCurrentPage(0);
34+
dispatch(listProducts(pageNum,productsPerPage, sortByValue, searchText));
35+
}
36+
2937
return(
3038
<>
3139
<div className="container-scroller">
@@ -42,6 +50,13 @@ const Products = () => {
4250
<Link to="/product/add" className="btn btn-outline-primary btn-fw float-right">
4351
Add Product
4452
</Link>
53+
<div className="float-right mr-5">
54+
<select className="form-select" aria-label="Sort By" onChange={handleSortBy}>
55+
<option value="">Sort By</option>
56+
<option value="name">Name</option>
57+
<option value="price">Price</option>
58+
</select>
59+
</div>
4560
<p className="card-description">
4661
</p>
4762
<div className="table-responsive">
@@ -81,6 +96,7 @@ const Products = () => {
8196
breakClassName={"page-item"}
8297
breakLinkClassName={"page-link"}
8398
activeClassName={"active"}
99+
forcePage={currentPage}
84100
/>
85101
</div>
86102
</div>

web_admin/src/redux/actions/ProductActions.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,15 @@ import { logout } from "./userActions";
2020
import { toast } from "react-toastify";
2121
import {ToastObjects} from "./toastObject";
2222

23-
export const listProducts = (pageNum,productsPerPage) => async (dispatch, getState) => {
23+
export const listProducts = (pageNum,productsPerPage,sortBy,searchText) => async (dispatch, getState) => {
2424
try {
2525
dispatch({ type: PRODUCT_LIST_REQUEST });
2626

27-
const responseData = await axios.get(`/products?page=${pageNum}&limit=${productsPerPage}`);
28-
const data = responseData.data;
27+
const responseData = await axios.get(`/products?page=${pageNum}&limit=${productsPerPage}&sortBy=${sortBy}&searchText=${searchText}`);
28+
const data = responseData.data;
29+
data['sortBy'] = sortBy;
30+
data['searchText'] = searchText;
31+
2932
dispatch({ type: PRODUCT_LIST_SUCCESS, payload: data });
3033
} catch (error) {
3134
const message =

web_admin/src/redux/reducers/ProductReducers.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ import {
1919
} from "../constants/ProductConstants";
2020

2121
// All Products
22-
export const productListReducer = (state = { products: [], numOfPages:0 }, action) => {
22+
export const productListReducer = (state = { products: [], numOfPages:0, sortBy: '', searchText:'' }, action) => {
2323
switch (action.type) {
2424
case PRODUCT_LIST_REQUEST:
2525
return { loading: true, products: [] };
2626
case PRODUCT_LIST_SUCCESS:
27-
return { loading: false, products: action.payload.data, numOfPages: action.payload.numOfPages };
27+
return { loading: false, products: action.payload.data, numOfPages: action.payload.numOfPages, sortBy: action.payload.sortBy, searchText: action.payload.searchText };
2828
case PRODUCT_LIST_FAIL:
29-
return { loading: false, error: action.payload.data, numOfPages: action.payload.numOfPages };
29+
return { loading: false, error: action.payload.data, numOfPages: action.payload.numOfPages, sortBy: action.payload.sortBy, searchText: action.payload.searchText };
3030
default:
3131
return state;
3232
}

web_services/routes/product.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,21 @@ router.get("/", async (req,res)=>{
4242

4343
const itemPerPage = parseInt(req.query.limit || "10"); //Products per page
4444
const pageNum = parseInt(req.query.page || "0"); //Products page number
45+
const sortByVal = (req.query.sortBy || "_id"); //Products page number
46+
47+
var sortObject = {};
48+
sortByField = sortByVal;
49+
if(sortByVal == 'name'){
50+
sortByField = 'title';
51+
}
4552

46-
const totalProducts = await Product.countDocuments({});
47-
const productData = await Product.find({}).limit(itemPerPage).skip(itemPerPage * pageNum);
53+
sortObject[sortByField] = 1;
54+
55+
56+
const totalProducts = await Product.countDocuments({});
57+
const productData = await Product.find({}).sort(sortObject).limit(itemPerPage).skip(itemPerPage * pageNum);
58+
59+
4860

4961
let numOfPages = parseInt(totalProducts/itemPerPage);
5062

0 commit comments

Comments
 (0)