diff --git a/package-lock.json b/package-lock.json index 2d163bc4..1fe7d646 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2204,7 +2204,7 @@ "dependencies": { "combined-stream": { "version": "1.0.6", - "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { "delayed-stream": "~1.0.0" @@ -3863,6 +3863,11 @@ } } }, + "mongojs-paginate": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mongojs-paginate/-/mongojs-paginate-1.2.0.tgz", + "integrity": "sha1-Z3YjmDlByAOPyBz88lw+425iO4s=" + }, "mongoose": { "version": "5.0.16", "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.0.16.tgz", diff --git a/package.json b/package.json index b9e6e168..795f6b6a 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "jimp": "^0.2.28", "mongodb": "^2.2.35", "mongojs": "^2.5.0", + "mongojs-paginate": "^1.2.0", "mongoose": "^5.0.16", "mpromise": "^0.5.5", "nodemailer": "^4.6.4", diff --git a/server/public/assets/css/style.css b/server/public/assets/css/style.css index 8790b1cb..9d94d92e 100755 --- a/server/public/assets/css/style.css +++ b/server/public/assets/css/style.css @@ -383,6 +383,14 @@ li.disabled span { margin-top: 5px; } +.filter-pagination-container { + display: flex; + justify-content: space-evenly; + padding-top: 15px; + width: 50%; + margin: auto; +} + .extra-button{ margin: 0 4px !important; padding: 0px !important; diff --git a/server/public/assets/js/functions.js b/server/public/assets/js/functions.js index 8cae821a..69474374 100644 --- a/server/public/assets/js/functions.js +++ b/server/public/assets/js/functions.js @@ -21,7 +21,7 @@ function removeAllListeners() { socket.removeEventListener(id); } -function filterPlaylistElements() { +function filterPlaylistElements(page) { Helper.ajax({ type: "POST", headers: { @@ -30,14 +30,28 @@ function filterPlaylistElements() { url: "/api/search/" + chan.toLowerCase(), data: { searchQuery: document.getElementById("filtersearch_input").value, - token: zoff_api_token + token: zoff_api_token, + page: page }, success: function(data){ var json = JSON.parse(data); document.querySelector(".filter-results").innerHTML = ""; - if(json.results.length > 0) { - for(var i = 0; i < json.results.length; i++) { - document.querySelector(".filter-results").innerHTML += List.generateSong(json.results[i], false, false, true, false, "block", false, true);; + if(json.results.search_results.length > 0) { + for(var i = 0; i < json.results.search_results.length; i++) { + document.querySelector(".filter-results").innerHTML += List.generateSong(json.results.search_results[i], false, false, true, false, "block", false, true);; + } + if(json.results.next != undefined || json.results.prev != undefined) { + document.querySelector(".filter-results").innerHTML += "
" + if(json.results.prev != undefined) { + document.querySelector(".filter-pagination-container").innerHTML += "Prev"; + } else { + document.querySelector(".filter-pagination-container").innerHTML += "Prev"; + } + if(json.results.next != undefined) { + document.querySelector(".filter-pagination-container").innerHTML += "Next"; + } else { + document.querySelector(".filter-pagination-container").innerHTML += "Next"; + } } } else { toast("Couldn't find any items with those tags..", "red"); diff --git a/server/public/assets/js/listeners.js b/server/public/assets/js/listeners.js index 78e1bafa..66e72257 100755 --- a/server/public/assets/js/listeners.js +++ b/server/public/assets/js/listeners.js @@ -697,12 +697,28 @@ function addDynamicListeners() { addListener("submit", "#filter-form", function(e) { this.preventDefault(); - filterPlaylistElements(); + filterPlaylistElements(1); }); addListener("click", ".submit-filter-search", function(e) { this.preventDefault(); - filterPlaylistElements(); + filterPlaylistElements(1); + }); + + addListener("click", ".next-filter", function(e) { + this.preventDefault(); + var page = e.getAttribute("data-page"); + page = parseInt(page); + if(page == undefined || isNaN(page)) return; + filterPlaylistElements(page); + }); + + addListener("click", ".prev-filter", function(e) { + this.preventDefault(); + var page = e.getAttribute("data-page"); + page = parseInt(page); + if(page == undefined || isNaN(page)) return; + filterPlaylistElements(page); }); addListener("click", ".delete-context-menu", function(e) { diff --git a/server/routing/client/api.js b/server/routing/client/api.js index 9a9050ba..be2edd18 100644 --- a/server/routing/client/api.js +++ b/server/routing/client/api.js @@ -15,6 +15,7 @@ var Search = require(pathThumbnails + '/handlers/search.js'); var uniqid = require('uniqid'); var Filter = require('bad-words'); var filter = new Filter({ placeHolder: 'x'}); +var paginate = require('mongojs-paginate'); var _exports = { router: router, @@ -748,6 +749,10 @@ router.route('/api/search/:channel_name/').post(function(req, res) { } else { userpass = ""; } + var page = 1; + if(req.body.hasOwnProperty("page") && req.body.page > 0) { + page = req.body.page; + } var searchQuery = ""; if(req.body.searchQuery == undefined || req.body.searchQuery == "") { var to_send = error.formatting; @@ -800,13 +805,24 @@ router.route('/api/search/:channel_name/').post(function(req, res) { res.status(403).send(error.not_authenticated); return; } - db.collection(channel_name).find({tags: {$regex : ".*" + searchQuery + ".*"}}, function(e, results) { - if(results.length == 0) { + var query = db.collection(channel_name).find({tags: { + $regex : ".*" + searchQuery + ".*" + }}); + paginate(query, { limit : 30, page : page }, function(err, result) { + if(result.items.length == 0) { res.status(404).send(error.not_found.local); return; } - var to_return = error.no_error; - to_return.results = results; + var to_return = error.no_error + to_return.results = {}; + if(result.hasNext) { + to_return.results.next = result.page + 1; + } + if(result.hasPrevious) { + to_return.results.prev = result.page - 1; + } + to_return.results.search_results = result.items; + res.status(200).send(to_return); }); });