From e39a95d7618efa1f6147397f746412f94e590a79 Mon Sep 17 00:00:00 2001 From: Isaac Connor Date: Wed, 18 Dec 2019 19:06:10 -0500 Subject: [PATCH] Add AlarmedZoned to filters, work on fixing filter behaviour in js. Enable viewing filter results in montagereview --- web/includes/functions.php | 13 +++++- web/index.php | 4 +- web/lang/en_gb.php | 1 + web/skins/classic/views/filter.php | 38 ++++++++++++---- web/skins/classic/views/js/filter.js | 55 ++++++++++++++++------- web/skins/classic/views/js/filter.js.php | 1 + web/skins/classic/views/js/montage.js | 1 + web/skins/classic/views/montagereview.php | 11 +++++ 8 files changed, 97 insertions(+), 27 deletions(-) diff --git a/web/includes/functions.php b/web/includes/functions.php index aea0c8b14..ca2dd6a05 100644 --- a/web/includes/functions.php +++ b/web/includes/functions.php @@ -1094,6 +1094,7 @@ function parseFilter(&$filter, $saveToSession=false, $querySep='&') { for ( $i = 0; $i < count($terms); $i++ ) { $term = $terms[$i]; +ZM\Logger::Debug("Term: " . print_r($term,true)); if ( isset($term['cnj']) && array_key_exists($term['cnj'], $validQueryConjunctionTypes) ) { $filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][cnj]").'='.urlencode($term['cnj']); @@ -1109,6 +1110,12 @@ function parseFilter(&$filter, $saveToSession=false, $querySep='&') { $filter['query'] .= $querySep.urlencode("filter[Query][terms][$i][attr]").'='.urlencode($term['attr']); $filter['fields'] .= "\n"; switch ( $term['attr'] ) { + case 'AlarmedZoneId': + if ( $term['op'] != 'IN' ) { + ZM\Warning("AlarmedZoneId only supports the IN operator"); + } + $filter['sql'] .= $term['val']; + break; case 'MonitorName': $filter['sql'] .= 'M.Name'; break; @@ -1226,11 +1233,15 @@ function parseFilter(&$filter, $saveToSession=false, $querySep='&') { $valueList = array(); foreach ( preg_split('/["\'\s]*?,["\'\s]*?/', preg_replace('/^["\']+?(.+)["\']+?$/', '$1', $term['val'])) as $value ) { switch ( $term['attr'] ) { + + case 'AlarmedZoneId': + $value = '(SELECT DISTINCT ZoneId FROM Stats WHERE EventId=E.Id)'; + break; case 'MonitorName': case 'Name': case 'Cause': case 'Notes': - if($term['op'] == 'LIKE' || $term['op'] == 'NOT LIKE') { + if ( $term['op'] == 'LIKE' || $term['op'] == 'NOT LIKE' ) { $value = '%'.$value.'%'; } $value = dbEscape($value); diff --git a/web/index.php b/web/index.php index 83be992e8..270c23b86 100644 --- a/web/index.php +++ b/web/index.php @@ -34,7 +34,7 @@ if ( version_compare(phpversion(), '4.1.0', '<') ) { } // Useful debugging lines for mobile devices -if ( false ) { +if ( true ) { ob_start(); phpinfo(INFO_VARIABLES); $fp = fopen('/tmp/env.html', 'w+'); @@ -71,7 +71,7 @@ define('ZM_BASE_URL', ''); require_once('includes/functions.php'); if ( $_SERVER['REQUEST_METHOD'] == 'OPTIONS' ) { - ZM\Logger::Debug("OPTIONS Method, only doing CORS"); + ZM\Logger::Debug('OPTIONS Method, only doing CORS'); # Add Cross domain access headers CORSHeaders(); return; diff --git a/web/lang/en_gb.php b/web/lang/en_gb.php index a6f2fa488..fecc57490 100644 --- a/web/lang/en_gb.php +++ b/web/lang/en_gb.php @@ -116,6 +116,7 @@ $SLANG = array( 'Area' => 'Area', 'AreaUnits' => 'Area (px/%)', 'AttrAlarmFrames' => 'Alarm Frames', + 'AttrAlarmedZone' => 'Alarmed Zone', 'AttrArchiveStatus' => 'Archive Status', 'AttrAvgScore' => 'Avg. Score', 'AttrCause' => 'Cause', diff --git a/web/skins/classic/views/filter.php b/web/skins/classic/views/filter.php index 425e914c9..be388fe0e 100644 --- a/web/skins/classic/views/filter.php +++ b/web/skins/classic/views/filter.php @@ -1,6 +1,6 @@ translate('ChooseFilter')); @@ -69,6 +71,7 @@ if ( count($terms) ) { $attrTypes = array( 'AlarmFrames' => translate('AttrAlarmFrames'), + 'AlarmedZoneId' => translate('AttrAlarmedZone'), 'Archived' => translate('AttrArchiveStatus'), 'AvgScore' => translate('AttrAvgScore'), 'Cause' => translate('AttrCause'), @@ -78,17 +81,17 @@ $attrTypes = array( 'EndDateTime' => translate('AttrEndDateTime'), 'EndDate' => translate('AttrEndDate'), 'EndTime' => translate('AttrEndTime'), + 'EndWeekday' => translate('AttrEndWeekday'), 'FilterServerId' => translate('AttrFilterServer'), 'Frames' => translate('AttrFrames'), - 'EndWeekday' => translate('AttrEndWeekday'), 'Id' => translate('AttrId'), 'Length' => translate('AttrDuration'), - 'Name' => translate('AttrName'), - 'Notes' => translate('AttrNotes'), 'MaxScore' => translate('AttrMaxScore'), 'MonitorId' => translate('AttrMonitorId'), 'MonitorName' => translate('AttrMonitorName'), 'MonitorServerId' => translate('AttrMonitorServer'), + 'Name' => translate('AttrName'), + 'Notes' => translate('AttrNotes'), 'SecondaryStorageId' => translate('AttrSecondaryStorageArea'), 'ServerId' => translate('AttrMonitorServer'), 'StartDateTime' => translate('AttrStartDateTime'), @@ -143,13 +146,22 @@ foreach ( dbFetchAll('SELECT `Id`, `Name` FROM `Servers` ORDER BY lower(`Name`) $servers[$server['Id']] = validHtmlStr($server['Name']); } $monitors = array(); +$monitor_names = array(); foreach ( dbFetchAll('SELECT `Id`, `Name` FROM `Monitors` ORDER BY lower(`Name`) ASC') as $monitor ) { if ( visibleMonitor($monitor['Id']) ) { - $monitors[$monitor['Name']] = validHtmlStr($monitor['Name']); + $monitors[$monitor['Id']] = new ZM\Monitor($monitor); + $monitor_names[] = validHtmlStr($monitor['Name']); + } +} +$zones = array(); +foreach ( dbFetchAll('SELECT Id, Name, MonitorId FROM Zones ORDER BY lower(`Name`) ASC') as $zone ) { + if ( visibleMonitor($zone['MonitorId']) ) { + $zone['Name'] = validHtmlStr($monitors[$zone['MonitorId']]->Name().': '.$zone['Name']); + $zones[$zone['Id']] = new ZM\Zone($zone); } } -xhtmlHeaders(__FILE__, translate('EventFilter') ); +xhtmlHeaders(__FILE__, translate('EventFilter')); ?>
@@ -259,10 +271,15 @@ for ( $i=0; $i < count($terms); $i++ ) { + + + @@ -273,6 +290,11 @@ for ( $i=0; $i < count($terms); $i++ ) { ?> + + + @@ -409,7 +431,7 @@ if ( ZM_OPT_MESSAGE ) {
- + 0) { //add bracket select to all rows + if ( brackets > 0 ) { //add bracket select to all rows var obrSelect = $j('').attr('name', queryPrefix + rowNum + '][obr]').attr('id', queryPrefix + rowNum + '][obr]'); var cbrSelect = $j('').attr('name', queryPrefix + rowNum + '][cbr]').attr('id', queryPrefix + rowNum + '][cbr]'); obrSelect.append(''); cbrSelect.append(''); } @@ -176,7 +178,7 @@ function parseRows(rows) { inputTds.eq(5).html(' '); } - if (rows.length == 1) { + if ( rows.length == 1 ) { inputTds.eq(6).find(':input[value="-"]').prop('disabled', true); //enable/disable remove row button } else { inputTds.eq(6).find(':input[value="-"]').prop('disabled', false); @@ -184,7 +186,7 @@ function parseRows(rows) { var attr = inputTds.eq(2).children().val(); - if ( attr == "Archived") { //Archived types + if ( attr == 'Archived' ) { //Archived types inputTds.eq(3).html('equal to'); var archiveSelect = $j('').attr('name', queryPrefix + rowNum + '][val]').attr('id', queryPrefix + rowNum + '][val]'); for (var i = 0; i < archiveTypes.length; i++) { @@ -192,6 +194,18 @@ function parseRows(rows) { } var archiveVal = inputTds.eq(4).children().val(); inputTds.eq(4).html(archiveSelect).children().val(archiveVal).chosen({width: "101%"}); + } else if ( attr == 'AlarmedZoneId' ) { + var zoneSelect = $j('').attr('name', queryPrefix + rowNum + '][val]').attr('id', queryPrefix + rowNum + '][val]'); + for ( monitor_id in monitors ) { + for ( zone_id in zones ) { + var zone = zones[zone_id]; + if ( monitor_id == zone.MonitorId ) { + zoneSelect.append(''); + } + } // end foreach zone + } // end foreach monitor + var zoneVal = inputTds.eq(4).children().val(); + inputTds.eq(4).html(zoneSelect).children().val(zoneVal).chosen({width: "101%"}); } else if ( attr.indexOf('Weekday') >= 0 ) { //Weekday selection var weekdaySelect = $j('').attr('name', queryPrefix + rowNum + '][val]').attr('id', queryPrefix + rowNum + '][val]'); for (var i = 0; i < weekdays.length; i++) { @@ -222,18 +236,27 @@ function parseRows(rows) { inputTds.eq(4).html(storageSelect).children().val(storageVal).chosen({width: "101%"}); } else if ( attr == 'MonitorName' ) { //Monitor names var monitorSelect = $j('').attr('name', queryPrefix + rowNum + '][val]').attr('id', queryPrefix + rowNum + '][val]'); - for (var key in monitors) { - monitorSelect.append(''); + for ( var monitor_id in monitors ) { + monitorSelect.append(''); } var monitorVal = inputTds.eq(4).children().val(); inputTds.eq(4).html(monitorSelect).children().val(monitorVal); - } else { //Reset to regular text field and operator for everything that isn't special + } else { // Reset to regular text field and operator for everything that isn't special +if ( 0 ) { + // We don't actually do anything different in terms of operators. So why do it for text? var opSelect = $j('').attr('name', queryPrefix + rowNum + '][op]').attr('id', queryPrefix + rowNum + '][op]'); - for (var key in opTypes) { - opSelect.append(''); - } var opVal = inputTds.eq(3).children().val(); - inputTds.eq(3).html(opSelect).children().val(opVal).chosen({width: "101%"}); + if ( ! opVal ) { + // Default to equals so that something gets selected + console.log("No value for operator. Defaulting to ="); + opVal = '='; + } + for ( var key in opTypes ) { + opSelect.append(''); + } + inputTds.eq(3).html(opSelect).children().val(opVal).chosen({width: "101%"}); +} + var textInput = $j('').attr('type', 'text').attr('name', queryPrefix + rowNum + '][val]').attr('id', queryPrefix + rowNum + '][val]'); var textVal = inputTds.eq(4).children().val(); inputTds.eq(4).html(textInput).children().val(textVal); @@ -253,7 +276,7 @@ function parseRows(rows) { term[2] = rowNum; inputTds.eq(2).children().eq(0).attr('name', 'filter'+stringFilter(term)); inputTds.eq(2).children().eq(0).attr('id', 'filter'+stringFilter(term)); - }//End for each term/row + } // end foreach term/row history.replaceState(null, null, '?view=filter&' + $j('#contentForm').serialize()); } diff --git a/web/skins/classic/views/js/filter.js.php b/web/skins/classic/views/js/filter.js.php index 15db50a32..31cd939a0 100644 --- a/web/skins/classic/views/js/filter.js.php +++ b/web/skins/classic/views/js/filter.js.php @@ -10,6 +10,7 @@ var states = ; var servers = ; var storageareas = ; var monitors = ; +var zones = ; var errorBrackets = ''; var errorValue = ''; diff --git a/web/skins/classic/views/js/montage.js b/web/skins/classic/views/js/montage.js index 00130f108..3a491941b 100644 --- a/web/skins/classic/views/js/montage.js +++ b/web/skins/classic/views/js/montage.js @@ -464,6 +464,7 @@ function initPage() { // Start the fps and status updates. give a random delay so that we don't assault the server var delay = Math.round( (Math.random()+0.5)*statusRefreshTimeout ); +console.log("delay: " + delay); monitors[i].start(delay); var interval = monitors[i].refresh; diff --git a/web/skins/classic/views/montagereview.php b/web/skins/classic/views/montagereview.php index 4e216f380..0d3571523 100644 --- a/web/skins/classic/views/montagereview.php +++ b/web/skins/classic/views/montagereview.php @@ -62,6 +62,17 @@ ob_end_clean(); $filter = array(); if ( isset($_REQUEST['filter']) ) { $filter = $_REQUEST['filter']; + + # Try to guess min/max time from filter + foreach ( $filter['Query'] as $term ) { + if ( $term['attr'] == 'StartDateTime' ) { + if ( $term['op'] == '<=' or $term['op'] == '<' ) { + $maxTime = $term['val']; + } else if ( $term['op'] == '>=' or $term['op'] == '>' ) { + $minTime = $term['val']; + } + } + } } else { if ( isset($_REQUEST['minTime']) && isset($_REQUEST['maxTime']) && (count($displayMonitors) != 0) ) {