Refactor the pagination data retrieval

master
Mark Moffat 2020-03-19 17:02:22 +10:30
parent 4b3867e47f
commit 5f81173919
5 changed files with 68 additions and 53 deletions

View File

@ -616,33 +616,45 @@ const newId = () => {
return new ObjectId();
};
const getData = (req, page, query) => {
/**
* @param {boolean} frontend // whether or not this is an front or admin call
* @param {req} req // express `req` object
* @param {integer} page // The page number
* @param {string} collection // The collection to search
* @param {object} query // The mongo query
* @param {object} sort // The mongo sort
*/
const paginateData = (frontend, req, page, collection, query, sort) => {
const db = req.app.db;
const config = getConfig();
const numberProducts = config.productsPerPage ? config.productsPerPage : 6;
let numberItems = 10;
if(frontend){
numberItems = config.productsPerPage ? config.productsPerPage : 6;
}
let skip = 0;
if(page > 1){
skip = (page - 1) * numberProducts;
skip = (page - 1) * numberItems;
}
if(!query){
query = {};
}
query.productPublished = { $ne: false };
if(!sort){
sort = {};
}
// Run our queries
return Promise.all([
db.products.find(query).skip(skip).limit(parseInt(numberProducts)).toArray(),
db.products.countDocuments(query)
db[collection].find(query).skip(skip).limit(parseInt(numberItems)).sort(sort).toArray(),
db[collection].countDocuments(query)
])
.then((result) => {
const returnData = { data: result[0], totalProducts: result[1] };
const returnData = { data: result[0], totalItems: result[1] };
return returnData;
})
.catch((err) => {
throw new Error('Error retrieving products');
throw new Error('Error retrieving paginated data');
});
};
@ -702,7 +714,7 @@ module.exports = {
sendEmail,
getId,
newId,
getData,
paginateData,
hooker,
getCountryList,
cleanAmount

View File

@ -80,8 +80,8 @@ $(document).ready(function (){
if($('#pager').length){
var pageNum = $('#pageNum').val();
var pageLen = $('#productsPerPage').val();
var productCount = $('#totalProductCount').val();
var pageLen = $('#itemsPerPage').val();
var itemCount = $('#totalItemCount').val();
var paginateUrl = $('#paginateUrl').val();
var searchTerm = $('#searchTerm').val();
@ -90,11 +90,12 @@ $(document).ready(function (){
}
var pagerHref = '/' + paginateUrl + '/' + searchTerm + '{{number}}';
var totalProducts = Math.ceil(productCount / pageLen);
var totalItems = Math.ceil(itemCount / pageLen);
if(parseInt(productCount) > parseInt(pageLen)){
if(parseInt(itemCount) > parseInt(pageLen)){
console.log('here?');
$('#pager').bootpag({
total: totalProducts,
total: totalItems,
page: pageNum,
maxVisible: 5,
href: pagerHref,

File diff suppressed because one or more lines are too long

View File

@ -16,7 +16,7 @@ const {
updateTotalCart,
emptyCart,
updateSubscriptionCheck,
getData,
paginateData,
addSitemapProducts,
getCountryList
} = require('../lib/common');
@ -642,38 +642,38 @@ router.get('/search/:searchTerm/:pageNum?', (req, res) => {
}
Promise.all([
getData(req, pageNum, { _id: { $in: lunrIdArray } }),
paginateData(true, req, pageNum, 'products', { _id: { $in: lunrIdArray } }),
getMenu(db)
])
.then(([results, menu]) => {
// If JSON query param return json instead
if(req.query.json === 'true'){
res.status(200).json(results.data);
return;
}
.then(([results, menu]) => {
// If JSON query param return json instead
if(req.query.json === 'true'){
res.status(200).json(results.data);
return;
}
res.render(`${config.themeViews}index`, {
title: 'Results',
results: results.data,
filtered: true,
session: req.session,
metaDescription: req.app.config.cartTitle + ' - Search term: ' + searchTerm,
searchTerm: searchTerm,
message: clearSessionValue(req.session, 'message'),
messageType: clearSessionValue(req.session, 'messageType'),
productsPerPage: numberProducts,
totalProductCount: results.totalProducts,
pageNum: pageNum,
paginateUrl: 'search',
config: config,
menu: sortMenu(menu),
helpers: req.handlebars.helpers,
showFooter: 'showFooter'
});
})
.catch((err) => {
console.error(colors.red('Error searching for products', err));
res.render(`${config.themeViews}index`, {
title: 'Results',
results: results.data,
filtered: true,
session: req.session,
metaDescription: req.app.config.cartTitle + ' - Search term: ' + searchTerm,
searchTerm: searchTerm,
message: clearSessionValue(req.session, 'message'),
messageType: clearSessionValue(req.session, 'messageType'),
productsPerPage: numberProducts,
totalProductCount: results.totalItems,
pageNum: pageNum,
paginateUrl: 'search',
config: config,
menu: sortMenu(menu),
helpers: req.handlebars.helpers,
showFooter: 'showFooter'
});
})
.catch((err) => {
console.error(colors.red('Error searching for products', err));
});
});
// search products
@ -695,7 +695,7 @@ router.get('/category/:cat/:pageNum?', (req, res) => {
}
Promise.all([
getData(req, pageNum, { _id: { $in: lunrIdArray } }),
paginateData(true, req, pageNum, 'products', { _id: { $in: lunrIdArray } }),
getMenu(db)
])
.then(([results, menu]) => {
@ -717,7 +717,7 @@ router.get('/category/:cat/:pageNum?', (req, res) => {
message: clearSessionValue(req.session, 'message'),
messageType: clearSessionValue(req.session, 'messageType'),
productsPerPage: numberProducts,
totalProductCount: results.totalProducts,
totalProductCount: results.totalItems,
pageNum: pageNum,
menuLink: _.find(sortedMenu.items, (obj) => { return obj.link === searchTerm; }),
paginateUrl: 'category',
@ -777,7 +777,7 @@ router.get('/page/:pageNum', (req, res, next) => {
const numberProducts = config.productsPerPage ? config.productsPerPage : 6;
Promise.all([
getData(req, req.params.pageNum),
paginateData(true, req, req.params.pageNum, 'products'),
getMenu(db)
])
.then(([results, menu]) => {
@ -796,7 +796,7 @@ router.get('/page/:pageNum', (req, res, next) => {
metaDescription: req.app.config.cartTitle + ' - Products page: ' + req.params.pageNum,
config: req.app.config,
productsPerPage: numberProducts,
totalProductCount: results.totalProducts,
totalProductCount: results.totalItems,
pageNum: req.params.pageNum,
paginateUrl: 'page',
helpers: req.handlebars.helpers,
@ -818,7 +818,7 @@ router.get('/:page?', async (req, res, next) => {
// if no page is specified, just render page 1 of the cart
if(!req.params.page){
Promise.all([
getData(req, 1, {}),
paginateData(true, req, 1, 'products', {}),
getMenu(db)
])
.then(([results, menu]) => {
@ -828,6 +828,8 @@ router.get('/:page?', async (req, res, next) => {
return;
}
console.log('results', results);
res.render(`${config.themeViews}index`, {
title: `${config.cartTitle} - Shop`,
theme: config.theme,
@ -837,7 +839,7 @@ router.get('/:page?', async (req, res, next) => {
messageType: clearSessionValue(req.session, 'messageType'),
config,
productsPerPage: numberProducts,
totalProductCount: results.totalProducts,
totalProductCount: results.totalItems,
pageNum: 1,
paginateUrl: 'page',
helpers: req.handlebars.helpers,

View File

@ -58,9 +58,9 @@
{{/each}}
</div>
</div>
<input type="hidden" id="productsPerPage" value="{{productsPerPage}}" >
<input type="hidden" id="itemsPerPage" value="{{productsPerPage}}" >
<input type="hidden" id="pageNum" value="{{pageNum}}">
<input type="hidden" id="totalProductCount" value="{{totalProductCount}}">
<input type="hidden" id="totalItemCount" value="{{totalProductCount}}">
<input type="hidden" id="paginateUrl" value="{{paginateUrl}}">
<input type="hidden" id="searchTerm" value="{{searchTerm}}">
<div class="col-md-12">