Browse Source

Domains datatable - server side processing ordering

Signed-off-by: Kristian Feldsam <feldsam@gmail.com>
Kristian Feldsam 1 year ago
parent
commit
4dad0002cd

+ 0 - 1
data/web/inc/functions.mailbox.inc.php

@@ -4323,7 +4323,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
           $mailboxdata['active'] = $row['active'];
           $mailboxdata['active'] = $row['active'];
           $mailboxdata['active_int'] = $row['active'];
           $mailboxdata['active_int'] = $row['active'];
           $mailboxdata['domain'] = $row['domain'];
           $mailboxdata['domain'] = $row['domain'];
-          $mailboxdata['relayhost'] = $row['relayhost'];
           $mailboxdata['name'] = $row['name'];
           $mailboxdata['name'] = $row['name'];
           $mailboxdata['local_part'] = $row['local_part'];
           $mailboxdata['local_part'] = $row['local_part'];
           $mailboxdata['quota'] = $row['quota'];
           $mailboxdata['quota'] = $row['quota'];

+ 23 - 7
data/web/inc/lib/ssp.class.php

@@ -43,7 +43,7 @@ class SSP {
                     }
                     }
 				}
 				}
 				else {
 				else {
-                    if(!empty($column['db'])){
+                    if(!empty($column['db']) && (!isset($column['dummy']) || $column['dummy'] !== true)){
                         $row[ $column['dt'] ] = $data[$i][ $columns[$j]['db'] ];
                         $row[ $column['dt'] ] = $data[$i][ $columns[$j]['db'] ];
                     }
                     }
                     else{
                     else{
@@ -115,10 +115,12 @@ class SSP {
 	 */
 	 */
 	static function order ( $tableAS, $request, $columns )
 	static function order ( $tableAS, $request, $columns )
 	{
 	{
+    	$select = '';
 		$order = '';
 		$order = '';
 
 
 		if ( isset($request['order']) && count($request['order']) ) {
 		if ( isset($request['order']) && count($request['order']) ) {
-			$orderBy = array();
+    		$selects = [];
+			$orderBy = [];
 			$dtColumns = self::pluck( $columns, 'dt' );
 			$dtColumns = self::pluck( $columns, 'dt' );
 
 
 			for ( $i=0, $ien=count($request['order']) ; $i<$ien ; $i++ ) {
 			for ( $i=0, $ien=count($request['order']) ; $i<$ien ; $i++ ) {
@@ -133,17 +135,26 @@ class SSP {
 					$dir = $request['order'][$i]['dir'] === 'asc' ?
 					$dir = $request['order'][$i]['dir'] === 'asc' ?
 						'ASC' :
 						'ASC' :
 						'DESC';
 						'DESC';
-
-					$orderBy[] = '`'.$tableAS.'`.`'.$column['db'].'` '.$dir;
+						
+                    if(isset($column['order_subquery'])) {
+        				$selects[] = '('.$column['order_subquery'].') AS `'.$column['db'].'_count`';
+        				$orderBy[] = '`'.$column['db'].'_count` '.$dir;
+    				} else {
+					    $orderBy[] = '`'.$tableAS.'`.`'.$column['db'].'` '.$dir;
+					}
 				}
 				}
 			}
 			}
 
 
+            if ( count( $selects ) ) {
+                $select = ', '.implode(', ', $selects);
+            }
+
 			if ( count( $orderBy ) ) {
 			if ( count( $orderBy ) ) {
 				$order = 'ORDER BY '.implode(', ', $orderBy);
 				$order = 'ORDER BY '.implode(', ', $orderBy);
 			}
 			}
 		}
 		}
 
 
-		return $order;
+		return [$select, $order];
 	}
 	}
 
 
 
 
@@ -257,13 +268,14 @@ class SSP {
     }
     }
 
 
 		// Build the SQL query string from the request
 		// Build the SQL query string from the request
+		list($select, $order) = self::order( $tablesAS, $request, $columns );
 		$limit = self::limit( $request, $columns );
 		$limit = self::limit( $request, $columns );
-		$order = self::order( $tablesAS, $request, $columns );
 		$where = self::filter( $tablesAS, $request, $columns, $bindings );
 		$where = self::filter( $tablesAS, $request, $columns, $bindings );
 
 
 		// Main query to actually get the data
 		// Main query to actually get the data
 		$data = self::sql_exec( $db, $bindings,
 		$data = self::sql_exec( $db, $bindings,
 			"SELECT `$tablesAS`.`".implode("`, `$tablesAS`.`", self::pluck($columns, 'db'))."`
 			"SELECT `$tablesAS`.`".implode("`, `$tablesAS`.`", self::pluck($columns, 'db'))."`
+			 $select
 			 FROM `$table` AS `$tablesAS`
 			 FROM `$table` AS `$tablesAS`
 			 $where
 			 $where
 			 $order
 			 $order
@@ -348,8 +360,8 @@ class SSP {
     }
     }
 
 
 		// Build the SQL query string from the request
 		// Build the SQL query string from the request
+		list($select, $order) = self::order( $tablesAS, $request, $columns );
 		$limit = self::limit( $request, $columns );
 		$limit = self::limit( $request, $columns );
-		$order = self::order( $tablesAS, $request, $columns );
 		$where = self::filter( $tablesAS, $request, $columns, $bindings );
 		$where = self::filter( $tablesAS, $request, $columns, $bindings );
 
 
 		// whereResult can be a simple string, or an assoc. array with a
 		// whereResult can be a simple string, or an assoc. array with a
@@ -373,6 +385,7 @@ class SSP {
 		// Main query to actually get the data
 		// Main query to actually get the data
 		$data = self::sql_exec( $db, $bindings,
 		$data = self::sql_exec( $db, $bindings,
 			"SELECT  `$tablesAS`.`".implode("`, `$tablesAS`.`", self::pluck($columns, 'db'))."`
 			"SELECT  `$tablesAS`.`".implode("`, `$tablesAS`.`", self::pluck($columns, 'db'))."`
+			 $select
 			 FROM `$table` AS `$tablesAS`
 			 FROM `$table` AS `$tablesAS`
 			 $join
 			 $join
 			 $where
 			 $where
@@ -556,6 +569,9 @@ class SSP {
  			if ( empty($a[$i][$prop]) && $a[$i][$prop] !== 0 ) {
  			if ( empty($a[$i][$prop]) && $a[$i][$prop] !== 0 ) {
 				continue;
 				continue;
 			}
 			}
+			if ( $prop == 'db' && isset($a[$i]['dummy']) && $a[$i]['dummy'] === true ) {
+    			continue;
+			}
 
 
 			//removing the $out array index confuses the filter method in doing proper binding,
 			//removing the $out array index confuses the filter method in doing proper binding,
 			//adding it ensures that the array data are mapped correctly
 			//adding it ensures that the array data are mapped correctly

+ 2 - 7
data/web/js/site/mailbox.js

@@ -552,7 +552,6 @@ jQuery(function($){
           title: lang.stats,
           title: lang.stats,
           data: 'stats',
           data: 'stats',
           searchable: false,
           searchable: false,
-          orderable: false,
           defaultContent: '',
           defaultContent: '',
           render: function (data, type) {
           render: function (data, type) {
             data = data.split("/");
             data = data.split("/");
@@ -563,14 +562,12 @@ jQuery(function($){
           title: lang.mailbox_defquota,
           title: lang.mailbox_defquota,
           data: 'def_quota_for_mbox',
           data: 'def_quota_for_mbox',
           searchable: false,
           searchable: false,
-          orderable: false,
           defaultContent: ''
           defaultContent: ''
         },
         },
         {
         {
           title: lang.mailbox_quota,
           title: lang.mailbox_quota,
           data: 'max_quota_for_mbox',
           data: 'max_quota_for_mbox',
           searchable: false,
           searchable: false,
-          orderable: false,
           defaultContent: ''
           defaultContent: ''
         },
         },
         {
         {
@@ -584,10 +581,9 @@ jQuery(function($){
           title: lang.backup_mx,
           title: lang.backup_mx,
           data: 'backupmx',
           data: 'backupmx',
           searchable: false,
           searchable: false,
-          orderable: false,
           defaultContent: '',
           defaultContent: '',
-          redner: function (data, type){
-            return 1==value ? '<i class="bi bi-check-lg"></i>' : 0==value && '<i class="bi bi-x-lg"></i>';
+          render: function (data, type){
+            return 1==data ? '<i class="bi bi-check-lg"></i>' : 0==data && '<i class="bi bi-x-lg"></i>';
           }
           }
         },
         },
         {
         {
@@ -626,7 +622,6 @@ jQuery(function($){
           title: lang.active,
           title: lang.active,
           data: 'active',
           data: 'active',
           searchable: false,
           searchable: false,
-          orderable: false,
           defaultContent: '',
           defaultContent: '',
           responsivePriority: 6,
           responsivePriority: 6,
           render: function (data, type) {
           render: function (data, type) {

+ 8 - 3
data/web/json_api.php

@@ -528,9 +528,14 @@ if (isset($_GET['query'])) {
                 $primaryKey = 'domain';
                 $primaryKey = 'domain';
                 $columns = [
                 $columns = [
                   ['db' => 'domain', 'dt' => 2],
                   ['db' => 'domain', 'dt' => 2],
-                  ['db' => 'aliases', 'dt' => 3],
-                  ['db' => 'mailboxes', 'dt' => 4],
-                  ['db' => 'quota', 'dt' => 5],
+                  ['db' => 'aliases', 'dt' => 3, 'order_subquery' => "SELECT COUNT(*) FROM `alias` WHERE (`domain`= `d`.`domain` OR `domain` IN (SELECT `alias_domain` FROM `alias_domain` WHERE `target_domain` = `d`.`domain`)) AND `address` NOT IN (SELECT `username` FROM `mailbox`)"],
+                  ['db' => 'mailboxes', 'dt' => 4, 'order_subquery' => "SELECT COUNT(*) FROM `mailbox` WHERE `mailbox`.`domain` = `d`.`domain` AND (`mailbox`.`kind` = '' OR `mailbox`.`kind` = NULL)"],
+                  ['db' => 'quota', 'dt' => 5, 'order_subquery' => "SELECT COALESCE(SUM(`mailbox`.`quota`), 0) FROM `mailbox` WHERE `mailbox`.`domain` = `d`.`domain` AND (`mailbox`.`kind` = '' OR `mailbox`.`kind` = NULL)"],
+                  ['db' => 'stats', 'dt' => 6, 'dummy' => true, 'order_subquery' => "SELECT SUM(bytes) FROM `quota2` WHERE `quota2`.`username` IN (SELECT `username` FROM `mailbox` WHERE `domain` = `d`.`domain`)"],
+                  ['db' => 'defquota', 'dt' => 7],
+                  ['db' => 'maxquota', 'dt' => 8],
+                  ['db' => 'backupmx', 'dt' => 10],
+                  ['db' => 'active', 'dt' => 15],
                 ];
                 ];
 
 
                 require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/lib/ssp.class.php';
                 require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/lib/ssp.class.php';