From d61caad090c8b239966307fe50c59503ab776683 Mon Sep 17 00:00:00 2001 From: Maurice Meyer Date: Thu, 12 May 2016 13:23:09 +0000 Subject: [PATCH] Added initial functionality for pagination --- api/domains.php | 106 ++++++++++++++++++++++++++++---------- config/config-default.php | 5 +- domains.php | 29 +++++++++-- js/domains.js | 21 ++++---- 4 files changed, 120 insertions(+), 41 deletions(-) diff --git a/api/domains.php b/api/domains.php index f30ffb2..15c8601 100644 --- a/api/domains.php +++ b/api/domains.php @@ -29,38 +29,16 @@ if(!isset($input->csrfToken) || $input->csrfToken !== $_SESSION['csrfToken']) { if(isset($input->action) && $input->action == "getDomains") { + // Here we get the number of matching records $sql = " - SELECT D.id,D.name,D.type,count(R.domain_id) AS records + SELECT COUNT(*) AS anzahl FROM domains D - LEFT OUTER JOIN records R ON D.id = R.domain_id LEFT OUTER JOIN permissions P ON D.id = P.domain - WHERE (P.user=? OR ?) - GROUP BY D.id - HAVING + WHERE (P.user=? OR ?) AND (D.name LIKE ? OR ?) AND (D.type=? OR ?) "; - if(isset($input->sort->field) && $input->sort->field != "") { - if($input->sort->field == "id") { - $sql .= "ORDER BY id"; - } else if($input->sort->field == "name") { - $sql .= "ORDER BY name"; - } else if($input->sort->field == "type") { - $sql .= "ORDER BY type"; - } else if($input->sort->field == "records") { - $sql .= "ORDER BY records"; - } - - if(isset($input->sort->order)) { - if($input->sort->order == 0) { - $sql .= " DESC"; - } else if($input->sort->order == 1) { - $sql .= " ASC"; - } - } - } - $stmt = $db->prepare($sql); if(isset($input->name)) { @@ -91,10 +69,86 @@ if(isset($input->action) && $input->action == "getDomains") { $result = $stmt->get_result(); + // This is the object containing the number of rows + $obj = $result->fetch_object(); + + // Initialize the return value $retval = Array(); + + $retval['pages']['current'] = 1; + $retval['pages']['total'] = $obj->anzahl / $config['domain_rows']; + + + // Now the real search is done on the database + $sql = " + SELECT D.id,D.name,D.type,count(R.domain_id) AS records + FROM domains D + LEFT OUTER JOIN records R ON D.id = R.domain_id + LEFT OUTER JOIN permissions P ON D.id = P.domain + WHERE (P.user=? OR ?) + GROUP BY D.id + HAVING + (D.name LIKE ? OR ?) AND + (D.type=? OR ?) + "; + + if(isset($input->sort->field) && $input->sort->field != "") { + if($input->sort->field == "id") { + $sql .= "ORDER BY id"; + } else if($input->sort->field == "name") { + $sql .= "ORDER BY name"; + } else if($input->sort->field == "type") { + $sql .= "ORDER BY type"; + } else if($input->sort->field == "records") { + $sql .= "ORDER BY records"; + } + + if(isset($input->sort->order)) { + if($input->sort->order == 0) { + $sql .= " DESC"; + } else if($input->sort->order == 1) { + $sql .= " ASC"; + } + } + } + + /* + * Now the number of entries gets limited to the domainRows config value + */ + $sql .= " LIMIT " . $config['domain_rows']; + + $stmt = $db->prepare($sql); + + if(isset($input->name)) { + $name_filter = "%" . $input->name . "%"; + $name_filter_used = 0; + } else { + $name_filter = ""; + $name_filter_used = 1; + } + + $id_filter = $_SESSION['id']; + $id_filter_used = (int)($_SESSION['type'] == "admin" ? 1 : 0); + + if(isset($input->type)) { + $type_filter = $input->type; + $type_filter_used = 0; + } else { + $type_filter = ""; + $type_filter_used = 1; + } + + $stmt->bind_param("sisiii", + $id_filter, $id_filter_used, + $name_filter, $name_filter_used, + $type_filter, $type_filter_used + ); + $stmt->execute(); + + $result = $stmt->get_result(); while($obj = $result->fetch_object()) { - $retval[] = $obj; + $retval['data'][] = $obj; } } diff --git a/config/config-default.php b/config/config-default.php index c6eedf8..c983f50 100644 --- a/config/config-default.php +++ b/config/config-default.php @@ -26,4 +26,7 @@ $config['db_name'] = "pdnsmanager"; //Remote update $config['nonce_lifetime'] = 15; -include 'config-user.php'; \ No newline at end of file +//Number of rows in domain overview +$config['domain_rows'] = 100; + +include 'config-user.php'; diff --git a/domains.php b/domains.php index 3013f77..0525482 100644 --- a/domains.php +++ b/domains.php @@ -50,7 +50,7 @@ limitations under the License. - +
@@ -82,12 +82,31 @@ limitations under the License. -
+ + '; + echo '
'; echo 'Add MASTER'; echo 'Add NATIVE'; echo '
'; @@ -108,6 +127,8 @@ limitations under the License.
- ' . $_SESSION['csrfToken'] . ''; ?> + + ' . $_SESSION['csrfToken'] . ''; ?> + diff --git a/js/domains.js b/js/domains.js index b487f2e..9992658 100644 --- a/js/domains.js +++ b/js/domains.js @@ -39,15 +39,15 @@ $(document).ready(function() { } requestData(); }); - + $('#searchName').bind("paste keyup", function() { requestData(); }); - + $('#searchType').change(function() { requestData(); }); - + $('#searchType').select2({ minimumResultsForSearch: Infinity }); @@ -55,23 +55,23 @@ $(document).ready(function() { function requestData() { var restrictions = { - csrfToken: $('#csrfToken').text() + csrfToken: $('#csrfToken').text(), }; - + restrictions.sort = sort; - + var searchName = $('#searchName').val(); if(searchName.length > 0) { restrictions.name = searchName; } - + var searchType = $('#searchType').val(); if(searchType != "none") { restrictions.type = searchType; } - + restrictions.action = "getDomains"; - + $.post( "api/domains.php", JSON.stringify(restrictions), @@ -84,6 +84,7 @@ function requestData() { function recreateTable(data) { $('#table-domains>tbody').empty(); + $('#pagination').empty(); $.each(data, function(index,item) { $('').appendTo('#table-domains>tbody') @@ -144,4 +145,4 @@ function deleteDomainWithId(id, callback) { }, "json" ); -} \ No newline at end of file +}