diff --git a/client/js/catalog.js b/client/js/catalog.js index 341fa72a81e109273313e489de3496b9b519ffff..1f1fccd959ab355e4c39d25325e8fa9ae153d8c0 100644 --- a/client/js/catalog.js +++ b/client/js/catalog.js @@ -1,41 +1,88 @@ -var recordsPerPage = 10; var activePage; -function numPages(){ - return Math.ceil(1000/10)-1; + + +function debounce(func, delay=1000){ + let timer = null; + return (...args) => { + clearTimeout(timer); + timer = setTimeout(() => func.apply(this, args), delay); + }; } -prevPage = () => { - activePage = document.getElementsByClassName("active").item(0).innerHTML; - if (activePage > 1){ - activePage--; - changePage(activePage); + + +//Promise is to syncronize asyncronous process +const input = document.getElementById("Searchinput"); +var myPromises = new Promise(function(resolve, reject){ + const formdata = new FormData(); + formdata.append("signal", "getTotalRows"); + formdata.append('search', document.getElementById("Searchinput").value); + console.log(input.value); + + const xhr = new XMLHttpRequest(); + xhr.open('GET', '../../server/controllers/catalog.php', true); + xhr.send(formdata); + xhr.onreadystatechange = function(){ + if (xhr.readyState === 4 && xhr.status === 200){ + var responseData = JSON.parse(xhr.responseText); + if (responseData.success){ + //if expected process occur during promise get the expected value + resolve(Math.ceil(responseData.total[0]/10)-1); + } else { + alert("error: " + responseData.message); + //unexpected process occur during promise + reject("error"); + } + } else if (xhr.status === 404){ + var response = JSON.parse(xhr.responseText); + console.log(response.message); + reject("error"); + } } -} +}); +var numPages; +//get the value of promise +myPromises.then( + function(value) {numPages = value;}, + function(error) {numPages = error;} + ); + + + prevPage = () => { + activePage = document.getElementsByClassName("active").item(0).innerHTML; + if (activePage > 1){ + activePage--; + changePage(activePage); + } + } + nextPage = () => { activePage = document.getElementsByClassName("active").item(0).innerHTML; - if (activePage < numPages()){ + if (activePage < numPages){ activePage++; changePage(activePage); } } -changePage = (page) => { +function changePage(page){ var btnNext = document.getElementById("btnNext"); var btnPrev = document.getElementById("btnPrev"); var listingTable = document.getElementById("catalogview"); var pages = [document.getElementById("secondToRight"), - document.getElementById("firstToRight"), - document.getElementById("middle"), - document.getElementById("firstToLeft"), - document.getElementById("secondToLeft")]; + document.getElementById("firstToRight"), + document.getElementById("middle"), + document.getElementById("firstToLeft"), + document.getElementById("secondToLeft")]; //XMLHttpRequest const formdata = new FormData(); - + var row = (page)*10; formdata.append('rows', row); + formdata.append('search', document.getElementById("Searchinput").value); + console.log(document.getElementById("Searchinput").value); const xhr = new XMLHttpRequest(); xhr.open('POST', '../../server/controllers/catalog.php', true); //sending @@ -51,22 +98,22 @@ changePage = (page) => { if (page < 1){ page = 1; } - if (page > numPages()){ - page = numPages(); + if (page > numPages){ + page = numPages; } listingTable.innerHTML =""; - + for (var i = 0; i < 10 && itemList.length ; i++){ listingTable.innerHTML += `<button class="showItem"> - <img id="${itemList[i][0]}" src="../image/${itemList[i][2]}" alt="${itemList[i][1]}"> - <p>${itemList[i][1]}</p> - <p>Rp${itemList[i][4]}</p> - <p>Quantity:${itemList[i][5]}</p> - <p>${itemList[i][6]}</p> + <img id="${itemList[i][0]}" src="../image/${itemList[i][2]}" alt="${itemList[i][1]}"> + <p>${itemList[i][1]}</p> + <p>Rp${itemList[i][4]}</p> + <p>Quantity:${itemList[i][5]}</p> + <p>${itemList[i][6]}</p> </button>` } - var endpage = numPages()-4; + var endpage = numPages-4; for (var i = 0; i < pages.length; i++){ @@ -75,7 +122,7 @@ changePage = (page) => { if (page-1 < 2){ pages[i].innerHTML = i+1; pages[i].setAttribute("href", `javascript:changePage(${i+1})`); - } else if (page > numPages()-2){ + } else if (page > numPages-2){ pages[i].innerHTML = endpage + i; pages[i].setAttribute("href", `javascript:changePage(${endpage + i})`); } else { @@ -88,9 +135,9 @@ changePage = (page) => { pages[0].classList.add("active"); } else if (page == 2){ pages[1].classList.add("active"); - } else if (page == numPages()-1){ + } else if (page == numPages-1){ pages[3].classList.add("active"); - } else if (page == numPages()){ + } else if (page == numPages){ pages[4].classList.add("active"); } else { pages[2].classList.add("active"); @@ -100,8 +147,8 @@ changePage = (page) => { } else { btnPrev.style.visibility = "visible"; } - - if (page == numPages()){ + + if (page == numPages){ btnNext.style.visibility = "hidden"; } else { btnNext.style.visibility = "visible"; @@ -111,14 +158,14 @@ changePage = (page) => { alert("error: " + responseData.message); } } catch (error){ - + } } else if (xhr.status === 404){ var response = JSON.parse(xhr.responseText); console.log(response.message); } } - - - + + + } \ No newline at end of file diff --git a/client/js/navbar.js b/client/js/navbar.js index 77c97a630df66271f389e12d9de98dd84529fc1c..de196a8272b85988751b12b9d79d977488e0b2dd 100644 --- a/client/js/navbar.js +++ b/client/js/navbar.js @@ -5,7 +5,7 @@ addnavbar = () => { </a> <img src="../image/logoregis.svg" alt="icon" width="10%" height="5%"> <div class="searchbar"> - <input id="Searchinput" type="text" placeholder="Search..." value=""> + <input id="Searchinput" type="text" placeholder="Search..." value="" onkeypress=""> <button class="search" onclick=""> <i class="fa-solid fa-magnifying-glass"></i> </button> diff --git a/client/pages/catalog.php b/client/pages/catalog.php index 90933273b726dee44ec3fe08b864d73be54343b5..fd105e48d938c874b42ca38212b3c8b45c04504c 100644 --- a/client/pages/catalog.php +++ b/client/pages/catalog.php @@ -14,6 +14,8 @@ <div class="tabgroup" id="tabgroup"> <script> addnavbar(); + const processChange = debounce(() => changePage(1)); + document.getElementById("Searchinput").setAttribute("onkeypress", "processChange()"); </script> </div> <div class="pageview"> diff --git a/server/controllers/catalog.php b/server/controllers/catalog.php index ed28c441b9a521088865a5619dca8e9e66775215..709371cf7dae57d692d8d228a64073e00d4dd716 100644 --- a/server/controllers/catalog.php +++ b/server/controllers/catalog.php @@ -3,17 +3,16 @@ if ($_SERVER["REQUEST_METHOD"] == "POST"){ $page = $_POST["rows"]; + $search = $_POST["search"]; $conn = connect_database(); - $query = "SELECT * FROM `item` LIMIT ? , 10"; + $query = "SELECT * FROM `item` WHERE `name` LIKE '%$search%' ORDER BY if (SUBSTRING(name, 1, length('$search'))='$search', 0, 1), name LIMIT $page , 10"; $stmt = $conn->prepare($query); if (!$stmt){ die("Error in query preparation: ". $conn->error); } - - $stmt->bind_param("i", $page); $result = $stmt->execute(); if (!$result){ @@ -27,7 +26,32 @@ $response = array("success" => false, "message" => "Error: not found"); } + echo json_encode($response); + mysqli_close($conn); + } else if ($_SERVER["REQUEST_METHOD"] == "GET"){ + $search = $_GET["search"]; + + $conn = connect_database(); + + $query = "SELECT COUNT(item_id) FROM `item` WHERE name LIKE '%$search%'"; + $stmt = $conn->prepare($query); + + if (!$stmt){ + die("Error in query preparation: ". $conn->error); + } + $result = $stmt->execute(); + if (!$result){ + die("Error in query execution: " . $stmt->error); + } + $resultSet = $stmt->get_result(); + $total = $resultSet->fetch_all(); + if (!empty($total)){ + $response = array("success" => true, "message" => "data sent", "total" => $total); + } else { + $response = array("success" => false, "message" => "Error: not found"); + } + echo json_encode($response); mysqli_close($conn); }