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'));
-
-

UNDER CONSTRUTION - This view is not yet fully functional

-
-
 -   -  @@ -71,7 +67,7 @@ xhtmlHeaders(__FILE__, translate('SystemLog')); data-auto-refresh="true" data-auto-refresh-silent="true" data-show-refresh="true" - data-auto-refresh-interval="2" + data-auto-refresh-interval="5" > diff --git a/web/skins/classic/views/timeline.php b/web/skins/classic/views/timeline.php index 98361907c..d0d17d721 100644 --- a/web/skins/classic/views/timeline.php +++ b/web/skins/classic/views/timeline.php @@ -142,8 +142,11 @@ if ( !empty($user['MonitorIds']) ) { } $tree = false; -if ( isset($_REQUEST['filter']) ) - $tree = parseFilterToTree($_REQUEST['filter']['Query']); +if ( isset($_REQUEST['filter']) ) { + $filter = ZM\Filter::parse($_REQUEST['filter']); + $tree = $filter->tree(); + ZM\Warning("Parse tree: " . print_r($tree,true)); +} if ( isset($_REQUEST['range']) ) $range = validHtmlStr($_REQUEST['range']);