Commit 18577ced authored by Muneeb Saeed's avatar Muneeb Saeed

pagination added

parent ad2494c1
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
'use strict'; 'use strict';
async function main(searchQuery, facets, filters) { async function main(searchQuery, facets, filters, pageSize, pageOffset) {
// Call Retail API to search for a products in a catalog using only search query. // Call Retail API to search for a products in a catalog using only search query.
// Imports the Google Cloud client library. // Imports the Google Cloud client library.
...@@ -38,7 +38,11 @@ async function main(searchQuery, facets, filters) { ...@@ -38,7 +38,11 @@ async function main(searchQuery, facets, filters) {
const visitorId = '12345'; const visitorId = '12345';
// Maximum number of Products to return. // Maximum number of Products to return.
const pageSize = 10; // const pageSize = pageSize;
// A 0-indexed integer that specifies the current offset in search results.
const offset = pageOffset || 0; // TRY DIFFERENT OFFSETS TO SEE DIFFERENT PRODUCTS
const IResponseParams = { const IResponseParams = {
ISearchResult: 0, ISearchResult: 0,
...@@ -55,6 +59,7 @@ async function main(searchQuery, facets, filters) { ...@@ -55,6 +59,7 @@ async function main(searchQuery, facets, filters) {
filter, filter,
visitorId, visitorId,
pageSize, pageSize,
offset,
}; };
// Run request // Run request
......
...@@ -11,7 +11,7 @@ app.use(bodyParser.json()); ...@@ -11,7 +11,7 @@ app.use(bodyParser.json());
const searchService = require('./samples/interactive-tutorials/search/search-simple-query'); const searchService = require('./samples/interactive-tutorials/search/search-simple-query');
app.get('/search', (req, res) => { app.get('/search', (req, res) => {
const { text, facets, filters } = req.query; const { text, facets, filters, pageSize, pageOffset } = req.query;
const facetsObj = facets && JSON.parse(facets).map((facet) => ({ facetKey: { key: facet }})); const facetsObj = facets && JSON.parse(facets).map((facet) => ({ facetKey: { key: facet }}));
const filterObj = filters && JSON.parse(filters) || []; const filterObj = filters && JSON.parse(filters) || [];
...@@ -21,7 +21,7 @@ app.get('/search', (req, res) => { ...@@ -21,7 +21,7 @@ app.get('/search', (req, res) => {
}); });
filterString = filterString && `(${filterString})`; filterString = filterString && `(${filterString})`;
searchService(text, facetsObj, filterString) searchService(text, facetsObj, filterString, pageSize, pageOffset)
.then(result => { .then(result => {
return res.send(result); return res.send(result);
}) })
......
export const CONFIGS = { export const CONFIGS = {
title: 'XYZ Title', title: 'XYZ Title',
client_logo: 'client_logo.png'
} }
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import './search-results.css'; import './search-results.css';
import { Typography, Col, Row, Card, Select, Checkbox, Collapse } from 'antd'; import { Typography, Col, Row, Card, Select, Checkbox, Collapse, Pagination } from 'antd';
import { LinkOutlined, FilterFilled } from '@ant-design/icons'; import { LinkOutlined, FilterFilled } from '@ant-design/icons';
const { Meta } = Card; const { Meta } = Card;
const { Panel } = Collapse; const { Panel } = Collapse;
const SearchResults = ({ searchResults, facets, onSelectFacet, onSelectFilter }) => { const SearchResults = ({
searchResults,
facets,
totalRecords,
pageSize,
onSelectFacet,
onSelectFilter,
onChangePageSize,
onChangePage
}) => {
const availabilityMap = new Map(); const availabilityMap = new Map();
availabilityMap.set('IN_STOCK', 'In Stock'); availabilityMap.set('IN_STOCK', 'In Stock');
...@@ -51,6 +60,14 @@ const SearchResults = ({ searchResults, facets, onSelectFacet, onSelectFilter }) ...@@ -51,6 +60,14 @@ const SearchResults = ({ searchResults, facets, onSelectFacet, onSelectFilter })
} }
}; };
const _onChangePageSize = (current, pageSize) => {
onChangePageSize({ current, pageSize });
};
const _onChangePage = (current, pageSize) => {
onChangePage({ current, pageSize });
};
useEffect(() => { useEffect(() => {
if (filters != null) if (filters != null)
onSelectFilter(filters); onSelectFilter(filters);
...@@ -109,6 +126,14 @@ const SearchResults = ({ searchResults, facets, onSelectFacet, onSelectFilter }) ...@@ -109,6 +126,14 @@ const SearchResults = ({ searchResults, facets, onSelectFacet, onSelectFilter })
) )
} }
</Row> </Row>
<Pagination
pageSize={pageSize}
showSizeChanger
onShowSizeChange={_onChangePageSize}
onChange={_onChangePage}
defaultCurrent={1}
total={totalRecords}
/>
</Col> </Col>
</Row> </Row>
} }
......
...@@ -2,18 +2,20 @@ import React, { useEffect, useState } from 'react'; ...@@ -2,18 +2,20 @@ import React, { useEffect, useState } from 'react';
import SearchResults from './search-results'; import SearchResults from './search-results';
import Loader from './loader'; import Loader from './loader';
import messageService from '../services/MessageService'; import messageService from '../services/MessageService';
import { CONFIGS } from '../client-config'
import { Button, Input, Col, Row } from 'antd'; import { Button, Input, Col, Row } from 'antd';
import { SearchOutlined } from '@ant-design/icons'; import { SearchOutlined } from '@ant-design/icons';
const Search = () => { const Search = () => {
const INITIAL_STATE = { searchQuery: '', facets: [], filters: null }; const INITIAL_STATE = { searchQuery: '', facets: [], filters: null, pageSize: 10, pageOffset: 0 };
const [payload, setPayload] = useState(INITIAL_STATE); const [payload, setPayload] = useState(INITIAL_STATE);
const [searchResults, setSearchResults] = useState([]); const [searchResults, setSearchResults] = useState([]);
const [facets, setfacets] = useState([]); const [facets, setfacets] = useState([]);
const [isLoader, setIsLoader] = useState(false); const [isLoader, setIsLoader] = useState(false);
const [totalRecords, setTotalRecords] = useState(0);
const handleOnChange = (e) => { const handleOnChange = (e) => {
setPayload(prevState => ({ setPayload(prevState => ({
...@@ -24,11 +26,12 @@ const Search = () => { ...@@ -24,11 +26,12 @@ const Search = () => {
}; };
const handleOnSearch = async () => { const handleOnSearch = async () => {
const { searchQuery, facets, filters } = payload; const { searchQuery, facets, filters, pageSize, pageOffset } = payload;
if (searchQuery) { if (searchQuery) {
setIsLoader(true); setIsLoader(true);
const apiEndpoint = 'https://api-dot-abs-poc-np-prj-01-3f2a.uc.r.appspot.com'; const apiEndpoint = 'https://api-dot-abs-poc-np-prj-01-3f2a.uc.r.appspot.com';
const url = `${apiEndpoint}/search?text=${searchQuery}${facets.length? `&facets=${JSON.stringify(facets)}` : ''}${filters && Object.keys(filters).length? `&filters=${JSON.stringify(filters)}` : ''}`; // const apiEndpoint = 'http://localhost:8080';
const url = `${apiEndpoint}/search?text=${searchQuery}&pageSize=${pageSize}&pageOffset=${pageOffset}${facets.length? `&facets=${JSON.stringify(facets)}` : ''}${filters && Object.keys(filters).length? `&filters=${JSON.stringify(filters)}` : ''}`;
const searchResults = await fetch(url) const searchResults = await fetch(url)
.then(res => res.json()) .then(res => res.json())
.then(_res => { .then(_res => {
...@@ -40,6 +43,7 @@ const Search = () => { ...@@ -40,6 +43,7 @@ const Search = () => {
.catch(err => console.log(err)) .catch(err => console.log(err))
.finally(() => setIsLoader(false)); .finally(() => setIsLoader(false));
setSearchResults(searchResults.results?.length ? [...searchResults.results] : []); setSearchResults(searchResults.results?.length ? [...searchResults.results] : []);
setTotalRecords(searchResults.totalSize? searchResults.totalSize : 0);
!Object.keys(filters || {}).length && setfacets(searchResults.facets?.length ? [...searchResults.facets] : []); // for not updating facets while filtering !Object.keys(filters || {}).length && setfacets(searchResults.facets?.length ? [...searchResults.facets] : []); // for not updating facets while filtering
} }
}; };
...@@ -64,17 +68,36 @@ const Search = () => { ...@@ -64,17 +68,36 @@ const Search = () => {
})); }));
} }
const onChangePageSize = (val) => {
const { current, pageSize } = val;
setPayload(prevState => ({
...prevState,
pageSize: pageSize,
pageOffset: pageSize * (current - 1),
}));
};
const onChangePage = (val) => {
const { current, pageSize } = val;
setPayload(prevState => ({
...prevState,
pageOffset: pageSize * (current - 1),
}));
};
useEffect(() => { useEffect(() => {
if (payload.filters != null) { if (payload.filters != null) {
handleOnSearch(); handleOnSearch();
} }
}, [payload.filters]) }, [payload.filters]);
useEffect(() => { useEffect(() => {
payload.facets.length ? handleOnSearch() : setfacets([]); payload.facets.length ? handleOnSearch() : setfacets([]);
}, [payload.facets]) }, [payload.facets]);
useEffect(() => {
handleOnSearch();
}, [payload.pageSize, payload.pageOffset]);
return ( return (
<> <>
...@@ -95,7 +118,7 @@ const Search = () => { ...@@ -95,7 +118,7 @@ const Search = () => {
}} }}
onClick={() => handleImageClick()} onClick={() => handleImageClick()}
> >
<img src='ultabeauty.png' alt="google" style={{ <img src={CONFIGS.client_logo} alt={CONFIGS.title} style={{
}} }}
/> />
</span> </span>
...@@ -117,9 +140,11 @@ const Search = () => { ...@@ -117,9 +140,11 @@ const Search = () => {
<Col span={2}> {isLoader && <Loader />} </Col> <Col span={2}> {isLoader && <Loader />} </Col>
</Row> </Row>
</div> </div>
<SearchResults searchResults={searchResults} facets={facets} <SearchResults searchResults={searchResults} facets={facets} totalRecords={totalRecords} pageSize={payload.pageSize}
onSelectFacet={(val) => onSelectFacet(val)} onSelectFacet={(val) => onSelectFacet(val)}
onSelectFilter={(val) => onSelectFilter(val)} onSelectFilter={(val) => onSelectFilter(val)}
onChangePageSize={(val) => onChangePageSize(val)}
onChangePage={(val) => onChangePage(val)}
/> />
</> </>
} }
...@@ -133,7 +158,7 @@ const Search = () => { ...@@ -133,7 +158,7 @@ const Search = () => {
<Col span={12} offset={6}> <Col span={12} offset={6}>
<div className='App'> <div className='App'>
<span> <span>
<img src='ultabeauty.png' alt="google" style={{ <img src={CONFIGS.client_logo} alt={CONFIGS.title} style={{
width: '12rem', width: '12rem',
height: 'auto', height: 'auto',
marginBottom: '2rem' marginBottom: '2rem'
......
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