diff --git a/pandora_console/images/widgets/heatmap.png b/pandora_console/images/widgets/heatmap.png new file mode 100644 index 0000000000..413134613b Binary files /dev/null and b/pandora_console/images/widgets/heatmap.png differ diff --git a/pandora_console/include/class/Heatmap.class.php b/pandora_console/include/class/Heatmap.class.php index ff017b0c24..f7375c2a5e 100644 --- a/pandora_console/include/class/Heatmap.class.php +++ b/pandora_console/include/class/Heatmap.class.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -160,27 +160,40 @@ class Heatmap false ), 'data' => [ - 'page' => 'operation/heatmap', - 'method' => 'showHeatmap', - 'randomId' => $this->randomId, - 'type' => $this->type, - 'filter' => $this->filter, - 'refresh' => $this->refresh, - 'search' => $this->search, - 'group' => $this->group, + 'page' => 'operation/heatmap', + 'method' => 'showHeatmap', + 'randomId' => $this->randomId, + 'type' => $this->type, + 'filter' => $this->filter, + 'refresh' => $this->refresh, + 'search' => $this->search, + 'group' => $this->group, + 'dashboard' => (int) $this->dashboard, ], ]; - echo '
'; + $style_dashboard = ''; + if ($this->dashboard === true) { + $style_dashboard = 'min-height: 0px'; + } + + echo '
'; ?> 1 && $this->group === 1) { + if (count($groups) > 1 && $this->group === 1 && $this->dashboard === false) { $x_back = 0; $y_back = 0; @@ -1111,7 +1185,7 @@ class Heatmap echo ''; // Dialog. - echo ''; + echo '
'; } diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js index 7ffafd974f..3347ff0323 100644 --- a/pandora_console/include/javascript/pandora_dashboards.js +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -1560,3 +1560,36 @@ function showManualThresholds(element) { $(".dashboard-input-threshold-critical").addClass("invisible_important"); } } + +/** + * @return {void} + */ +// eslint-disable-next-line no-unused-vars +function type_change() { + var type = document.getElementById("type").value; + + switch (type) { + case "3": + $("#li_tags").hide(); + $("#li_groups").hide(); + $("#li_module_groups").hide(); + break; + case "2": + $("#li_tags").hide(); + $("#li_groups").hide(); + $("#li_module_groups").show(); + break; + case "1": + $("#li_tags").show(); + $("#li_groups").hide(); + $("#li_module_groups").hide(); + break; + + default: + case "0": + $("#li_tags").hide(); + $("#li_groups").show(); + $("#li_module_groups").hide(); + break; + } +} diff --git a/pandora_console/include/lib/Dashboard/Widgets/heatmap.php b/pandora_console/include/lib/Dashboard/Widgets/heatmap.php index c10c7c1f27..2f9d9533cd 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/heatmap.php +++ b/pandora_console/include/lib/Dashboard/Widgets/heatmap.php @@ -192,6 +192,26 @@ class HeatmapWidget extends Widget // Retrieve global - common inputs. $values = parent::decoders($decoder); + if (isset($decoder['search']) === true) { + $values['search'] = $decoder['search']; + } + + if (isset($decoder['type']) === true) { + $values['type'] = $decoder['type']; + } + + if (isset($decoder['groups']) === true) { + $values['groups'] = $decoder['groups']; + } + + if (isset($decoder['tags']) === true) { + $values['tags'] = $decoder['tags']; + } + + if (isset($decoder['module_groups']) === true) { + $values['module_groups'] = $decoder['module_groups']; + } + return $values; } @@ -205,9 +225,117 @@ class HeatmapWidget extends Widget */ public function getFormInputs(): array { + global $config; // Retrieve global - common inputs. $inputs = parent::getFormInputs(); + $values = $this->values; + + // Search. + $inputs[] = [ + 'label' => \__('Search'), + 'arguments' => [ + 'name' => 'search', + 'type' => 'text', + 'class' => 'event-widget-input', + 'value' => $values['search'], + 'return' => true, + 'size' => 30, + ], + ]; + + $inputs[] = [ + 'label' => __('Type'), + 'arguments' => [ + 'type' => 'select', + 'fields' => [ + 0 => __('Group agents'), + 1 => __('Group modules by tag'), + 2 => __('Group modules by module group'), + 3 => __('Group modules by agents'), + ], + 'name' => 'type', + 'selected' => $values['type'], + 'script' => 'type_change()', + 'return' => true, + ], + ]; + + // Filters. + $inputs[] = [ + 'label' => __('Groups'), + 'style' => ($values['type'] === '0') ? '' : 'display:none', + 'id' => 'li_groups', + 'arguments' => [ + 'type' => 'select_groups', + 'name' => 'groups[]', + 'returnAllGroup' => true, + 'privilege' => 'AR', + 'selected' => explode(',', $values['groups'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + if (tags_has_user_acl_tags($config['id_user']) === false) { + $tags = db_get_all_rows_sql( + 'SELECT id_tag, name FROM ttag WHERE id_tag ORDER BY name' + ); + } else { + $user_tags = tags_get_user_tags($config['id_user'], 'AR'); + if (empty($user_tags) === false) { + $id_user_tags = array_keys($user_tags); + $tags = db_get_all_rows_sql( + 'SELECT id_tag, name FROM ttag + WHERE id_tag IN ('.implode(',', $id_user_tags).') + ORDER BY name' + ); + } else { + $tags = db_get_all_rows_sql( + 'SELECT id_tag, name FROM ttag WHERE id_tag ORDER BY name' + ); + } + } + + $inputs[] = [ + 'label' => __('Tag'), + 'style' => ($values['type'] === '1') ? '' : 'display:none', + 'id' => 'li_tags', + 'arguments' => [ + 'type' => 'select', + 'fields' => $tags, + 'name' => 'tags[]', + 'selected' => explode(',', $values['tags'][0]), + 'return' => true, + 'multiple' => true, + ], + ]; + + $module_groups_aux = db_get_all_rows_sql( + 'SELECT id_mg, name FROM tmodule_group ORDER BY name' + ); + + $module_groups = []; + foreach ($module_groups_aux as $key => $module_group) { + $module_groups[$module_group['id_mg']] = $module_group['name']; + } + + $inputs[] = [ + 'label' => __('Module group'), + 'style' => ($values['type'] === '2') ? '' : 'display:none', + 'id' => 'li_module_groups', + 'arguments' => [ + 'type' => 'select', + 'fields' => $module_groups, + 'name' => 'module_groups[]', + 'selected' => explode(',', $values['module_groups'][0]), + 'return' => true, + 'multiple' => true, + 'nothing' => __('Not assigned'), + 'nothing_value' => 0, + ], + ]; + return $inputs; } @@ -222,6 +350,27 @@ class HeatmapWidget extends Widget // Retrieve global - common inputs. $values = parent::getPost(); + $values['search'] = \get_parameter('search', ''); + $values['type'] = \get_parameter('type', 0); + + switch ((int) $values['type']) { + case 2: + $values['module_groups'] = \get_parameter('module_groups', 0); + break; + + case 1: + $values['tags'] = \get_parameter('tags', 0); + break; + + case 0: + $values['groups'] = \get_parameter('groups', 0); + break; + + default: + // Do nothing. + break; + } + return $values; } @@ -256,8 +405,8 @@ class HeatmapWidget extends Widget public function getSizeModalConfiguration(): array { $size = [ - 'width' => 400, - 'height' => 205, + 'width' => 500, + 'height' => 300, ]; return $size; @@ -276,10 +425,23 @@ class HeatmapWidget extends Widget \ui_require_css_file('heatmap', 'include/styles/', true); $values = $this->values; - hd($values, true); + $search = (empty($values['search']) === false) ? $values['search'] : ''; + $type = (empty($values['type']) === false) ? $values['type'] : 0; + $filter = []; + if (isset($values['groups'])) { + $filter = explode(',', $values['groups'][0]); + } + + if (isset($values['tags'])) { + $filter = explode(',', $values['tags'][0]); + } + + if (isset($values['module_groups'])) { + $filter = explode(',', $values['module_groups'][0]); + } // Control call flow. - $heatmap = new Heatmap(0, [], null, 300, 400, 200, 0, 1); + $heatmap = new Heatmap($type, $filter, null, 300, 400, 200, $search, 0, true); // AJAX controller. if (is_ajax() === true) { $method = get_parameter('method'); diff --git a/pandora_console/operation/heatmap.php b/pandora_console/operation/heatmap.php index a53eebd698..1e063d3c3d 100644 --- a/pandora_console/operation/heatmap.php +++ b/pandora_console/operation/heatmap.php @@ -62,6 +62,8 @@ if ($group_sent === true) { $group = (int) get_parameter('group', true); } +$dashboard = (bool) get_parameter('dashboard', false); + $is_ajax = is_ajax(); if ($is_ajax === false && $pure === false) { $viewtab['config'] = ''.html_print_image( @@ -192,6 +194,7 @@ if ($is_ajax === false && $pure === true) { html_print_input_hidden('type', $type); html_print_input_hidden('search', $search); html_print_input_hidden('filter', implode(',', $filter)); + html_print_input_hidden('dashboard', $dashboard); echo ''; echo '
'; echo '
'; @@ -230,7 +233,7 @@ if ($is_ajax === false && $pure === true) { // Control call flow. try { // Heatmap construct. - $heatmap = new Heatmap($type, $filter, $randomId, $refresh, $width, $height, $search, $group); + $heatmap = new Heatmap($type, $filter, $randomId, $refresh, $width, $height, $search, $group, $dashboard); } catch (Exception $e) { if (is_ajax() === true) { echo json_encode(['error' => '[Heatmap]'.$e->getMessage() ]);