From c825c6630f1f4d7f858db9941ef4b78b32f8960b Mon Sep 17 00:00:00 2001 From: YoussefSaadGIU Date: Thu, 2 Jun 2022 20:48:06 +0200 Subject: [PATCH 01/16] changed ProductsSearch --- server/controller/products/Products.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/controller/products/Products.js b/server/controller/products/Products.js index 4603fcb..a9466f7 100644 --- a/server/controller/products/Products.js +++ b/server/controller/products/Products.js @@ -5,11 +5,13 @@ import CSVtoJSON from "../../utils/CSVtoJSON.js"; export const productsSearch = async (req, res) => { try { + const products = await Products.find({"name": {$regex: req.query.search, $options: "i"}}); const productsPaged = Pagination(req.query.page, products); - res.status(200).json(productsPaged); + const numberOfPages = Math.ceil(products.length / 2); + res.status(200).json({total_pages: numberOfPages, products:productsPaged}); } catch (error) { res.status(404).json({message: error.message}); @@ -43,7 +45,7 @@ export const ShowProductsPerPage = async (req, res) => { const ShowProductsPerCategory = async (category, products) => { try { - products = await Products.find({"category": {$eq: category}}); + products = await Products.find({"category": {$regex: category, $options: "i"}}); return products; } catch (error) { From 801774927098b65b9798a5c8b765bc911b14c91c Mon Sep 17 00:00:00 2001 From: YoussefSaadGIU Date: Thu, 2 Jun 2022 20:48:31 +0200 Subject: [PATCH 02/16] Implemented Products frontend --- client/src/pages/products/Products.js | 79 +++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 client/src/pages/products/Products.js diff --git a/client/src/pages/products/Products.js b/client/src/pages/products/Products.js new file mode 100644 index 0000000..74c8d81 --- /dev/null +++ b/client/src/pages/products/Products.js @@ -0,0 +1,79 @@ +import { useState, useEffect } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import { useDispatch } from "react-redux"; +import { getProductsPerPage, productsSearch } from "../../actions/products"; +import ProductCard from "../../components/product-card/ProductCard"; +import Pages from "../../components/pages/Pages"; +import ProductCategories from "../../components/products-categories/Categories"; + +const Products = () => { + const [page, setPage] = useState(1); + const [products, setProducts] = useState([]); + const [totalPages, setTotalPages] = useState(1); + + const location = useLocation(); + const dispatch = useDispatch(); + const navigate = useNavigate(); + + useEffect(() => { + const query = new URLSearchParams(location.search); + const page = query.get('page') || 1; + setPage(Number(page)); + + if(query.get('search')){ + const search = query.get('search'); + + dispatch(productsSearch(search, page, onSuccess)); + } + else if(query.get('category')){ + const category = query.get('category'); + if(category === 'all'){ + setPage(Number(page)); + + dispatch(getProductsPerPage(page, null ,onSuccess)); + } + else{ + dispatch(getProductsPerPage(page, category, onSuccess)); + } + } + else{ + setPage(Number(page)); + + dispatch(getProductsPerPage(page, null ,onSuccess)); + } + }, [dispatch, location.search]); + + const onSuccess = (res) => { + setTotalPages(res.total_pages); + setProducts(res.products); + } + + const handleClick = (i) => { + const query = new URLSearchParams(location.search); + + if(query.get('search')){ + const search = query.get('search'); + navigate(`/products?search=${search}&page=${i}`); + window.scrollTo(0, 0); + } + else if(query.get('category')){ + const category = query.get('category'); + navigate(`/products?category=${category}&page=${i}`); + window.scrollTo(0, 0); + } + else{ + navigate(`/products?page=${i}`); + window.scrollTo(0, 0); + } + } + + return ( +
+ {} + {products.map(((product, i) => ))} + {} +
+ ); +} + +export default Products; \ No newline at end of file From 96d0a8e51ce6b72f4ad262d4de7ac04bdda7432d Mon Sep 17 00:00:00 2001 From: YoussefSaadGIU Date: Thu, 2 Jun 2022 20:49:14 +0200 Subject: [PATCH 03/16] Added getProductsPerPage and productsSearch api endpoints --- client/src/api/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/src/api/index.js b/client/src/api/index.js index dd5238c..38e4758 100644 --- a/client/src/api/index.js +++ b/client/src/api/index.js @@ -11,6 +11,10 @@ API.interceptors.request.use((req) => { return req; }); +export const getProductsPerPage = (page, category) => API.get(`/products?page=${page}${category && `&category=${category}`}`); +export const productsSearch = (search, page) => API.get(`/products/search?search=${search}&page=${page}`); + + export const getRecommendations = () => API.get('/products/recommendations'); export const postProduct = (product) => API.post(`/products`, product); export const validateCart = (cart) => API.post('/products/cart', {cart}); From a02010efb8259fa3606f8b669bf61c12ffb30a7c Mon Sep 17 00:00:00 2001 From: YoussefSaadGIU Date: Thu, 2 Jun 2022 20:50:13 +0200 Subject: [PATCH 04/16] Added getProductsPerPage and productsSearch actions\ --- client/src/actions/products.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/client/src/actions/products.js b/client/src/actions/products.js index 0dfa0f5..66fd3b9 100644 --- a/client/src/actions/products.js +++ b/client/src/actions/products.js @@ -1,6 +1,24 @@ import * as api from '../api'; import {FETCH_RECOMMENDATIONS, UPDATE_DATABASE, VALIDATE_CART, VALIDATE_CART_ERR} from "../constants/actions/products"; +export const getProductsPerPage = (page, category, onSuccess) => async () => { + try { + const products = await api.getProductsPerPage(page, category).then(res => res.data); + onSuccess(products); + } catch (error) { + console.log(error); + } +} + +export const productsSearch = (search, page, onSuccess) => async () => { + try { + const products = await api.productsSearch(search, page).then(res => res.data); + onSuccess(products); + } catch (error) { + console.log(error); + } +} + export const getRecommendations = (onSuccess) => async (dispatch) => { try { const data = await api.getRecommendations().then(res => res.data); From a51360944d7ad938d60b5d4b5d8e29e5dae7ca56 Mon Sep 17 00:00:00 2001 From: YoussefSaadGIU Date: Thu, 2 Jun 2022 20:50:29 +0200 Subject: [PATCH 05/16] Added products page route --- client/src/App.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/src/App.js b/client/src/App.js index 7a705bd..732dde5 100644 --- a/client/src/App.js +++ b/client/src/App.js @@ -21,6 +21,7 @@ import AdminViewOrder from "./pages/admin/orders/id/AdminViewOrder"; import AdminNewProduct from "./pages/admin/products/new/AdminNewProduct"; import AdminShipping from "./pages/admin/shipment/default/AdminShipping"; import AdminUpdateShipping from "./pages/admin/shipment/update/AdminUpdateShipping"; +import Products from './pages/products/Products'; const cartInitialization = JSON.parse(localStorage.getItem('cart')) || []; @@ -109,6 +110,7 @@ const App = () => { element={}/>}/> }/> }/> + }/>