From eae4090944fb922d44899913b6d5cdaa97dc1041 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Wed, 2 Aug 2023 16:50:08 +0200 Subject: [statistics] Add button to copy existing rule --- .../eventlog/inc/filterruleprocessor.inc.php | 4 ++- .../eventlog/lang/de/template-tags.json | 2 ++ .../eventlog/lang/en/template-tags.json | 2 ++ modules-available/eventlog/pages/rules.inc.php | 38 +++++++++++++--------- .../eventlog/templates/page-filters-edit-rule.html | 12 +++++-- .../eventlog/templates/page-filters-rules.html | 36 +++++++++++--------- modules-available/statistics/api.inc.php | 5 +++ 7 files changed, 64 insertions(+), 35 deletions(-) diff --git a/modules-available/eventlog/inc/filterruleprocessor.inc.php b/modules-available/eventlog/inc/filterruleprocessor.inc.php index 17a63e38..24b37444 100644 --- a/modules-available/eventlog/inc/filterruleprocessor.inc.php +++ b/modules-available/eventlog/inc/filterruleprocessor.inc.php @@ -323,7 +323,9 @@ class FilterRuleProcessor case 'd': return Util::formatDuration((int)$v); case 'L': - return Location::getName((int)$v); + if (Module::isAvailable('locations')) + return Location::getName((int)$v) ?: '-'; + break; case '': break; default: diff --git a/modules-available/eventlog/lang/de/template-tags.json b/modules-available/eventlog/lang/de/template-tags.json index 34f7147b..df8e23d2 100644 --- a/modules-available/eventlog/lang/de/template-tags.json +++ b/modules-available/eventlog/lang/de/template-tags.json @@ -3,6 +3,8 @@ "lang_additionalMailAddresses": "Zus\u00e4tzliche EMail-Adressen", "lang_autoJson": "Vollst\u00e4ndige JSON-Daten", "lang_autoJsonHelp": "Das Feld \"POST-Format\" wird ignoriert. Die POST-Daten sind eine JSON-Struktur mit allen zum Ereignis geh\u00f6renden Daten. Die Felder \"Betreff\" und \"Nachricht\" werden ebenfalls ignoriert.", + "lang_copy": "Kopieren", + "lang_createFilter": "Filter erstellen", "lang_details": "Details", "lang_editFilter": "Filter bearbeiten", "lang_editMail": "EMail bearbeiten", diff --git a/modules-available/eventlog/lang/en/template-tags.json b/modules-available/eventlog/lang/en/template-tags.json index 90425156..55ebda89 100644 --- a/modules-available/eventlog/lang/en/template-tags.json +++ b/modules-available/eventlog/lang/en/template-tags.json @@ -3,6 +3,8 @@ "lang_additionalMailAddresses": "Additional mail addresses", "lang_autoJson": "Full JSON data", "lang_autoJsonHelp": "The field \"POST format\" is ignored. The POST payload is a JSON struct with all available data regarding the according event. \"Subject\" and \"Message\" are ignored as well.", + "lang_copy": "Copy", + "lang_createFilter": "Create filter", "lang_details": "Details", "lang_editFilter": "Edit filter", "lang_editMail": "Edit mail", diff --git a/modules-available/eventlog/pages/rules.inc.php b/modules-available/eventlog/pages/rules.inc.php index d60dcc07..6d240c73 100644 --- a/modules-available/eventlog/pages/rules.inc.php +++ b/modules-available/eventlog/pages/rules.inc.php @@ -101,6 +101,7 @@ class SubPage LEFT JOIN notification_rule_x_transport sfxb USING (ruleid) GROUP BY ruleid, title ORDER BY title, ruleid'); + Permission::addGlobalTags($data['perms'], null, ['filter.rules.edit']); Render::addTemplate('page-filters-rules', $data); } } @@ -112,8 +113,8 @@ class SubPage { // EDIT User::assertPermission('filter.rules.edit'); - $index = 0; - $existing = []; + $filterIdx = 0; + $knownIdxList = []; if ($id !== 0) { $data = Database::queryFirst('SELECT ruleid, title, type, datafilter, subject, message FROM notification_rule WHERE ruleid = :id', ['id' => $id]); @@ -121,21 +122,25 @@ class SubPage Message::addError('invalid-rule-id', $id); Util::redirect('?do=eventlog&show=rules'); } + if (Request::get('copy', false, 'bool')) { + $data['ruleid'] = 0; + $data['title'] = ''; + } $list = json_decode($data['datafilter'], true); if (!is_array($list['list'])) { $list['list'] = []; } foreach ($list['list'] as $item) { if (isset($item['index'])) { - $existing[] = $item['index']; + $knownIdxList[] = $item['index']; } } foreach ($list['list'] as &$item) { if (!isset($item['index'])) { - while (in_array($index, $existing)) { - $index++; + while (in_array($filterIdx, $knownIdxList)) { + $filterIdx++; } - $item['index'] = $index++; + $item['index'] = $filterIdx++; } $item['operators'] = []; foreach (self::OP_LIST as $op) { @@ -147,18 +152,9 @@ class SubPage } $data['filter'] = $list['list']; } else { + // New entry $data = ['filter' => [], 'ruleid' => 0]; } - // Add a few empty rows at the bottom - for ($i = 0; $i < 8; ++$i) { - while (in_array($index, $existing)) { - $index++; - } - $data['filter'][] = [ - 'index' => $index++, - 'operators' => array_map(function ($item) { return ['name' => $item]; }, self::OP_LIST), - ]; - } // Add suggestions for type $data['types'] = Database::queryColumnArray("SELECT DISTINCT type FROM notification_sample @@ -174,6 +170,16 @@ class SubPage // Filter keys to suggest for events with machineuuid in data $data['machine_keys'] = array_keys(FilterRuleProcessor::HW_QUERIES); } + // Add a few empty rows at the bottom + for ($i = 0; $i < 8; ++$i) { + while (in_array($filterIdx, $knownIdxList)) { + $filterIdx++; + } + $data['filter'][] = [ + 'index' => $filterIdx++, + 'operators' => array_map(function ($item) { return ['name' => $item]; }, self::OP_LIST), + ]; + } Render::addTemplate('page-filters-edit-rule', $data); } diff --git a/modules-available/eventlog/templates/page-filters-edit-rule.html b/modules-available/eventlog/templates/page-filters-edit-rule.html index 0678dd97..318a8656 100644 --- a/modules-available/eventlog/templates/page-filters-edit-rule.html +++ b/modules-available/eventlog/templates/page-filters-edit-rule.html @@ -1,4 +1,12 @@ -

{{lang_editFilter}} {{#title}}–{{/title}} {{title}}

+

+ {{#ruleid}} + {{lang_editFilter}} + {{/ruleid}} + {{^ruleid}} + {{lang_createFilter}} + {{/ruleid}} +

+

{{title}}

{{lang_filterExampleHelpText}}

@@ -199,7 +207,7 @@ } }); }; - $fkInputs.on('input', chFn).change(chFn); + $fkInputs.on('input', chFn).change(chFn).each(chFn); typeFieldChangeUpdate(); }); diff --git a/modules-available/eventlog/templates/page-filters-rules.html b/modules-available/eventlog/templates/page-filters-rules.html index 524e71b2..56bf0871 100644 --- a/modules-available/eventlog/templates/page-filters-rules.html +++ b/modules-available/eventlog/templates/page-filters-rules.html @@ -14,22 +14,26 @@ {{#filters}} - - {{ruleid}} - {{type}} - {{title}} - - {{useCount}} - - + + {{ruleid}} + {{type}} + {{title}} + {{useCount}} + + - - - - + + + + + + + {{/filters}} @@ -37,7 +41,7 @@
- + {{lang_add}} diff --git a/modules-available/statistics/api.inc.php b/modules-available/statistics/api.inc.php index d6549392..6875193d 100644 --- a/modules-available/statistics/api.inc.php +++ b/modules-available/statistics/api.inc.php @@ -193,6 +193,11 @@ if ($type[0] === '~') { // Add anything not present in $new from $old $new += $old; $new['oldlastboot'] = $old['lastboot']; + } else { + // First boot, mock some important fields for event log filtering + $new['oldlastboot'] = 0; + $new['oldlastseen'] = 0; + $new['oldstate'] = 'OFFLINE'; } unset($new['data']); -- cgit v1.2.3-55-g7522