diff --git a/web/ajax/newlog.php b/web/ajax/newlog.php
index f97a6b649..9e6bd9585 100644
--- a/web/ajax/newlog.php
+++ b/web/ajax/newlog.php
@@ -21,10 +21,11 @@ $columns = array('TimeKey', 'Component', 'ServerId', 'Pid', 'Code', 'Message', '
$col_alt = array('DateTime', 'Server');
// Search contains a user entered string to search on
-$search = '';
-if ( isset($_REQUEST['search']) ) {
- $search = $_REQUEST['search'];
-}
+$search = isset($_REQUEST['search']) ? $_REQUEST['search'] : '';
+
+// Advanced search contains an array of "column name" => "search text" pairs
+// Bootstrap table sends json_ecoded array, which we must decode
+$advsearch = isset($_REQUEST['filter']) ? json_decode($_REQUEST['filter'], JSON_OBJECT_AS_ARRAY) : array();
// Sort specifies the name of the column to sort on
$sort = 'TimeKey';
@@ -65,7 +66,26 @@ $data = array();
$query = array();
$query['values'] = array();
$likes = array();
-if ( $search != '' ) {
+$where = '';
+// There are two search bars in the log view, normal and advanced
+// Making an exuctive decision to ignore the normal search, when advanced search is in use
+// Alternatively we could try to do both
+if ( count($advsearch) ) {
+
+ foreach ( $advsearch as $col=>$text ) {
+ if ( !in_array($col, array_merge($columns, $col_alt)) ) {
+ ZM\Error("'$col' is not a sortable column name");
+ continue;
+ }
+ $text = '%' .$text. '%';
+ array_push($likes, $col.' LIKE ?');
+ array_push($query['values'], $text);
+ }
+ $wherevalues = $query['values'];
+ $where = ' WHERE (' .implode(' OR ', $likes). ')';
+
+} else if ( $search != '' ) {
+
$search = '%' .$search. '%';
foreach ( $columns as $col ) {
array_push($likes, $col.' LIKE ?');
@@ -73,20 +93,18 @@ if ( $search != '' ) {
}
$wherevalues = $query['values'];
$where = ' WHERE (' .implode(' OR ', $likes). ')';
- $query['sql'] = 'SELECT ' .$col_str. ' FROM `' .$table. '` ' .$where. ' ORDER BY ' .$sort. ' ' .$order. ' LIMIT ?, ?';
- array_push($query['values'], $offset, $limit);
-} else {
- $query['sql'] = 'SELECT ' .$col_str. ' FROM `' .$table. '` ORDER BY ' .$sort. ' ' .$order. ' LIMIT ?, ?';
- $query['values'] = array($offset, $limit);
-}
+}
+
+$query['sql'] = 'SELECT ' .$col_str. ' FROM `' .$table. '` ' .$where. ' ORDER BY ' .$sort. ' ' .$order. ' LIMIT ?, ?';
+array_push($query['values'], $offset, $limit);
//ZM\Warning('Calling the following sql query: ' .$query['sql']);
$data['totalNotFiltered'] = dbFetchOne('SELECT count(*) AS Total FROM ' .$table, 'Total');
-if ( $search == '' ) {
- $data['total'] = $data['totalNotFiltered'];
-} else {
+if ( $search != '' || count($advsearch) ) {
$data['total'] = dbFetchOne('SELECT count(*) AS Total FROM ' .$table.$where , 'Total', $wherevalues);
+} else {
+ $data['total'] = $data['totalNotFiltered'];
}
if ( !$Servers )
diff --git a/web/includes/Filter.php b/web/includes/Filter.php
index 089bdc996..3490c276c 100644
--- a/web/includes/Filter.php
+++ b/web/includes/Filter.php
@@ -50,10 +50,10 @@ class Filter extends ZM_Object {
return $this->_sql;
}
- public function querystring() {
- if ( ! isset($this->_querystring) ) {
+ public function querystring($separator='&') {
+ if ( (! isset($this->_querystring)) or ( $separator != '&' ) ) {
foreach ( $this->FilterTerms() as $term ) {
- $this->_querystring .= $term->querystring();
+ $this->_querystring .= $term->querystring($separator);
} # end foreach term
}
return $this->_querystring;
@@ -308,6 +308,312 @@ class Filter extends ZM_Object {
return $failed;
}
+ function tree() {
+ $terms = $this->terms();
+
+ if ( count($terms) <= 0 ) {
+ return false;
+ }
+
+ $StorageArea = NULL;
+
+ $postfixExpr = array();
+ $postfixStack = array();
+
+ $priorities = array(
+ '<' => 1,
+ '<=' => 1,
+ '>' => 1,
+ '>=' => 1,
+ '=' => 2,
+ '!=' => 2,
+ '=~' => 2,
+ '!~' => 2,
+ '=[]' => 2,
+ '![]' => 2,
+ 'and' => 3,
+ 'or' => 4,
+ );
+
+ for ( $i = 0; $i < count($terms); $i++ ) {
+ $term = $terms[$i];
+ if ( !empty($term['cnj']) ) {
+ while( true ) {
+ if ( !count($postfixStack) ) {
+ $postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
+ break;
+ } elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
+ $postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
+ break;
+ } elseif ( $priorities[$term['cnj']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
+ $postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
+ break;
+ } else {
+ $postfixExpr[] = array_pop($postfixStack);
+ }
+ }
+ } # end if ! empty cnj
+
+ if ( !empty($term['obr']) ) {
+ for ( $j = 0; $j < $term['obr']; $j++ ) {
+ $postfixStack[] = array('type'=>'obr', 'value'=>$term['obr']);
+ }
+ }
+ if ( !empty($term['attr']) ) {
+ $dtAttr = false;
+ switch ( $term['attr']) {
+ case 'MonitorName':
+ $sqlValue = 'M.'.preg_replace( '/^Monitor/', '', $term['attr']);
+ break;
+ case 'ServerId':
+ $sqlValue .= 'M.ServerId';
+ break;
+ case 'StorageServerId':
+ $sqlValue .= 'S.ServerId';
+ break;
+ case 'FilterServerId':
+ $sqlValue .= ZM_SERVER_ID;
+ break;
+ case 'DateTime':
+ case 'StartDateTime':
+ $sqlValue = 'E.StartTime';
+ $dtAttr = true;
+ break;
+ case 'Date':
+ case 'StartDate':
+ $sqlValue = 'to_days(E.StartTime)';
+ $dtAttr = true;
+ break;
+ case 'Time':
+ case 'StartTime':
+ $sqlValue = 'extract(hour_second from E.StartTime)';
+ break;
+ case 'Weekday':
+ case 'StartWeekday':
+ $sqlValue = 'weekday(E.StartTime)';
+ break;
+ case 'EndDateTime':
+ $sqlValue = 'E.EndTime';
+ $dtAttr = true;
+ break;
+ case 'EndDate':
+ $sqlValue = 'to_days(E.EndTime)';
+ $dtAttr = true;
+ break;
+ case 'EndTime':
+ $sqlValue = 'extract(hour_second from E.EndTime)';
+ break;
+ case 'EndWeekday':
+ $sqlValue = 'weekday(E.EndTime)';
+ break;
+ case 'Id':
+ case 'Name':
+ case 'MonitorId':
+ case 'StorageId':
+ case 'SecondaryStorageId':
+ case 'Length':
+ case 'Frames':
+ case 'AlarmFrames':
+ case 'TotScore':
+ case 'AvgScore':
+ case 'MaxScore':
+ case 'Cause':
+ case 'Notes':
+ case 'StateId':
+ case 'Archived':
+ $sqlValue = 'E.'.$term['attr'];
+ break;
+ case 'DiskPercent':
+ // Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
+ if ( ! $StorageArea ) {
+ for ( $j = 0; $j < count($terms); $j++ ) {
+ if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
+ $StorageArea = new Storage($terms[$j]['val']);
+ break;
+ }
+ } // end foreach remaining term
+ if ( ! $StorageArea ) $StorageArea = new Storage();
+ } // end no StorageArea found yet
+ $sqlValue = getDiskPercent($StorageArea);
+ break;
+ case 'DiskBlocks':
+ // Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
+ if ( ! $StorageArea ) {
+ for ( $j = 0; $j < count($terms); $j++ ) {
+ if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
+ $StorageArea = new Storage($terms[$j]['val']);
+ break;
+ }
+ } // end foreach remaining term
+ if ( ! $StorageArea ) $StorageArea = new Storage();
+ } // end no StorageArea found yet
+ $sqlValue = getDiskBlocks($StorageArea);
+ break;
+ default :
+ $sqlValue = $term['attr'];
+ break;
+ }
+ if ( $dtAttr ) {
+ $postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue, 'dtAttr'=>true);
+ } else {
+ $postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue);
+ }
+ } # end if attr
+
+ if ( isset($term['op']) ) {
+ if ( empty($term['op']) ) {
+ $term['op'] = '=';
+ }
+ switch ( $term['op']) {
+ case '=' :
+ case '!=' :
+ case '>=' :
+ case '>' :
+ case '<' :
+ case '<=' :
+ case 'LIKE' :
+ case 'NOT LIKE':
+ $sqlValue = $term['op'];
+ break;
+ case '=~' :
+ $sqlValue = 'regexp';
+ break;
+ case '!~' :
+ $sqlValue = 'not regexp';
+ break;
+ case '=[]' :
+ case 'IN' :
+ $sqlValue = 'in (';
+ break;
+ case '![]' :
+ $sqlValue = 'not in (';
+ break;
+ case 'IS' :
+ case 'IS NOT' :
+ if ( $term['val'] == 'Odd' ) {
+ $sqlValue .= ' % 2 = 1';
+ } else if ( $term['val'] == 'Even' ) {
+ $sqlValue .= ' % 2 = 0';
+ } else {
+ $sqlValue .= ' '.$term['op'];
+ }
+ break;
+ default :
+ ZM\Error('Unknown operator in filter '.$term['op']);
+ }
+
+ while( true ) {
+ if ( !count($postfixStack) ) {
+ $postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
+ break;
+ } elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
+ $postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
+ break;
+ } elseif ( $priorities[$term['op']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
+ $postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue );
+ break;
+ } else {
+ $postfixExpr[] = array_pop($postfixStack);
+ }
+ } // end while
+ } // end if operator
+
+ if ( isset($term['val']) ) {
+ $valueList = array();
+ foreach ( preg_split('/["\'\s]*?,["\'\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $term['val'])) as $value ) {
+ switch ( $term['attr'] ) {
+ case 'MonitorName':
+ case 'Name':
+ case 'Cause':
+ case 'Notes':
+ if ( $term['op'] == 'LIKE' || $term['op'] == 'NOT LIKE' ) {
+ $value = '%'.$value.'%';
+ }
+ $value = dbEscape($value);
+ break;
+ case 'MonitorServerId':
+ case 'FilterServerId':
+ case 'StorageServerId':
+ case 'ServerId':
+ if ( $value == 'ZM_SERVER_ID' ) {
+ $value = ZM_SERVER_ID;
+ } else if ( $value == 'NULL' ) {
+
+ } else {
+ $value = dbEscape($value);
+ }
+ break;
+ case 'StorageId':
+ $StorageArea = new Storage($value);
+ if ( $value != 'NULL' )
+ $value = dbEscape($value);
+ break;
+ case 'DateTime':
+ case 'EndDateTime':
+ case 'StartDateTime':
+ $value = "'".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."'";
+ break;
+ case 'Date':
+ case 'EndDate':
+ case 'StartDate':
+ $value = 'to_days(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
+ break;
+ case 'Time':
+ case 'EndTime':
+ case 'StartTime':
+ $value = 'extract(hour_second from \''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
+ break;
+ case 'Weekday':
+ case 'EndWeekday':
+ case 'StartWeekday':
+ $value = 'weekday(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
+ break;
+ default :
+ if ( $value != 'NULL' )
+ $value = dbEscape($value);
+ } // end switch attribute
+ $valueList[] = $value;
+ } // end foreach value
+ $postfixExpr[] = array('type'=>'val', 'value'=>$term['val'], 'sqlValue'=>join(',', $valueList));
+ } // end if has val
+
+ if ( !empty($term['cbr']) ) {
+ for ( $j = 0; $j < $term['cbr']; $j++ ) {
+ while ( count($postfixStack) ) {
+ $element = array_pop($postfixStack);
+ if ( $element['type'] == 'obr' ) {
+ $postfixExpr[count($postfixExpr)-1]['bracket'] = true;
+ break;
+ }
+ $postfixExpr[] = $element;
+ }
+ }
+ } #end if cbr
+ } # end foreach term
+
+ while ( count($postfixStack) ) {
+ $postfixExpr[] = array_pop($postfixStack);
+ }
+
+ $exprStack = array();
+ foreach ( $postfixExpr as $element ) {
+ if ( $element['type'] == 'attr' || $element['type'] == 'val' ) {
+ $node = array('data'=>$element, 'count'=>0);
+ $exprStack[] = $node;
+ } elseif ( $element['type'] == 'op' || $element['type'] == 'cnj' ) {
+ $right = array_pop($exprStack);
+ $left = array_pop($exprStack);
+ $node = array('data'=>$element, 'count'=>2+$left['count']+$right['count'], 'right'=>$right, 'left'=>$left);
+ $exprStack[] = $node;
+ } else {
+ ZM\Fatal('Unexpected element type \''.$element['type'].'\', value \''.$element['value'].'\'');
+ }
+ }
+ if ( count($exprStack) != 1 ) {
+ ZM\Fatal('Expression stack has '.count($exprStack).' elements');
+ }
+ return array_pop($exprStack);
+ } # end function tree
} # end class Filter
diff --git a/web/includes/functions.php b/web/includes/functions.php
index bc57fce50..d6aa7492c 100644
--- a/web/includes/functions.php
+++ b/web/includes/functions.php
@@ -1109,7 +1109,7 @@ function parseFilter(&$filter, $saveToSession=false, $querySep='&') {
$Filter = ZM\Filter::parse($filter, $querySep);
$filter['sql'] = $Filter->sql();
- $filter['querystring'] = $Filter->querystring();
+ $filter['querystring'] = $Filter->querystring($querySep);
$filter['hidden_fields'] = $Filter->hidden_fields();
$filter['pre_sql_conditions'] = $Filter->pre_sql_conditions();
$filter['post_sql_conditions'] = $Filter->post_sql_conditions();
diff --git a/web/skins/classic/css/base/views/newlog.css b/web/skins/classic/css/base/views/newlog.css
new file mode 100644
index 000000000..b56fcb42a
--- /dev/null
+++ b/web/skins/classic/css/base/views/newlog.css
@@ -0,0 +1,52 @@
+#logSummary {
+ font-size:10px;
+}
+
+#logSummary tr {
+ margin: 0;
+ padding: 0;
+}
+
+#logSummary td {
+ border: 1px solid #7f7fb2;
+ padding: 0 6px;
+ font-size: 10px;
+ line-height: 15px;
+}
+
+tr.log-fat td {
+ background-color:#ffcccc;
+ font-weight: bold;
+}
+
+tr.bg-danger,
+tr.log-err td {
+ background-color:#ffcccc !important;
+}
+
+tr.log-war td {
+ background-color: #ffe4b5;
+}
+
+tr.log-dbg td {
+ color: #666666;
+ font-style: italic;
+}
+
+#exportLog label {
+ vertical-align: middle;
+}
+
+#exportLog input[type=radio] {
+ margin-right: 4px;
+ vertical-align: middle;
+}
+
+#exportError {
+ display: none;
+ color: #dc143c;
+ margin-bottom: 8px;
+}
+
+#exportErrorText {
+}
diff --git a/web/skins/classic/includes/timeline_functions.php b/web/skins/classic/includes/timeline_functions.php
index 1c0995df4..c81f150d2 100644
--- a/web/skins/classic/includes/timeline_functions.php
+++ b/web/skins/classic/includes/timeline_functions.php
@@ -43,316 +43,6 @@ function getSlotFrame($slot) {
return $slotFrame;
}
-function parseFilterToTree($filter) {
- if ( count($filter['terms']) <= 0 ) {
- return false;
- }
- $terms = $filter['terms'];
-
- $StorageArea = NULL;
-
- $postfixExpr = array();
- $postfixStack = array();
-
- $priorities = array(
- '<' => 1,
- '<=' => 1,
- '>' => 1,
- '>=' => 1,
- '=' => 2,
- '!=' => 2,
- '=~' => 2,
- '!~' => 2,
- '=[]' => 2,
- '![]' => 2,
- 'and' => 3,
- 'or' => 4,
- );
-
- for ( $i = 0; $i < count($terms); $i++ ) {
- $term = $terms[$i];
- if ( !empty($term['cnj']) ) {
- while( true ) {
- if ( !count($postfixStack) ) {
- $postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
- break;
- } elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
- $postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
- break;
- } elseif ( $priorities[$term['cnj']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
- $postfixStack[] = array('type'=>'cnj', 'value'=>$term['cnj'], 'sqlValue'=>$term['cnj']);
- break;
- } else {
- $postfixExpr[] = array_pop($postfixStack);
- }
- }
- } # end if ! empty cnj
-
- if ( !empty($term['obr']) ) {
- for ( $j = 0; $j < $term['obr']; $j++ ) {
- $postfixStack[] = array('type'=>'obr', 'value'=>$term['obr']);
- }
- }
- if ( !empty($term['attr']) ) {
- $dtAttr = false;
- switch ( $term['attr']) {
- case 'MonitorName':
- $sqlValue = 'M.'.preg_replace( '/^Monitor/', '', $term['attr']);
- break;
- case 'ServerId':
- $sqlValue .= 'M.ServerId';
- break;
- case 'StorageServerId':
- $sqlValue .= 'S.ServerId';
- break;
- case 'FilterServerId':
- $sqlValue .= ZM_SERVER_ID;
- break;
- case 'DateTime':
- case 'StartDateTime':
- $sqlValue = 'E.StartTime';
- $dtAttr = true;
- break;
- case 'Date':
- case 'StartDate':
- $sqlValue = 'to_days(E.StartTime)';
- $dtAttr = true;
- break;
- case 'Time':
- case 'StartTime':
- $sqlValue = 'extract(hour_second from E.StartTime)';
- break;
- case 'Weekday':
- case 'StartWeekday':
- $sqlValue = 'weekday(E.StartTime)';
- break;
- case 'EndDateTime':
- $sqlValue = 'E.EndTime';
- $dtAttr = true;
- break;
- case 'EndDate':
- $sqlValue = 'to_days(E.EndTime)';
- $dtAttr = true;
- break;
- case 'EndTime':
- $sqlValue = 'extract(hour_second from E.EndTime)';
- break;
- case 'EndWeekday':
- $sqlValue = 'weekday(E.EndTime)';
- break;
- case 'Id':
- case 'Name':
- case 'MonitorId':
- case 'StorageId':
- case 'SecondaryStorageId':
- case 'Length':
- case 'Frames':
- case 'AlarmFrames':
- case 'TotScore':
- case 'AvgScore':
- case 'MaxScore':
- case 'Cause':
- case 'Notes':
- case 'StateId':
- case 'Archived':
- $sqlValue = 'E.'.$term['attr'];
- break;
- case 'DiskPercent':
- // Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
- if ( ! $StorageArea ) {
- for ( $j = 0; $j < count($terms); $j++ ) {
- if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
- $StorageArea = new Storage($terms[$j]['val']);
- break;
- }
- } // end foreach remaining term
- if ( ! $StorageArea ) $StorageArea = new Storage();
- } // end no StorageArea found yet
- $sqlValue = getDiskPercent($StorageArea);
- break;
- case 'DiskBlocks':
- // Need to specify a storage area, so need to look through other terms looking for a storage area, else we default to ZM_EVENTS_PATH
- if ( ! $StorageArea ) {
- for ( $j = 0; $j < count($terms); $j++ ) {
- if ( isset($terms[$j]['attr']) and $terms[$j]['attr'] == 'StorageId' and isset($terms[$j]['val']) ) {
- $StorageArea = new Storage($terms[$j]['val']);
- break;
- }
- } // end foreach remaining term
- if ( ! $StorageArea ) $StorageArea = new Storage();
- } // end no StorageArea found yet
- $sqlValue = getDiskBlocks($StorageArea);
- break;
- default :
- $sqlValue = $term['attr'];
- break;
- }
- if ( $dtAttr ) {
- $postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue, 'dtAttr'=>true);
- } else {
- $postfixExpr[] = array('type'=>'attr', 'value'=>$term['attr'], 'sqlValue'=>$sqlValue);
- }
- } # end if attr
-
- if ( isset($term['op']) ) {
- if ( empty($term['op']) ) {
- $term['op'] = '=';
- }
- switch ( $term['op']) {
- case '=' :
- case '!=' :
- case '>=' :
- case '>' :
- case '<' :
- case '<=' :
- case 'LIKE' :
- case 'NOT LIKE':
- $sqlValue = $term['op'];
- break;
- case '=~' :
- $sqlValue = 'regexp';
- break;
- case '!~' :
- $sqlValue = 'not regexp';
- break;
- case '=[]' :
- case 'IN' :
- $sqlValue = 'in (';
- break;
- case '![]' :
- $sqlValue = 'not in (';
- break;
- case 'IS' :
- case 'IS NOT' :
- if ( $term['val'] == 'Odd' ) {
- $sqlValue .= ' % 2 = 1';
- } else if ( $term['val'] == 'Even' ) {
- $sqlValue .= ' % 2 = 0';
- } else {
- $sqlValue .= ' '.$term['op'];
- }
- break;
- default :
- ZM\Error('Unknown operator in filter '.$term['op']);
- }
- while( true ) {
- if ( !count($postfixStack) ) {
- $postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
- break;
- } elseif ( $postfixStack[count($postfixStack)-1]['type'] == 'obr' ) {
- $postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue);
- break;
- } elseif ( $priorities[$term['op']] < $priorities[$postfixStack[count($postfixStack)-1]['value']] ) {
- $postfixStack[] = array('type'=>'op', 'value'=>$term['op'], 'sqlValue'=>$sqlValue );
- break;
- } else {
- $postfixExpr[] = array_pop($postfixStack);
- }
- } // end while
- } // end if operator
-
- if ( isset($term['val']) ) {
- $valueList = array();
- foreach ( preg_split('/["\'\s]*?,["\'\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $term['val'])) as $value ) {
- switch ( $term['attr'] ) {
- case 'MonitorName':
- case 'Name':
- case 'Cause':
- case 'Notes':
- if ( $term['op'] == 'LIKE' || $term['op'] == 'NOT LIKE' ) {
- $value = '%'.$value.'%';
- }
- $value = dbEscape($value);
- break;
- case 'MonitorServerId':
- case 'FilterServerId':
- case 'StorageServerId':
- case 'ServerId':
- if ( $value == 'ZM_SERVER_ID' ) {
- $value = ZM_SERVER_ID;
- } else if ( $value == 'NULL' ) {
-
- } else {
- $value = dbEscape($value);
- }
- break;
- case 'StorageId':
- $StorageArea = new Storage($value);
- if ( $value != 'NULL' )
- $value = dbEscape($value);
- break;
- case 'DateTime':
- case 'EndDateTime':
- case 'StartDateTime':
- $value = "'".strftime(STRF_FMT_DATETIME_DB, strtotime($value))."'";
- break;
- case 'Date':
- case 'EndDate':
- case 'StartDate':
- $value = 'to_days(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
- break;
- case 'Time':
- case 'EndTime':
- case 'StartTime':
- $value = 'extract(hour_second from \''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
- break;
- case 'Weekday':
- case 'EndWeekday':
- case 'StartWeekday':
- $value = 'weekday(\''.strftime(STRF_FMT_DATETIME_DB, strtotime($value)).'\')';
- break;
- default :
- if ( $value != 'NULL' )
- $value = dbEscape($value);
- } // end switch attribute
- $valueList[] = $value;
- } // end foreach value
- $postfixExpr[] = array('type'=>'val', 'value'=>$term['val'], 'sqlValue'=>join(',', $valueList));
- } // end if has val
-
- if ( !empty($term['cbr']) ) {
- for ( $j = 0; $j < $term['cbr']; $j++ ) {
- while ( count($postfixStack) ) {
- $element = array_pop($postfixStack);
- if ( $element['type'] == 'obr' ) {
- $postfixExpr[count($postfixExpr)-1]['bracket'] = true;
- break;
- }
- $postfixExpr[] = $element;
- }
- }
- } #end if cbr
- } # end foreach term
-
- while ( count($postfixStack) ) {
- $postfixExpr[] = array_pop($postfixStack);
- }
-
- $exprStack = array();
- //foreach ( $postfixExpr as $element )
- //{
- //echo $element['value'].' ';
- //}
- //echo "
";
- foreach ( $postfixExpr as $element ) {
- if ( $element['type'] == 'attr' || $element['type'] == 'val' ) {
- $node = array('data'=>$element, 'count'=>0);
- $exprStack[] = $node;
- } elseif ( $element['type'] == 'op' || $element['type'] == 'cnj' ) {
- $right = array_pop($exprStack);
- $left = array_pop($exprStack);
- $node = array('data'=>$element, 'count'=>2+$left['count']+$right['count'], 'right'=>$right, 'left'=>$left);
- $exprStack[] = $node;
- } else {
- ZM\Fatal('Unexpected element type \''.$element['type'].'\', value \''.$element['value'].'\'');
- }
- }
- if ( count($exprStack) != 1 ) {
- ZM\Fatal('Expression stack has '.count($exprStack).' elements');
- }
- return array_pop($exprStack);
-}
-
function _parseTreeToInfix($node) {
$expression = '';
if ( isset($node) ) {
@@ -443,7 +133,7 @@ function parseTreeToFilter($tree) {
function parseTreeToQuery($tree) {
$filter = parseTreeToFilter($tree);
parseFilter($filter, false, '&');
- return $filter['query'];
+ return $filter['querystring'];
}
function _drawTree($node, $level) {
diff --git a/web/skins/classic/js/skin.js b/web/skins/classic/js/skin.js
index 8308c71d9..15f58fd20 100644
--- a/web/skins/classic/js/skin.js
+++ b/web/skins/classic/js/skin.js
@@ -23,6 +23,22 @@
//
var popupOptions = "resizable,scrollbars,status=no,toolbar=yes";
+// Globally define the icons used in the bootstrap-table top-right toolbar
+var icons = {
+ paginationSwitchDown: 'fa-caret-square-o-down',
+ paginationSwitchUp: 'fa-caret-square-o-up',
+ export: 'fa-download',
+ refresh: 'fa-retweet',
+ autoRefresh: 'fa-clock-o',
+ advancedSearchIcon: 'fa-chevron-down',
+ toggleOff: 'fa-toggle-off',
+ toggleOn: 'fa-toggle-on',
+ columns: 'fa-th-list',
+ fullscreen: 'fa-arrows-alt',
+ detailOpen: 'fa-plus',
+ detailClose: 'fa-minus'
+};
+
function checkSize() {
if ( 0 ) {
if (window.outerHeight) {
diff --git a/web/skins/classic/views/js/events.js b/web/skins/classic/views/js/events.js
index 5a475290c..9334927f0 100644
--- a/web/skins/classic/views/js/events.js
+++ b/web/skins/classic/views/js/events.js
@@ -106,20 +106,6 @@ function initPage() {
// Load the delete confirmation modal into the DOM
getDelConfirmModal();
- // Define the icons used in the bootstrap-table top-right toolbar
- var icons = {
- paginationSwitchDown: 'fa-caret-square-o-down',
- paginationSwitchUp: 'fa-caret-square-o-up',
- export: 'fa-download',
- refresh: 'fa-sync',
- toggleOff: 'fa-toggle-off',
- toggleOn: 'fa-toggle-on',
- columns: 'fa-th-list',
- fullscreen: 'fa-arrows-alt',
- detailOpen: 'fa-plus',
- detailClose: 'fa-minus'
- };
-
// Init the bootstrap-table
table.bootstrapTable({icons: icons});
diff --git a/web/skins/classic/views/js/frames.js b/web/skins/classic/views/js/frames.js
index 8cefb3426..57bf8e4b0 100644
--- a/web/skins/classic/views/js/frames.js
+++ b/web/skins/classic/views/js/frames.js
@@ -38,20 +38,6 @@ function initPage() {
var backBtn = $j('#backBtn');
var table = $j('#framesTable');
- // Define the icons used in the bootstrap-table top-right toolbar
- var icons = {
- paginationSwitchDown: 'fa-caret-square-o-down',
- paginationSwitchUp: 'fa-caret-square-o-up',
- export: 'fa-download',
- refresh: 'fa-sync',
- toggleOff: 'fa-toggle-off',
- toggleOn: 'fa-toggle-on',
- columns: 'fa-th-list',
- fullscreen: 'fa-arrows-alt',
- detailOpen: 'fa-plus',
- detailClose: 'fa-minus'
- };
-
// Init the bootstrap-table
table.bootstrapTable({icons: icons});
diff --git a/web/skins/classic/views/js/newlog.js b/web/skins/classic/views/js/newlog.js
index dcf7a2d4b..d1e36d5dd 100644
--- a/web/skins/classic/views/js/newlog.js
+++ b/web/skins/classic/views/js/newlog.js
@@ -13,6 +13,11 @@ var params =
"order":"asc",
"offset":0,
"limit":25
+ "filter":
+ {
+ "message":"some advanced search text"
+ "level":"some more advanced search text"
+ }
},
"cache":true,
"contentType":"application/json",
@@ -23,14 +28,11 @@ var params =
// Called by bootstrap-table to retrieve zm log data
function ajaxRequest(params) {
$j.getJSON(thisUrl + '?view=request&request=newlog&task=query', params.data)
- .done(function(res) {
- //console.log('total: ' + res.total);
- //console.log('totalNotFiltered: ' + res.totalNotFiltered);
- console.log(JSON.stringify(params));
+ .done(function(data) {
+ //console.log('Ajax parameters: ' + JSON.stringify(params));
// rearrange the result into what bootstrap-table expects
- var data = {total: res.total, totalNotFiltered: res.totalNotFiltered, rows: res.rows};
- params.success(data);
- updateHeaderStats(res);
+ params.success({total: data.total, totalNotFiltered: data.totalNotFiltered, rows: data.rows});
+ updateHeaderStats(data);
})
.fail(logAjaxFail);
}
@@ -57,22 +59,6 @@ function updateHeaderStats(data) {
function initPage() {
var backBtn = $j('#backBtn');
- // Define the icons used in the bootstrap-table top-right toolbar
- var icons = {
- paginationSwitchDown: 'fa-caret-square-o-down',
- paginationSwitchUp: 'fa-caret-square-o-up',
- export: 'fa-download',
- refresh: 'fa-refresh',
- autoRefresh: 'fa-clock-o',
- advancedSearchIcon: 'fa-chevron-down',
- toggleOff: 'fa-toggle-off',
- toggleOn: 'fa-toggle-on',
- columns: 'fa-th-list',
- fullscreen: 'fa-arrows-alt',
- detailOpen: 'fa-plus',
- detailClose: 'fa-minus'
- };
-
// Init the bootstrap-table with custom icons
table.bootstrapTable({icons: icons});
@@ -91,6 +77,7 @@ function initPage() {
row.addClass('bg-warning');
} else if ( level == 'DBG' ) {
row.addClass('bg-info');
+ row.addClass('font-italic');
}
});
});
diff --git a/web/skins/classic/views/newlog.php b/web/skins/classic/views/newlog.php
index ee3e8a01f..d706365c3 100644
--- a/web/skins/classic/views/newlog.php
+++ b/web/skins/classic/views/newlog.php
@@ -29,10 +29,6 @@ xhtmlHeaders(__FILE__, translate('SystemLog'));