diff --git a/src/Controller/RoleController.php b/src/Controller/RoleController.php
index cb1bf79a..a994d8c0 100644
--- a/src/Controller/RoleController.php
+++ b/src/Controller/RoleController.php
@@ -27,16 +27,66 @@ class RoleController extends BaseController
return $this->render('role/list.html.twig', $params);
}
- public function rows()
+ public function rows(Request $req)
{
// build query
$qb = $this->getDoctrine()
->getRepository(Role::class)
- ->createQueryBuilder('q')
- ->getQuery();
+ ->createQueryBuilder('q');
- // get all rows
- $rows = $qb->getResult(Query::HYDRATE_ARRAY);
+ // count total records
+ $total = $qb->select('COUNT(q)')
+ ->getQuery()
+ ->getSingleScalarResult();
+
+ // get datatable params
+ $datatable = $req->request->get('datatable');
+
+ // get current page number
+ $page = $datatable['pagination']['page'] ?? 1;
+
+ $perpage = $datatable['pagination']['perpage'];
+ $offset = ($page - 1) * $perpage;
+
+ // add metadata
+ $meta = [
+ 'page' => $page,
+ 'perpage' => $perpage,
+ 'pages' => ceil($total / $perpage),
+ 'total' => $total,
+ 'sort' => 'asc',
+ 'field' => 'id'
+ ];
+
+ // build query
+ $query = $qb->select('q');
+
+ // check if filter is present
+ if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
+ $query->where('q.id LIKE :filter')
+ ->orWhere('q.name LIKE :filter')
+ ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
+ }
+
+ // check if sorting is present, otherwise use default
+ if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) {
+ $order = $datatable['sort']['sort'] ?? 'asc';
+ $query->orderBy('q.' . $datatable['sort']['field'], $order);
+ } else {
+ $query->orderBy('q.id', 'asc');
+ }
+
+ // get rows for this page
+ $rows = $query->setFirstResult($offset)
+ ->setMaxResults($perpage)
+ ->getQuery()
+ ->getResult(Query::HYDRATE_ARRAY);
+
+ // response
+ return $this->json([
+ 'meta' => $meta,
+ 'data' => $rows
+ ]);
// add crud urls
foreach ($rows as $index => $row) {
@@ -45,7 +95,10 @@ class RoleController extends BaseController
}
// response
- return $this->json(['data' => $rows]);
+ return $this->json([
+ 'meta' => $meta,
+ 'data' => $rows
+ ]);
}
public function create()
diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php
index 127756dd..fdb6f5bb 100644
--- a/src/Controller/UserController.php
+++ b/src/Controller/UserController.php
@@ -29,16 +29,69 @@ class UserController extends BaseController
return $this->render('user/list.html.twig', $params);
}
- public function rows()
+ public function rows(Request $req)
{
- // build query
+ // get query builder
$qb = $this->getDoctrine()
->getRepository(User::class)
- ->createQueryBuilder('q')
- ->getQuery();
+ ->createQueryBuilder('q');
+
+ // count total records
+ $total = $qb->select('COUNT(q)')
+ ->getQuery()
+ ->getSingleScalarResult();
- // get all rows
- $rows = $qb->getResult(Query::HYDRATE_ARRAY);
+ // get datatable params
+ $datatable = $req->request->get('datatable');
+
+ // get current page number
+ $page = $datatable['pagination']['page'] ?? 1;
+
+ $perpage = $datatable['pagination']['perpage'];
+ $offset = ($page - 1) * $perpage;
+
+ // add metadata
+ $meta = [
+ 'page' => $page,
+ 'perpage' => $perpage,
+ 'pages' => ceil($total / $perpage),
+ 'total' => $total,
+ 'sort' => 'asc',
+ 'field' => 'id'
+ ];
+
+ // build query
+ $query = $qb->select('q');
+
+ // check if filter is present
+ if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) {
+ $query->where('q.username LIKE :filter')
+ ->orWhere('q.first_name LIKE :filter')
+ ->orWhere('q.last_name LIKE :filter')
+ ->orWhere('q.email LIKE :filter')
+ ->orWhere('q.contact_num LIKE :filter')
+ ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%');
+ }
+
+ // check if sorting is present, otherwise use default
+ if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) {
+ $order = $datatable['sort']['sort'] ?? 'asc';
+ $query->orderBy('q.' . $datatable['sort']['field'], $order);
+ } else {
+ $query->orderBy('q.id', 'asc');
+ }
+
+ // get rows for this page
+ $rows = $query->setFirstResult($offset)
+ ->setMaxResults($perpage)
+ ->getQuery()
+ ->getResult(Query::HYDRATE_ARRAY);
+
+ // response
+ return $this->json([
+ 'meta' => $meta,
+ 'data' => $rows
+ ]);
// add crud urls
foreach ($rows as $index => $row) {
diff --git a/templates/base.html.twig b/templates/base.html.twig
index f31af599..30e329d4 100644
--- a/templates/base.html.twig
+++ b/templates/base.html.twig
@@ -603,11 +603,6 @@
My Profile
-
-
- 2
-
-
diff --git a/templates/role/list.html.twig b/templates/role/list.html.twig
index 9a5cc19e..f176627e 100644
--- a/templates/role/list.html.twig
+++ b/templates/role/list.html.twig
@@ -70,7 +70,15 @@
url: '{{ url("role_rows") }}',
method: 'POST'
}
- }
+ },
+ saveState: {
+ cookie: false,
+ webstorage: false
+ },
+ pageSize: 10,
+ serverPaging: true,
+ serverFiltering: true,
+ serverSorting: true
},
columns: [
{
@@ -102,12 +110,7 @@
onEnter: false,
input: $('#data-rows-search'),
delay: 400
- },
- /*
- serverPaging: true,
- serverFiltering: true,
- serverSorting: true
- */
+ }
};
var table = $("#data-rows").mDatatable(options);
diff --git a/templates/user/list.html.twig b/templates/user/list.html.twig
index 79229e11..a16c3d80 100644
--- a/templates/user/list.html.twig
+++ b/templates/user/list.html.twig
@@ -68,9 +68,17 @@
source: {
read: {
url: '{{ url("user_rows") }}',
- method: 'POST'
+ method: 'POST',
}
- }
+ },
+ saveState: {
+ cookie: false,
+ webstorage: false
+ },
+ pageSize: 10,
+ serverPaging: true,
+ serverFiltering: true,
+ serverSorting: true
},
columns: [
{
@@ -92,7 +100,7 @@
},
{
field: 'email',
- title: 'E- mail'
+ title: 'E-mail'
},
{
field: 'contact_num',
@@ -134,12 +142,7 @@
onEnter: false,
input: $('#data-rows-search'),
delay: 400
- },
- /*
- serverPaging: true,
- serverFiltering: true,
- serverSorting: true
- */
+ }
};
var table = $("#data-rows").mDatatable(options);