diff --git a/pandora_agents/pc/AIX/pandora_agent.conf b/pandora_agents/pc/AIX/pandora_agent.conf index f5e67c98ba..0ff67a62d3 100644 --- a/pandora_agents/pc/AIX/pandora_agent.conf +++ b/pandora_agents/pc/AIX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, AIX version +# Version 7.0NG.735, AIX version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/FreeBSD/pandora_agent.conf b/pandora_agents/pc/FreeBSD/pandora_agent.conf index 74b075e83d..c7c6fdd493 100644 --- a/pandora_agents/pc/FreeBSD/pandora_agent.conf +++ b/pandora_agents/pc/FreeBSD/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, FreeBSD Version +# Version 7.0NG.735, FreeBSD Version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/HP-UX/pandora_agent.conf b/pandora_agents/pc/HP-UX/pandora_agent.conf index 10d360a51d..1a349583dc 100644 --- a/pandora_agents/pc/HP-UX/pandora_agent.conf +++ b/pandora_agents/pc/HP-UX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, HP-UX Version +# Version 7.0NG.735, HP-UX Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/Linux/pandora_agent.conf b/pandora_agents/pc/Linux/pandora_agent.conf index 9ad57d9a9d..dc172b7e2f 100644 --- a/pandora_agents/pc/Linux/pandora_agent.conf +++ b/pandora_agents/pc/Linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, GNU/Linux +# Version 7.0NG.735, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/NT4/pandora_agent.conf b/pandora_agents/pc/NT4/pandora_agent.conf index 360efd4d9b..3d76832397 100644 --- a/pandora_agents/pc/NT4/pandora_agent.conf +++ b/pandora_agents/pc/NT4/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, GNU/Linux +# Version 7.0NG.735, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/SunOS/pandora_agent.conf b/pandora_agents/pc/SunOS/pandora_agent.conf index f0a8d0c0ef..9b088eae51 100644 --- a/pandora_agents/pc/SunOS/pandora_agent.conf +++ b/pandora_agents/pc/SunOS/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, Solaris Version +# Version 7.0NG.735, Solaris Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/pc/Win32/pandora_agent.conf b/pandora_agents/pc/Win32/pandora_agent.conf index d01ed9068f..e2c442a520 100644 --- a/pandora_agents/pc/Win32/pandora_agent.conf +++ b/pandora_agents/pc/Win32/pandora_agent.conf @@ -1,6 +1,6 @@ # Base config file for Pandora FMS Windows Agent # (c) 2006-2010 Artica Soluciones Tecnologicas -# Version 7.0NG.734 +# Version 7.0NG.735 # This program is Free Software, you can redistribute it and/or modify it # under the terms of the GNU General Public Licence as published by the Free Software diff --git a/pandora_agents/shellscript/aix/pandora_agent.conf b/pandora_agents/shellscript/aix/pandora_agent.conf index 0e0546261d..fea0cb56db 100644 --- a/pandora_agents/shellscript/aix/pandora_agent.conf +++ b/pandora_agents/shellscript/aix/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.734, AIX version +# Version 7.0NG.735, AIX version # General Parameters # ================== diff --git a/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf b/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf index a941a9671e..f0ce5b2519 100644 --- a/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf +++ b/pandora_agents/shellscript/bsd-ipso/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.734 +# Version 7.0NG.735 # FreeBSD/IPSO version # Licenced under GPL licence, 2003-2007 Sancho Lerena diff --git a/pandora_agents/shellscript/hp-ux/pandora_agent.conf b/pandora_agents/shellscript/hp-ux/pandora_agent.conf index 779ef59e37..20cdfeff99 100644 --- a/pandora_agents/shellscript/hp-ux/pandora_agent.conf +++ b/pandora_agents/shellscript/hp-ux/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.734, HPUX Version +# Version 7.0NG.735, HPUX Version # General Parameters # ================== diff --git a/pandora_agents/shellscript/linux/pandora_agent.conf b/pandora_agents/shellscript/linux/pandora_agent.conf index 07869dd19b..e8ba9653ce 100644 --- a/pandora_agents/shellscript/linux/pandora_agent.conf +++ b/pandora_agents/shellscript/linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734 +# Version 7.0NG.735 # Licensed under GPL license v2, # (c) 2003-2010 Artica Soluciones Tecnologicas # please visit http://pandora.sourceforge.net diff --git a/pandora_agents/shellscript/mac_osx/pandora_agent.conf b/pandora_agents/shellscript/mac_osx/pandora_agent.conf index 0d1a1928c3..29d13ff75c 100644 --- a/pandora_agents/shellscript/mac_osx/pandora_agent.conf +++ b/pandora_agents/shellscript/mac_osx/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734 +# Version 7.0NG.735 # Licensed under GPL license v2, # (c) 2003-2009 Artica Soluciones Tecnologicas # please visit http://pandora.sourceforge.net diff --git a/pandora_agents/shellscript/openWRT/pandora_agent.conf b/pandora_agents/shellscript/openWRT/pandora_agent.conf index 2eb1b43e76..8ef8a6fdc1 100644 --- a/pandora_agents/shellscript/openWRT/pandora_agent.conf +++ b/pandora_agents/shellscript/openWRT/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734 +# Version 7.0NG.735 # Licensed under GPL license v2, # please visit http://pandora.sourceforge.net diff --git a/pandora_agents/shellscript/solaris/pandora_agent.conf b/pandora_agents/shellscript/solaris/pandora_agent.conf index 2928f1d320..1ace947818 100644 --- a/pandora_agents/shellscript/solaris/pandora_agent.conf +++ b/pandora_agents/shellscript/solaris/pandora_agent.conf @@ -1,6 +1,6 @@ # Fichero de configuracion base de agentes de Pandora # Base config file for Pandora agents -# Version 7.0NG.734, Solaris version +# Version 7.0NG.735, Solaris version # General Parameters # ================== diff --git a/pandora_agents/unix/AIX/pandora_agent.conf b/pandora_agents/unix/AIX/pandora_agent.conf index 7c363219a1..c67f64d16c 100644 --- a/pandora_agents/unix/AIX/pandora_agent.conf +++ b/pandora_agents/unix/AIX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, AIX version +# Version 7.0NG.735, AIX version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 8873cffb3c..bf5df0c125 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.734-190516 +Version: 7.0NG.735-190527 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index f89a9a71f5..08bb79494c 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.734-190516" +pandora_version="7.0NG.735-190527" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/Darwin/pandora_agent.conf b/pandora_agents/unix/Darwin/pandora_agent.conf index 5c5ebf5808..d7ee481255 100644 --- a/pandora_agents/unix/Darwin/pandora_agent.conf +++ b/pandora_agents/unix/Darwin/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, GNU/Linux +# Version 7.0NG.735, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2012 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/FreeBSD/pandora_agent.conf b/pandora_agents/unix/FreeBSD/pandora_agent.conf index 5fc956c564..b02b379470 100644 --- a/pandora_agents/unix/FreeBSD/pandora_agent.conf +++ b/pandora_agents/unix/FreeBSD/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, FreeBSD Version +# Version 7.0NG.735, FreeBSD Version # Licensed under GPL license v2, # Copyright (c) 2003-2016 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/HP-UX/pandora_agent.conf b/pandora_agents/unix/HP-UX/pandora_agent.conf index b5bce38619..57e35c0a03 100644 --- a/pandora_agents/unix/HP-UX/pandora_agent.conf +++ b/pandora_agents/unix/HP-UX/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, HP-UX Version +# Version 7.0NG.735, HP-UX Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/Linux/pandora_agent.conf b/pandora_agents/unix/Linux/pandora_agent.conf index f0e610c8a3..db07876f12 100644 --- a/pandora_agents/unix/Linux/pandora_agent.conf +++ b/pandora_agents/unix/Linux/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, GNU/Linux +# Version 7.0NG.735, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2014 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/NT4/pandora_agent.conf b/pandora_agents/unix/NT4/pandora_agent.conf index 6599a01803..8cda0f8fe0 100644 --- a/pandora_agents/unix/NT4/pandora_agent.conf +++ b/pandora_agents/unix/NT4/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, GNU/Linux +# Version 7.0NG.735, GNU/Linux # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/NetBSD/pandora_agent.conf b/pandora_agents/unix/NetBSD/pandora_agent.conf index a9cd29af83..629fe6a6fb 100644 --- a/pandora_agents/unix/NetBSD/pandora_agent.conf +++ b/pandora_agents/unix/NetBSD/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, NetBSD Version +# Version 7.0NG.735, NetBSD Version # Licensed under GPL license v2, # Copyright (c) 2003-2010 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/SunOS/pandora_agent.conf b/pandora_agents/unix/SunOS/pandora_agent.conf index 8b1151bbad..8ff3c52de5 100644 --- a/pandora_agents/unix/SunOS/pandora_agent.conf +++ b/pandora_agents/unix/SunOS/pandora_agent.conf @@ -1,5 +1,5 @@ # Base config file for Pandora FMS agents -# Version 7.0NG.734, Solaris Version +# Version 7.0NG.735, Solaris Version # Licensed under GPL license v2, # Copyright (c) 2003-2009 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 87b2f6ac84..c134985c2a 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -41,8 +41,8 @@ my $Sem = undef; # Semaphore used to control the number of threads my $ThreadSem = undef; -use constant AGENT_VERSION => '7.0NG.734'; -use constant AGENT_BUILD => '190516'; +use constant AGENT_VERSION => '7.0NG.735'; +use constant AGENT_BUILD => '190527'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index ba0d22741c..006f14dec5 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -2,8 +2,8 @@ #Pandora FMS Linux Agent # %define name pandorafms_agent_unix -%define version 7.0NG.734 -%define release 190516 +%define version 7.0NG.735 +%define release 190527 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index e10a3cc870..9570f76a61 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -2,8 +2,8 @@ #Pandora FMS Linux Agent # %define name pandorafms_agent_unix -%define version 7.0NG.734 -%define release 190516 +%define version 7.0NG.735 +%define release 190527 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index ce72b6cbc7..09dee41bfc 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -9,8 +9,8 @@ # Please see http://www.pandorafms.org. This code is licensed under GPL 2.0 license. # ********************************************************************** -PI_VERSION="7.0NG.734" -PI_BUILD="190516" +PI_VERSION="7.0NG.735" +PI_BUILD="190527" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/bin/pandora_agent.conf b/pandora_agents/win32/bin/pandora_agent.conf index 0f6d503674..518cd3df0e 100644 --- a/pandora_agents/win32/bin/pandora_agent.conf +++ b/pandora_agents/win32/bin/pandora_agent.conf @@ -1,6 +1,6 @@ # Base config file for Pandora FMS Windows Agent # (c) 2006-2017 Artica Soluciones Tecnologicas -# Version 7.0NG.734 +# Version 7.0NG.735 # This program is Free Software, you can redistribute it and/or modify it # under the terms of the GNU General Public Licence as published by the Free Software diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index c03b44092c..8ed0a773a6 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -3,7 +3,7 @@ AllowLanguageSelection {Yes} AppName -{Pandora FMS Windows Agent v7.0NG.734} +{Pandora FMS Windows Agent v7.0NG.735} ApplicationID {17E3D2CF-CA02-406B-8A80-9D31C17BD08F} @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190516} +{190527} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index f6051d2bbe..83f46ffda7 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.734(Build 190516)") +#define PANDORA_VERSION ("7.0NG.735(Build 190527)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 5317766cac..f7c288faef 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.734(Build 190516))" + VALUE "ProductVersion", "(7.0NG.735(Build 190527))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 6445f42b99..f0c00292aa 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.734-190516 +Version: 7.0NG.735-190527 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index e5446a0829..aef18cc75d 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.734-190516" +pandora_version="7.0NG.735-190527" package_pear=0 package_pandora=1 diff --git a/pandora_console/extensions/agents_alerts.php b/pandora_console/extensions/agents_alerts.php index 72b90eeafa..54e0ec6b12 100755 --- a/pandora_console/extensions/agents_alerts.php +++ b/pandora_console/extensions/agents_alerts.php @@ -138,8 +138,15 @@ function mainAgentsAlerts() $onheader['combo_refr'] = $comborefr; } - // Header - ui_print_page_header(__('Agents/Alerts'), 'images/op_alerts.png', false, '', false, $updated_time); + // Header. + ui_print_page_header( + __('Agents/Alerts'), + 'images/op_alerts.png', + false, + 'agents_alerts_view', + false, + $updated_time + ); // Old style table, we need a lot of special formatting,don't use table function // Prepare old-style table @@ -291,7 +298,7 @@ function mainAgentsAlerts() $table2->data[2][0] = __('Threshold'); $table2->data[2][1] = html_print_input_text('module_action_threshold', '0', '', 5, 7, true); - $table2->data[2][1] .= ' '.__('seconds').ui_print_help_icon('action_threshold', true); + $table2->data[2][1] .= ' '.__('seconds'); $content2 = '
'; $content2 .= html_print_table($table2, true); diff --git a/pandora_console/extensions/agents_modules.php b/pandora_console/extensions/agents_modules.php index 8c0eaa7dae..b5860068d8 100644 --- a/pandora_console/extensions/agents_modules.php +++ b/pandora_console/extensions/agents_modules.php @@ -181,8 +181,15 @@ function mainAgentsModules() // Old style table, we need a lot of special formatting,don't use table function // Prepare old-style table if ($config['pure'] == 0) { - // Header - ui_print_page_header(__('Agents/Modules'), 'images/module_mc.png', false, '', false, $updated_time); + // Header. + ui_print_page_header( + __('Agents/Modules'), + 'images/module_mc.png', + false, + 'agents_module_view', + false, + $updated_time + ); echo ''; echo ''; echo "'; @@ -826,4 +833,4 @@ $ignored_params['refresh'] = ''; } } - \ No newline at end of file + diff --git a/pandora_console/extensions/db_status.php b/pandora_console/extensions/db_status.php index 435474dc53..2d8669f83f 100755 --- a/pandora_console/extensions/db_status.php +++ b/pandora_console/extensions/db_status.php @@ -25,7 +25,7 @@ function extension_db_status() __('DB Schema check'), 'images/extensions.png', false, - '', + 'db_status_tab', true, '' ); diff --git a/pandora_console/extensions/module_groups.php b/pandora_console/extensions/module_groups.php index 1a505538ed..9e750be932 100644 --- a/pandora_console/extensions/module_groups.php +++ b/pandora_console/extensions/module_groups.php @@ -192,7 +192,14 @@ function mainModuleGroups() $array_data[$value['id_grupo']][$value['id_mg']] = $value; } - ui_print_page_header(__('Combined table of agent group and module group'), 'images/module_group.png', false, '', false, ''); + ui_print_page_header( + __('Combined table of agent group and module group'), + 'images/module_group.png', + false, + 'module_groups_view', + false, + '' + ); echo "
".$fullscreen['text'].'
"; diff --git a/pandora_console/extensions/realtime_graphs.php b/pandora_console/extensions/realtime_graphs.php index 09d66abf0c..cea09fe4d5 100644 --- a/pandora_console/extensions/realtime_graphs.php +++ b/pandora_console/extensions/realtime_graphs.php @@ -29,7 +29,14 @@ function pandora_realtime_graphs() $hide_header = get_parameter('hide_header', 0); if (!$hide_header) { - ui_print_page_header(__('Realtime graphs'), 'images/extensions.png', false, '', false, $onheader); + ui_print_page_header( + __('Realtime graphs'), + 'images/extensions.png', + false, + 'real_time_view', + false, + $onheader + ); } $chart[time()]['graph'] = '0'; diff --git a/pandora_console/extras/delete_files/delete_files.txt b/pandora_console/extras/delete_files/delete_files.txt index 00eb4021d0..82ce1527aa 100644 --- a/pandora_console/extras/delete_files/delete_files.txt +++ b/pandora_console/extras/delete_files/delete_files.txt @@ -1,3 +1,3 @@ -/godmode/servers/recon_script.php -/godmode/servers/manage_recontask_form.php -/godmode/servers/manage_recontask.php \ No newline at end of file +/general/login_identification_wizard.php +/general/login_required.php +/godmode/update_manager/update_manager.messages.php \ No newline at end of file diff --git a/pandora_console/extras/mr/28.sql b/pandora_console/extras/mr/28.sql index fba7ef10bd..71bc92479f 100644 --- a/pandora_console/extras/mr/28.sql +++ b/pandora_console/extras/mr/28.sql @@ -9,9 +9,12 @@ ALTER TABLE `talert_commands` ADD COLUMN `fields_hidden` text; ALTER TABLE `talert_templates` MODIFY COLUMN `type` ENUM('regex','max_min','max','min','equal','not_equal','warning','critical','onchange','unknown','always','not_normal'); DELETE FROM `tevent_response` WHERE `name` LIKE 'Create Integria IMS incident from event'; -INSERT INTO `tnews` (`id_news`, `author`, `subject`, `text`, `timestamp`) VALUES (1,'admin','Welcome to Pandora FMS Console', '<p style="text-align: center; font-size: 13px;">Hello, congratulations, if you've arrived here you already have an operational monitoring console. Remember that our forums and online documentation are available 24x7 to get you out of any trouble. You can replace this message with a personalized one at Admin tools -> Site news.</p> ',NOW()); +INSERT INTO `tnews` (`id_news`, `author`, `subject`, `text`, `timestamp`) VALUES (NULL,'admin','Welcome to Pandora FMS Console', '<p style="text-align: center; font-size: 13px;">Hello, congratulations, if you've arrived here you already have an operational monitoring console. Remember that our forums and online documentation are available 24x7 to get you out of any trouble. You can replace this message with a personalized one at Admin tools -> Site news.</p> ',NOW()); +INSERT INTO `tnotification_source_user` (`id_source`, `id_user`, `enabled`, `also_mail`) VALUES ((SELECT `id` FROM `tnotification_source` WHERE `description`="Official communication"), "admin", 1, 0); +UPDATE `tnotification_source` SET `enabled`=1 WHERE `description` = 'System status' OR `description` = 'Official communication'; +UPDATE `tnotification_source` SET `icon`="icono_logo_pandora.png" WHERE `description` = 'Official communication'; ALTER TABLE `tusuario` ADD COLUMN `ehorus_user_login_user` VARCHAR(60); ALTER TABLE `tusuario` ADD COLUMN `ehorus_user_login_pass` VARCHAR(45); diff --git a/pandora_console/extras/pandora_diag.php b/pandora_console/extras/pandora_diag.php index 34cfac8ea4..c5420c26bd 100644 --- a/pandora_console/extras/pandora_diag.php +++ b/pandora_console/extras/pandora_diag.php @@ -295,7 +295,7 @@ $key_buffer_size_min_rec_value = 256; $read_buffer_size_min_rec_value = 32; $read_rnd_buffer_size_min_rec_value = 32; $query_cache_min_res_unit_min_rec_value = 2; -$innodb_file_per_table_min_rec_value = 0; +$innodb_file_per_table_min_rec_value = 1; function status_fragmentation_tables($tables_fragmentation_max_rec_value, $tables_fragmentation) @@ -345,15 +345,21 @@ if ($console_mode == 1) { include '../include/config.php'; } - // Not from console, this is a web session - if ((!isset($config['id_user'])) or (!check_acl($config['id_user'], 0, 'PM'))) { + // Not from console, this is a web session. + if ((!isset($config['id_user'])) || (!check_acl($config['id_user'], 0, 'PM'))) { echo "

You don't have privileges to use diagnostic tool

"; echo '

Please login with an administrator account before try to use this tool

'; exit; } - // Header - ui_print_page_header(__('Pandora FMS Diagnostic tool'), '', false, '', true); + // Header. + ui_print_page_header( + __('Pandora FMS Diagnostic tool'), + '', + false, + 'diagnostic_tool_tab', + true + ); echo "
"; echo "'; @@ -678,7 +684,7 @@ render_info_data( $read_rnd_buffer_size = (db_get_value_sql('SELECT @@read_rnd_buffer_size') / 1024); $query_cache_min_res_unit = (db_get_value_sql('SELECT @@query_cache_min_res_unit') / 1024); $innodb_file_per_table = db_get_value_sql('SELECT @@innodb_file_per_table'); - echo "'; + echo "'; render_row(status_values($innodb_log_file_size_min_rec_value, $innodb_log_file_size), 'InnoDB log file size ', 'InnoDB log file size '); render_row(status_values($innodb_log_buffer_size_min_rec_value, $innodb_log_buffer_size), 'InnoDB log buffer size ', 'InnoDB log buffer size '); diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index 7fd3e581db..cdaa54c414 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -2008,7 +2008,7 @@ INSERT INTO `tnotification_source`(`description`, `icon`, `max_postpone_time`, ` ("Message", "icono_info_mr.png", 86400, 1, 1, 0), ("Pending task", "icono_info_mr.png", 86400, 1, 1, 0), ("Advertisement", "icono_info_mr.png", 86400, 1, 1, 0), - ("Official communication", "icono_info_mr.png", 86400, 1, 1, 0), + ("Official communication", "icono_logo_pandora.png", 86400, 1, 1, 0), ("Sugerence", "icono_info_mr.png", 86400, 1, 1, 0); -- ----------------------------------------------------- @@ -2105,6 +2105,9 @@ INSERT INTO `talert_commands` (`name`, `command`, `description`, `internal`, `fi INSERT INTO `tnotification_source_user` (`id_source`, `id_user`, `enabled`, `also_mail`) VALUES ((SELECT `id` FROM `tnotification_source` WHERE `description`="System status"), "admin", 1, 0); INSERT INTO `tnotification_source_group` SELECT `id`,0 FROM `tnotification_source` WHERE `description`="Message"; INSERT INTO `tnotification_user` (`id_mensaje`, `id_user`) SELECT `id_mensaje`, `id_usuario_destino` FROM `tmensajes` WHERE `id_usuario_destino` != ''; +INSERT INTO `tnotification_source_user` (`id_source`, `id_user`, `enabled`, `also_mail`) VALUES ((SELECT `id` FROM `tnotification_source` WHERE `description`="Official communication"), "admin", 1, 0); +UPDATE `tnotification_source` SET `enabled`=1 WHERE `description` = 'System status' OR `description` = 'Official communication'; + -- ---------------------------------------------------------------------- -- Add custom internal recon scripts -- ---------------------------------------------------------------------- diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index 3117ddb490..a093596b2b 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -143,6 +143,57 @@ if ($config['menu_type'] == 'classic') { $_GET['sec2'] = ''; } + if ($_GET['sec'] == 'main' || !isset($_GET['sec'])) { + // home screen chosen by the user + $home_page = ''; + if (isset($config['id_user'])) { + $user_info = users_get_user_by_id($config['id_user']); + $home_page = io_safe_output($user_info['section']); + $home_url = $user_info['data_section']; + } + + if ($home_page != '') { + switch ($home_page) { + case 'Event list': + $_GET['sec2'] = 'operation/events/events'; + break; + + case 'Group view': + $_GET['sec2'] = 'operation/agentes/group_view'; + break; + + case 'Alert detail': + $_GET['sec2'] = 'operation/agentes/alerts_status'; + break; + + case 'Tactical view': + $_GET['sec2'] = 'operation/agentes/tactical'; + break; + + case 'Default': + $_GET['sec2'] = 'general/logon_ok'; + break; + + case 'Dashboard': + $_GET['sec2'] = 'enterprise/dashboard/main_dashboard'; + break; + + case 'Visual console': + $_GET['sec2'] = 'operation/visual_console/render_view'; + break; + + case 'Other': + $home_url = io_safe_output($home_url); + $url_array = parse_url($home_url); + parse_str($url_array['query'], $res); + foreach ($res as $key => $param) { + $_GET[$key] = $param; + } + break; + } + } + } + if (!isset($_GET['refr'])) { $_GET['refr'] = null; } @@ -212,14 +263,21 @@ if ($config['menu_type'] == 'classic') { ); $autorefresh_additional .= ''; unset($values); - - $autorefresh_link_open_img = ''; + if ($home_page != '') { + $autorefresh_link_open_img = ''; + } else { + $autorefresh_link_open_img = ''; + } if ($_GET['refr'] || ((isset($select[0]['time_autorefresh']) === true) && $select[0]['time_autorefresh'] !== 0) ) { - $autorefresh_link_open_txt = ''; + if ($home_page != '') { + $autorefresh_link_open_txt = ''; + } else { + $autorefresh_link_open_txt = ''; + } } else { $autorefresh_link_open_txt = ''; } @@ -614,7 +672,7 @@ if ($config['menu_type'] == 'classic') { if ($_GET['refr'] || $do_refresh === true) { ?> $("#header_autorefresh").css('padding-right', '5px'); - var refr_time = ; + var refr_time = ; var t = new Date(); t.setTime (t.getTime () + parseInt()); $("#refrcounter").countdown ({ diff --git a/pandora_console/general/login_identification_wizard.php b/pandora_console/general/login_identification_wizard.php deleted file mode 100644 index 7bdb370b54..0000000000 --- a/pandora_console/general/login_identification_wizard.php +++ /dev/null @@ -1,455 +0,0 @@ - true, - 'message' => '', - ]; - - if ($register_pandora) { - // Pandora register update - $um_message = update_manager_register_instance(); - $ui_feedback['message'] .= $um_message['message'].'

'; - if ($um_message['success']) { - config_update_value('instance_registered', 1); - $ui_feedback['status'] = true && $ui_feedback['status']; - } else { - $ui_feedback['status'] = false; - } - } else if (!$forced) { - config_update_value('identification_reminder_timestamp', $future_8_days); - } - - if ($newsletter) { - // Pandora newsletter update - $email = get_parameter('email', ''); - $um_message = update_manager_insert_newsletter($email); - $ui_feedback['message'] .= $um_message['message']; - if ($um_message['success']) { - db_process_sql_update('tusuario', ['middlename' => 1], ['id_user' => $config['id_user']]); - $ui_feedback['status'] = true && $ui_feedback['status']; - } else { - $ui_feedback['status'] = false; - } - } else if (!$forced) { - db_process_sql_update('tusuario', ['lastname' => $future_8_days], ['id_user' => $config['id_user']]); - } - - // Form answer JSON - $ui_feedback['status'] = $ui_feedback['status'] ? 1 : 0; - echo io_json_mb_encode($ui_feedback); - } - - if (!$not_return) { - return; - } -} - -// Check if user is admin -if (!license_free()) { - return; -} - -if (!users_is_admin($config['id_user'])) { - return; -} - -// Get data to display properly the wizard -$wizard_data = []; - -$wizard_data['newsletter_subscribed'] = db_get_value('middlename', 'tusuario', 'id_user', $config['id_user']); -// force_* = 1 -> force show -// force_* = 0 -> force hide -// force_* = -1 -> show or hide depends reminder and timestamp -$wizard_data['force_newsletter'] = get_parameter('force_newsletter', -1); -$wizard_data['newsletter_reminder'] = db_get_value('firstname', 'tusuario', 'id_user', $config['id_user']); -$wizard_data['newsletter_reminder_timestamp'] = db_get_value('lastname', 'tusuario', 'id_user', $config['id_user']); - - -$wizard_data['instance_registered'] = $config['instance_registered']; -$wizard_data['force_register'] = get_parameter('force_register', -1); -$wizard_data['identification_reminder'] = $config['identification_reminder']; -$wizard_data['identification_reminder_timestamp'] = $config['identification_reminder_timestamp']; - -$display_newsletter = display_newsletter($wizard_data); -$display_register = display_register($wizard_data); -$display_forced = ($wizard_data['force_newsletter'] != -1) || ($wizard_data['force_register'] != -1); - -// Return if it is fully completed -if ((!$display_register) && (!$display_newsletter)) { - return false; -} - -$return_button = get_parameter('return_button', 0) == 1; - -$email = db_get_value('email', 'tusuario', 'id_user', $config['id_user']); -// Avoid to show default email -if ($email == 'admin@example.com') { - $email = ''; -} - -// Prints accept register license -echo '
'; - echo '
'; - echo html_print_image('images/pandora_circle_big.png', true); - echo '
'; - echo '
'; - echo __('Stay up to date with the %s community', get_product_name()).'.'; - echo '
'; - - echo '
'; - echo '

'.__('When you subscribe to the %s Update Manager service, you accept that we register your %s instance as an identifier on the database owned by Artica TS. This data will solely be used to provide you with information about %s and will not be conceded to third parties. You can unregister from said database at any time from the Update Manager options.', get_product_name(), get_product_name(), get_product_name()).'

'; - echo '

'.__('In the same fashion, when subscribed to the newsletter you accept that your email will pass on to a database property of Artica TS. This data will solely be used to provide you with information about %s and will not be conceded to third parties. You can unregister from said database at any time from the newsletter subscription options.', get_product_name()).'

'; - echo '
'; - - echo '
'; - echo '
'; - html_print_submit_button(__('Finish'), 'finish_dialog_button', false, 'class="ui-button-dialog ui-widget ui-state-default ui-corner-all ui-button-text-only sub ok" style="width:100px;"'); - echo '
'; - $display_status_return = $return_button ? 'block' : 'none'; - echo '
'; - html_print_submit_button(__('Return'), 'return_dialog_button', false, 'class="ui-button-dialog ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd" style="width:100px;"'); - echo '
'; - echo '
'; - html_print_checkbox('register', 1, false, false, false, 'cursor: \'pointer\''); - echo ' '.__('Join the %s community!', get_product_name()).'!
'; - html_print_checkbox('newsletter', 1, false, false, false, 'cursor: \'pointer\''); - echo ' '.__('Subscribe to our newsletter').''; - echo '
'; - echo '
'; - echo ' '; - html_print_input_text_extended('email-newsletter', $email, 'text-email-newsletter', '', 30, 255, false, '', ['style' => 'display:none; width: 200px;']); -echo ' '; - echo ' *'.__('Required').' '; - echo '
'; - echo '
'; - echo '
'; -echo '
'; - -// Print yes or not dialog -echo '
'; - echo '
'; - echo __('Do you want to continue without any registration').'?'; - echo '
'; - echo '
'; - html_print_submit_button(__('No'), 'no_registration', false, 'class="ui-button-dialog ui-widget ui-state-default ui-corner-all ui-button-text-only sub cancel" style="width:100px;"'); - echo '
'; - echo '
'; - html_print_submit_button(__('Yes'), 'yes_registration', false, 'class="ui-button-dialog ui-widget ui-state-default ui-corner-all ui-button-text-only sub upd" style="width:100px;"'); - echo '
'; -echo '
'; - -// Print feedback user dialog -echo '
'; - echo '
'; - echo html_print_image('images/success_circle_big.png', true); - echo '
'; - echo '
'; -echo '
'; -?> - - - - - diff --git a/pandora_console/general/login_required.php b/pandora_console/general/login_required.php deleted file mode 100644 index 726d6ab5d1..0000000000 --- a/pandora_console/general/login_required.php +++ /dev/null @@ -1,273 +0,0 @@ - $email], - ['id_user' => $config['id_user']] - ); - } - - // Update the alert action Mail to XXX/Administrator if it is set to default - $mail_check = 'yourmail@domain.es'; - $mail_alert = alerts_get_alert_action_field1(1); - if ($mail_check === $mail_alert && $email !== false) { - alerts_update_alert_action( - 1, - [ - 'field1' => $email, - 'field1_recovery' => $email, - ] - ); - } - - config_update_value('initial_wizard', 1); - } - - // Change the language if is change in checkbox - if ($change_language !== 0) { - config_update_value('language', $change_language); - } - - if ($cancel_wizard !== 0) { - config_update_value('initial_wizard', 1); - } - - return; -} - -$email = db_get_value('email', 'tusuario', 'id_user', $config['id_user']); -// Avoid to show default email -if ($email == 'admin@example.com') { - $email = ''; -} - -// Prints first step pandora registration -echo ''; - - ?> - - diff --git a/pandora_console/general/logon_ok.php b/pandora_console/general/logon_ok.php index c3de268dea..649a2d2f68 100644 --- a/pandora_console/general/logon_ok.php +++ b/pandora_console/general/logon_ok.php @@ -197,12 +197,17 @@ if (!empty($all_data)) { } foreach ($news as $article) { + $image = false; + if ($article['text'] == '<p style="text-align: center; font-size: 13px;">Hello, congratulations, if you've arrived here you already have an operational monitoring console. Remember that our forums and online documentation are available 24x7 to get you out of any trouble. You can replace this message with a personalized one at Admin tools -> Site news.</p> ') { + $image = true; + } + $text_bbdd = io_safe_output($article['text']); $text = html_entity_decode($text_bbdd); echo '
'; echo ''; echo '
".__('Pandora status info').'
".__('MySQL Performance metrics').'
".__('MySQL Performance metrics').' '.ui_print_help_icon('performance_metrics_tab', true).'
'.$article['subject'].'
'.__('by').' '.$article['author'].' '.ui_print_timestamp($article['timestamp'], true).' '.$comparation_suffix.'
'; - if ($article['id_news'] == 1) { + if ($image) { echo '
img colabora con nosotros - Support
'; } @@ -218,58 +223,6 @@ if (!empty($all_data)) { // END OF NEWS BOARD. } - $nots = messages_get_overview('utimestamp', 'DESC', false); - if (!empty($nots)) { - // Notifications board. - echo '
'; - - echo ''; - echo ''; - if ($config['prominent_time'] == 'timestamp') { - $comparation_suffix = ''; - } else { - $comparation_suffix = __('ago'); - } - - foreach ($nots as $msg) { - $conversation = io_safe_output( - messages_get_conversation($msg) - ); - - if (is_array($conversation)) { - $text = array_pop($conversation)['message']; - } else { - // Skip empty message. - continue; - } - - $url = ui_get_full_url( - 'index.php?sec=message_list&sec2=operation/messages/message_edit&read_message=1&id_message='.$msg['id_mensaje'] - ); - if ($msg['url'] != '') { - $url = $msg['url']; - } - - echo ''; - echo ''; - echo ''; - } - - echo '
'.__('Pending notifications').'
'.$msg['subject'].'
'; - if ($msg['id_usuario_origen'] != '') { - echo ''.get_user_fullname($msg['id_usuario_origen']).' '; - } - - echo ''.ui_print_timestamp($msg['timestamp'], true).' '.$comparation_suffix.'
'; - echo nl2br($text); - echo '
'; - echo '
'; - - echo '

'; - - // EO Notifications board. - } - // LAST ACTIVITY. // Show last activity from this user. echo '
'; diff --git a/pandora_console/general/register.php b/pandora_console/general/register.php new file mode 100644 index 0000000000..eae4be58b2 --- /dev/null +++ b/pandora_console/general/register.php @@ -0,0 +1,184 @@ + -1], + ['id_user' => $config['id_user']] + ); + + // XXX: Also notify UpdateManager. + } + + if ($register_newsletter) { + $feedback = newsletter_wiz_process(); + } + + if (is_array($feedback)) { + echo json_encode($feedback); + } + + + // Ajax calls finish here. + exit(); +} + + +ui_require_css_file('register'); + +$initial = isset($config['initial_wizard']) !== true + || $config['initial_wizard'] != '1'; + +$newsletter = db_get_value( + 'middlename', + 'tusuario', + 'id_user', + $config['id_user'] +); +$show_newsletter = $newsletter == '0' || $newsletter == ''; + +$registration = isset($config['pandora_uid']) !== true + || $config['pandora_uid'] == ''; + + +if ($initial) { + // Show all forms in order. + // 1- Ask for email, timezone, etc. Fullfill alerts and user mail. + config_wiz_modal( + false, + true, + (($registration === true) ? 'show_registration_wizard()' : null) + ); +} + +if ($registration) { + // Prepare registration wizard, not launch. leave control to flow. + registration_wiz_modal( + false, + // Launch only if not being launch from 'initial'. + !$initial, + (($show_newsletter === true) ? 'force_run_newsletter()' : null) + ); +} else { + if ($show_newsletter) { + // Show newsletter wizard for current user. + newsletter_wiz_modal( + false, + // Launch only if not being call from 'registration'. + !$registration && !$initial + ); + } +} + + +$newsletter = null; + +?> + diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index cee4cb2684..5dc3118def 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -341,7 +341,7 @@ $table_server .= html_print_select( __('None'), 0, true -).'
'.ui_print_help_icon('agent_server', true).'
'; +).'
'; // Description. $table_description = '

'.__('Description').':

'; @@ -368,7 +368,7 @@ echo '
'; if (enterprise_installed()) { $secondary_groups_selected = enterprise_hook('agents_get_secondary_groups', [$id_agente]); - $table_adv_secondary_groups = '

'.__('Secondary groups').': '.ui_print_help_icon('secondary_groups', true).'

'; + $table_adv_secondary_groups = '

'.__('Secondary groups').':

'; $table_adv_secondary_groups_left = html_print_select_groups( false, // Use the current user to select the groups @@ -546,13 +546,13 @@ $params['cascade_protection'] = true; $table_adv_parent .= '
'; $table_adv_parent .= ui_print_agent_autocomplete_input($params); if (enterprise_installed()) { - $table_adv_parent .= html_print_checkbox_switch('cascade_protection', 1, $cascade_protection, true).__('Cascade protection').' '.ui_print_help_icon('cascade_protection', true); + $table_adv_parent .= html_print_checkbox_switch('cascade_protection', 1, $cascade_protection, true).__('Cascade protection').' '; } $table_adv_parent .= __('Module').' '.html_print_select($modules_values, 'cascade_protection_module', $cascade_protection_module, '', '', 0, true).'
'; // Learn mode / Normal mode -$table_adv_module_mode = '

'.__('Module definition').': '.ui_print_help_icon('module_definition', true).'

'; +$table_adv_module_mode = '

'.__('Module definition').':

'; $table_adv_module_mode .= '
'; $table_adv_module_mode .= html_print_radio_button_extended( 'modo', diff --git a/pandora_console/godmode/agentes/agent_wizard.wmi_explorer.php b/pandora_console/godmode/agentes/agent_wizard.wmi_explorer.php index 2a61f02de4..b40cf80855 100644 --- a/pandora_console/godmode/agentes/agent_wizard.wmi_explorer.php +++ b/pandora_console/godmode/agentes/agent_wizard.wmi_explorer.php @@ -317,7 +317,6 @@ $table->data[0][0] = ''.__('Target IP').''; $table->data[0][1] = html_print_input_text('ip_target', $ip_target, '', 15, 60, true); $table->data[0][2] = ''.__('Namespace').''; -$table->data[0][2] .= ui_print_help_icon('wminamespace', true); $table->data[0][3] = html_print_input_text('tcp_send', $tcp_send, '', 15, 60, true); $table->data[1][0] = ''.__('Username').''; diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php index 35674550b3..4e3b399e96 100644 --- a/pandora_console/godmode/agentes/configurar_agente.php +++ b/pandora_console/godmode/agentes/configurar_agente.php @@ -579,11 +579,11 @@ if ($id_agente) { switch ($tab) { case 'main': $tab_description = '- '.__('Setup'); + $help_header = 'main_tab'; break; case 'collection': $tab_description = '- '.__('Collection'); - $help_header = 'collection_tab'; break; case 'inventory': @@ -601,6 +601,8 @@ if ($id_agente) { $tab_description = '- '.__('Modules'); if ($type_module_t == 'webux') { $help_header = 'wux_console'; + } else { + $help_header = 'local_module_tab'; } break; @@ -611,7 +613,6 @@ if ($id_agente) { case 'template': $tab_description = '- '.__('Templates'); - $help_header = 'template_tab'; break; case 'gis': @@ -631,14 +632,17 @@ if ($id_agente) { switch (get_parameter('wizard_section')) { case 'snmp_explorer': $tab_description = '- '.__('SNMP Wizard'); + $help_header = 'agent_snmp_explorer_tab'; break; case 'snmp_interfaces_explorer': $tab_description = '- '.__('SNMP Interfaces wizard'); + $help_header = 'agent_snmp_interfaces_explorer_tab'; break; case 'wmi_explorer': $tab_description = '- '.__('WMI Wizard'); + $help_header = 'agent_snmp_wmi_explorer_tab'; break; default: @@ -1216,6 +1220,7 @@ if ($update_module || $create_module) { // Get macros. $macros = (string) get_parameter('macros'); + $macros_names = (array) get_parameter('macro_name', []); if (!empty($macros)) { $macros = json_decode(base64_decode($macros), true); @@ -1226,10 +1231,18 @@ if ($update_module || $create_module) { $m_hide = $m['hide']; } - if ($m_hide == '1') { - $macros[$k]['value'] = io_input_password(get_parameter($m['macro'], '')); + if ($update_module) { + if ($m_hide == '1') { + $macros[$k]['value'] = io_input_password(get_parameter($m['macro'], '')); + } else { + $macros[$k]['value'] = get_parameter($m['macro'], ''); + } } else { - $macros[$k]['value'] = get_parameter($m['macro'], ''); + if ($m_hide == '1') { + $macros[$k]['value'] = io_input_password($macros_names[$k]); + } else { + $macros[$k]['value'] = $macros_names[$k]; + } } } diff --git a/pandora_console/godmode/agentes/module_manager_editor.php b/pandora_console/godmode/agentes/module_manager_editor.php index 9d49bb0a96..cee4825faa 100644 --- a/pandora_console/godmode/agentes/module_manager_editor.php +++ b/pandora_console/godmode/agentes/module_manager_editor.php @@ -591,7 +591,7 @@ ui_toggle( ); ui_toggle( html_print_table($table_macros, true), - __('Custom macros').ui_print_help_icon('module_macros', true) + __('Custom macros') ); if ($moduletype != 13) { diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index 85114161b6..cb2f071e1c 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -81,7 +81,6 @@ function add_component_selection($id_network_component_type) $data = []; $data[0] = __('Using module component').' '; - $data[0] .= ui_print_help_icon('network_component', true); $component_groups = network_components_get_groups($id_network_component_type); $data[1] = ''; @@ -159,6 +158,7 @@ if ($disabledBecauseInPolicy) { } $update_module_id = (int) get_parameter_get('update_module'); +$edit_module = (bool) get_parameter_get('edit_module'); $table_simple = new stdClass(); $table_simple->id = 'simple'; $table_simple->width = '100%'; @@ -270,7 +270,7 @@ if (!$in_policy) { } } -$table_simple->data[2][0] = __('Type').' '.ui_print_help_icon('module_type', true); +$table_simple->data[2][0] = __('Type').' '.ui_print_help_icon($help_type, true, '', 'images/help_green.png', '', 'module_type_help'); $table_simple->data[2][0] .= html_print_input_hidden('id_module_type_hidden', $id_module_type, true); if (isset($id_agent_module)) { @@ -350,11 +350,40 @@ if (!$edit) { $table_simple->data[2][1] .= html_print_input_hidden('type_names', base64_encode(io_json_mb_encode($type_names_hash)), true); } +if ($edit_module) { + $id_module_type = (int) $id_module_type; + if (($id_module_type >= 1 && $id_module_type <= 5) + || ($id_module_type >= 21 && $id_module_type <= 23) + || ($id_module_type == 100) + ) { + $help_header = 'local_module'; + } + + if ($id_module_type === 6 || $id_module_type === 7 + ) { + $help_header = 'icmp_module_tab'; + } + + if ($id_module_type >= 15 && $id_module_type <= 18) { + $help_header = 'snmp_module_tab'; + } + + if ($id_module_type >= 8 && $id_module_type <= 11) { + $help_header = 'tcp_module_tab'; + } + + if ($id_module_type >= 30 && $id_module_type <= 33) { + $help_header = 'webserver_module_tab'; + } + + $table_simple->data[2][0] = __('Type').' '.ui_print_help_icon($help_header, true); +} + if ($disabledBecauseInPolicy) { $table_simple->data[2][3] .= html_print_input_hidden('id_module_group', $id_module_group, true); } -$table_simple->data[3][0] = __('Dynamic Threshold Interval').' '.ui_print_help_icon('dynamic_threshold', true); +$table_simple->data[3][0] = __('Dynamic Threshold Interval'); $table_simple->data[3][1] = html_print_extended_select_for_time('dynamic_interval', $dynamic_interval, '', 'None', '0', 10, true, 'width:150px', false, $classdisabledBecauseInPolicy, $disabledBecauseInPolicy); $table_simple->data[3][1] .= ''.html_print_image('images/cog.png', true, ['title' => __('Advanced options Dynamic Threshold')]).''; if ($in_policy) { @@ -394,7 +423,7 @@ $table_simple->data[3][2] .= html_print_input_text( $table_simple->data[3][3] = ''.__('Dynamic Threshold Two Tailed: ').''; $table_simple->data[3][3] .= html_print_checkbox('dynamic_two_tailed', 1, $dynamic_two_tailed, true, $disabledBecauseInPolicy); -$table_simple->data[4][0] = __('Warning status').' '.ui_print_help_icon('warning_status', true); +$table_simple->data[4][0] = __('Warning status'); if (!modules_is_string_type($id_module_type) || $edit) { $table_simple->data[4][1] .= ''.__('Min. ').''; $table_simple->data[4][1] .= html_print_input_text( @@ -447,7 +476,7 @@ if (!modules_is_string_type($id_module_type) || $edit) { $table_simple->data[4][2] = ' '; } -$table_simple->data[5][0] = __('Critical status').' '.ui_print_help_icon('critical_status', true); +$table_simple->data[5][0] = __('Critical status'); if (!modules_is_string_type($id_module_type) || $edit) { $table_simple->data[5][1] .= ''.__('Min. ').''; $table_simple->data[5][1] .= html_print_input_text( @@ -498,7 +527,6 @@ $table_simple->data[5][1] .= html_print_checkbox('critical_inverse', 1, $critica // FF stands for Flip-flop. $table_simple->data[6][0] = __('FF threshold').' '; -$table_simple->data[6][0] .= ui_print_help_icon('ff_threshold', true); $table_simple->data[6][1] .= __('Keep counters'); $table_simple->data[6][1] .= html_print_checkbox( @@ -673,15 +701,15 @@ if ($moduletype == MODULE_DATA) { if (isset($id_agente)) { $agent_interval = agents_get_interval($id_agente); $interval_factor = ($interval / $agent_interval); - $table_advanced->data[2][1] = human_time_description_raw($interval).' ('.sprintf(__('Agent interval x %s'), $interval_factor).') '.ui_print_help_icon('module_interval_factor', true); + $table_advanced->data[2][1] = human_time_description_raw($interval).' ('.sprintf(__('Agent interval x %s'), $interval_factor).') '; } else { - $table_advanced->data[2][1] = sprintf(__('Agent interval x %s'), $interval_factor).ui_print_help_icon('module_interval_factor', true); + $table_advanced->data[2][1] = sprintf(__('Agent interval x %s'), $interval_factor); } if ($__code_from == 'policies') { // If is the policy form, module_interval will store the factor (not the seconds). // So server will transform it to interval in seconds - $table_advanced->data[2][1] = sprintf(__('Default').': 1', $interval_factor).ui_print_help_icon('module_interval_factor', true); + $table_advanced->data[2][1] = sprintf(__('Default').': 1', $interval_factor); $table_advanced->data[2][1] .= html_print_input_hidden('module_interval', $interval_factor, true); } else if ($module_id_policy_module != 0) { $table_advanced->data[2][1] .= ui_print_help_tip(__('The policy modules of data type will only update their intervals when policy is applied.'), true); @@ -690,14 +718,14 @@ if ($moduletype == MODULE_DATA) { // If it is a non policy form, the module_interval will not provided and will // be taken the agent interval (this code is at configurar_agente.php) } else { - $table_advanced->data[2][0] = __('Interval').ui_print_help_icon('module_interval', true); + $table_advanced->data[2][0] = __('Interval'); $table_advanced->colspan[2][1] = 2; $table_advanced->data[2][1] = html_print_extended_select_for_time('module_interval', $interval, '', '', '0', false, true, false, false, $classdisabledBecauseInPolicy, $disabledBecauseInPolicy); } $table_advanced->data[2][1] .= html_print_input_hidden('moduletype', $moduletype, true); -$table_advanced->data[2][3] = __('Post process').' '.ui_print_help_icon('postprocess', true); +$table_advanced->data[2][3] = __('Post process'); $table_advanced->data[2][4] = html_print_extended_select_for_post_process( 'post_process', $post_process, @@ -763,7 +791,7 @@ $table_advanced->data[4][4] = html_print_checkbox( ); $table_advanced->colspan[4][4] = 3; -$table_advanced->data[5][0] = __('FF interval').' '.ui_print_help_icon('ff_interval', true); +$table_advanced->data[5][0] = __('FF interval'); $table_advanced->data[5][1] = html_print_input_text( 'module_ff_interval', $ff_interval, @@ -778,7 +806,7 @@ $table_advanced->data[5][1] = html_print_input_text( ).ui_print_help_tip(__('Module execution flip flop time interval (in secs).'), true); $table_advanced->colspan[5][1] = 2; -$table_advanced->data[5][3] = __('FF timeout').' '.ui_print_help_icon('ff_timeout', true); +$table_advanced->data[5][3] = __('FF timeout'); $module_type_name = modules_get_type_name($id_module_type); $table_advanced->data[5][4] = ''; @@ -980,7 +1008,7 @@ $table_advanced->colspan[10][1] = 6; if (isset($id_agente) && $moduletype == MODULE_DATA) { $has_remote_conf = enterprise_hook('config_agents_has_remote_configuration', [$agent['id_agente']]); if ($has_remote_conf) { - $table_advanced->data[11][0] = __('Cron from').ui_print_help_icon('cron', true); + $table_advanced->data[11][0] = __('Cron from'); $table_advanced->data[11][1] = html_print_extended_select_for_cron($hour_from, $minute_from, $mday_from, $month_from, $wday_from, true, $disabledBecauseInPolicy); $table_advanced->colspan[11][1] = 6; @@ -988,7 +1016,7 @@ if (isset($id_agente) && $moduletype == MODULE_DATA) { $table_advanced->data[12][1] = html_print_extended_select_for_cron($hour_to, $minute_to, $mday_to, $month_to, $wday_to, true, $disabledBecauseInPolicy, true); $table_advanced->colspan[12][1] = 6; } else { - $table_advanced->data[11][0] = __('Cron from').ui_print_help_icon('cron', true); + $table_advanced->data[11][0] = __('Cron from'); $table_advanced->data[11][1] = html_print_extended_select_for_cron($hour_from, $minute_from, $mday_from, $month_from, $wday_from, true, true); $table_advanced->colspan[11][1] = 6; @@ -997,7 +1025,7 @@ if (isset($id_agente) && $moduletype == MODULE_DATA) { $table_advanced->colspan[12][1] = 6; } } else { - $table_advanced->data[11][0] = __('Cron from').ui_print_help_icon('cron', true); + $table_advanced->data[11][0] = __('Cron from'); $table_advanced->data[11][1] = html_print_extended_select_for_cron($hour_from, $minute_from, $mday_from, $month_from, $wday_from, true, $disabledBecauseInPolicy); $table_advanced->colspan[11][1] = 6; @@ -1224,7 +1252,124 @@ $(document).ready (function () { var type_names = jQuery.parseJSON(Base64.decode($('#hidden-type_names').val())); var type_name_selected = type_names[type_selected]; - + var element = document.getElementById("module_type_help"); + var language = "" ; + element.onclick = function (event) { + if(type_name_selected == 'async_data' || + type_name_selected == 'async_proc' || + type_name_selected == 'async_string' || + type_name_selected == 'generic_proc'|| + type_name_selected == 'generic_data' || + type_name_selected == 'generic_data_inc' || + type_name_selected == 'generic_data_inc_abs'|| + type_name_selected == 'generic_data_string' || + type_name_selected == 'keep_alive' + ){ + if (language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Operacion&printable=yes#Tipos_de_m.C3.B3dulos', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Operations&printable=yes#Types_of_Modules', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'remote_icmp' || + type_name_selected == 'remote_icmp_proc' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_ICMP', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Remote_Monitoring&printable=yes#ICMP_Monitoring', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'remote_snmp_string' || + type_name_selected == 'remote_snmp_proc' || + type_name_selected == 'remote_snmp_inc' || + type_name_selected == 'remote_snmp' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_remota&printable=yes#Monitorizando_con_m.C3.B3dulos_de_red_tipo_SNMP', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Remote_Monitoring&printable=yes#Monitoring_by_Network_Modules_with_SNMP', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'remote_tcp_string' || + type_name_selected == 'remote_tcp_proc' || + type_name_selected == 'remote_tcp_inc' || + type_name_selected == 'remote_tcp' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_TCP', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Remote_Monitoring&printable=yes#TCP_Monitoring', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'web_data' || + type_name_selected == 'web_proc' || + type_name_selected == 'web_content_data' || + type_name_selected == 'web_content_string' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_web&printable=yes#Creaci.C3.B3n_de_m.C3.B3dulos_web', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Web_Monitoring&printable=yes#Creating_Web_Modules', + '_blank', + 'width=800,height=600' + ); + } + + + } + } + if (type_name_selected.match(/_string$/) == null) { // Numeric types $('#string_critical').hide(); diff --git a/pandora_console/godmode/agentes/module_manager_editor_network.php b/pandora_console/godmode/agentes/module_manager_editor_network.php index 11402c8ca6..306e5f9804 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_network.php +++ b/pandora_console/godmode/agentes/module_manager_editor_network.php @@ -128,7 +128,7 @@ $snmp_versions['2c'] = 'v. 2c'; $snmp_versions['3'] = 'v. 3'; $data = []; -$data[0] = __('SNMP community').ui_print_help_icon('column_macros', true); +$data[0] = __('SNMP community'); $adopt = false; if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK && isset($id_agent_module)) { $adopt = policies_is_module_adopt($id_agent_module); @@ -233,7 +233,7 @@ push_table_simple($data, 'snmp_2'); // Advanced stuff $data = []; -$data[0] = __('TCP send').' '.ui_print_help_icon('tcp_send', true); +$data[0] = __('TCP send'); $data[1] = html_print_textarea('tcp_send', 2, 65, $tcp_send, $disabledTextBecauseInPolicy, true, $largeclassdisabledBecauseInPolicy); $table_simple->colspan['tcp_send'][1] = 3; @@ -277,7 +277,7 @@ if (!isset($id_agent_module)) { } $data = []; -$data[0] = __('Auth user').ui_print_help_icon('column_macros', true); +$data[0] = __('Auth user'); $data[1] = html_print_input_text( 'snmp3_auth_user', $snmp3_auth_user, @@ -290,7 +290,7 @@ $data[1] = html_print_input_text( '', $classdisabledBecauseInPolicy ); -$data[2] = __('Auth password').ui_print_help_icon('column_macros', true).ui_print_help_tip(__('The pass length must be eight character minimum.'), true); +$data[2] = __('Auth password').ui_print_help_tip(__('The pass length must be eight character minimum.'), true); $data[3] = html_print_input_password( 'snmp3_auth_pass', $snmp3_auth_pass, @@ -312,7 +312,7 @@ push_table_simple($data, 'field_snmpv3_row1'); $data = []; $data[0] = __('Privacy method'); $data[1] = html_print_select(['DES' => __('DES'), 'AES' => __('AES')], 'snmp3_privacy_method', $snmp3_privacy_method, '', '', '', true, false, false, '', $disabledBecauseInPolicy); -$data[2] = __('Privacy pass').ui_print_help_icon('column_macros', true).ui_print_help_tip(__('The pass length must be eight character minimum.'), true); +$data[2] = __('Privacy pass').ui_print_help_tip(__('The pass length must be eight character minimum.'), true); $data[3] = html_print_input_password( 'snmp3_privacy_pass', $snmp3_privacy_pass, diff --git a/pandora_console/godmode/agentes/module_manager_editor_plugin.php b/pandora_console/godmode/agentes/module_manager_editor_plugin.php index 6b39172bca..f8fbd46c73 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_plugin.php +++ b/pandora_console/godmode/agentes/module_manager_editor_plugin.php @@ -79,7 +79,7 @@ push_table_simple($data, 'plugin_1'); $data = []; $data[0] = 'macro_desc'; $data[0] .= ui_print_help_tip('macro_help', true); -$data[1] = html_print_input_text('macro_name', 'macro_value', '', 100, 1024, true); +$data[1] = html_print_input_text('macro_name[]', 'macro_value', '', 100, 1024, true); $table_simple->colspan['macro_field'][1] = 3; $table_simple->rowstyle['macro_field'] = 'display:none'; diff --git a/pandora_console/godmode/agentes/module_manager_editor_wmi.php b/pandora_console/godmode/agentes/module_manager_editor_wmi.php index d15cd6477f..6ad7311179 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_wmi.php +++ b/pandora_console/godmode/agentes/module_manager_editor_wmi.php @@ -42,7 +42,7 @@ if (empty($update_module_id)) { } $data = []; -$data[0] = __('Target IP'); +$data[0] = __('Target IP').' '.ui_print_help_icon('wmi_module_tab', true); $data[1] = html_print_input_text('ip_target', $ip_target, '', 15, 60, true); $data[2] = __('Namespace').ui_print_help_tip(__('Optional. WMI namespace. If unsure leave blank.'), true); $data[3] = html_print_input_text( @@ -60,7 +60,7 @@ $data[3] = html_print_input_text( push_table_simple($data, 'target_ip'); $data = []; -$data[0] = __('Username').ui_print_help_icon('column_macros', true); +$data[0] = __('Username'); $data[1] = html_print_input_text( 'plugin_user', $plugin_user, @@ -73,7 +73,7 @@ $data[1] = html_print_input_text( '', $classdisabledBecauseInPolicy ); -$data[2] = __('Password').ui_print_help_icon('column_macros', true); +$data[2] = __('Password'); $data[3] = html_print_input_password( 'plugin_pass', $plugin_pass, @@ -91,7 +91,6 @@ push_table_simple($data, 'user_pass'); $data = []; $data[0] = __('WMI query'); -$data[0] .= ui_print_help_icon('wmiquery', true); $data[1] = html_print_input_text( 'snmp_oid', $snmp_oid, diff --git a/pandora_console/godmode/agentes/planned_downtime.editor.php b/pandora_console/godmode/agentes/planned_downtime.editor.php index c8c8748178..eef8d5fbdf 100644 --- a/pandora_console/godmode/agentes/planned_downtime.editor.php +++ b/pandora_console/godmode/agentes/planned_downtime.editor.php @@ -1,16 +1,32 @@ "".html_print_image('images/list.png', true, ['title' => __('List')]).'', + 'text' => "".html_print_image( + 'images/list.png', + true, + ['title' => __('List')] + ).'', ]; -// Header +// Header. ui_print_page_header( __('Planned Downtime'), 'images/gm_monitoring.png', false, - 'planned_downtime', + 'planned_downtime_editor', true, $buttons ); -// recursion group filter +// Recursion group filter. $recursion = get_parameter('recursion', $_POST['recursion']); -// Initialize data -$id_group = (int) get_parameter('id_group'); -$name = (string) get_parameter('name'); -$description = (string) get_parameter('description'); +// Initialize data. +$id_group = (int) get_parameter('id_group'); +$name = (string) get_parameter('name'); +$description = (string) get_parameter('description'); -$type_downtime = (string) get_parameter('type_downtime', 'quiet'); -$type_execution = (string) get_parameter('type_execution', 'once'); -$type_periodicity = (string) get_parameter('type_periodicity', 'weekly'); +$type_downtime = (string) get_parameter('type_downtime', 'quiet'); +$type_execution = (string) get_parameter('type_execution', 'once'); +$type_periodicity = (string) get_parameter('type_periodicity', 'weekly'); $utimestamp = get_system_time(); -// Fake utimestamp to retrieve the string date of the system +// Fake utimestamp to retrieve the string date of the system. $system_time = ($utimestamp - get_fixed_offset()); -$once_date_from = (string) get_parameter('once_date_from', date(DATE_FORMAT, $utimestamp)); -$once_time_from = (string) get_parameter('once_time_from', date(TIME_FORMAT, $utimestamp)); -$once_date_to = (string) get_parameter('once_date_to', date(DATE_FORMAT, $utimestamp)); -$once_time_to = (string) get_parameter('once_time_to', date(TIME_FORMAT, ($utimestamp + SECONDS_1HOUR))); +$once_date_from = (string) get_parameter( + 'once_date_from', + date(DATE_FORMAT, $utimestamp) +); +$once_time_from = (string) get_parameter( + 'once_time_from', + date(TIME_FORMAT, $utimestamp) +); +$once_date_to = (string) get_parameter( + 'once_date_to', + date(DATE_FORMAT, $utimestamp) +); +$once_time_to = (string) get_parameter( + 'once_time_to', + date(TIME_FORMAT, ($utimestamp + SECONDS_1HOUR)) +); -$periodically_day_from = (int) get_parameter('periodically_day_from', 1); -$periodically_day_to = (int) get_parameter('periodically_day_to', 31); -$periodically_time_from = (string) get_parameter('periodically_time_from', date(TIME_FORMAT, $system_time)); -$periodically_time_to = (string) get_parameter('periodically_time_to', date(TIME_FORMAT, ($system_time + SECONDS_1HOUR))); +$periodically_day_from = (int) get_parameter( + 'periodically_day_from', + 1 +); +$periodically_day_to = (int) get_parameter( + 'periodically_day_to', + 31 +); +$periodically_time_from = (string) get_parameter( + 'periodically_time_from', + date(TIME_FORMAT, $system_time) +); +$periodically_time_to = (string) get_parameter( + 'periodically_time_to', + date(TIME_FORMAT, ($system_time + SECONDS_1HOUR)) +); -$monday = (bool) get_parameter('monday'); -$tuesday = (bool) get_parameter('tuesday'); -$wednesday = (bool) get_parameter('wednesday'); -$thursday = (bool) get_parameter('thursday'); -$friday = (bool) get_parameter('friday'); -$saturday = (bool) get_parameter('saturday'); -$sunday = (bool) get_parameter('sunday'); +$monday = (bool) get_parameter('monday'); +$tuesday = (bool) get_parameter('tuesday'); +$wednesday = (bool) get_parameter('wednesday'); +$thursday = (bool) get_parameter('thursday'); +$friday = (bool) get_parameter('friday'); +$saturday = (bool) get_parameter('saturday'); +$sunday = (bool) get_parameter('sunday'); -$first_create = (int) get_parameter('first_create'); -$create_downtime = (int) get_parameter('create_downtime'); -$update_downtime = (int) get_parameter('update_downtime'); -$edit_downtime = (int) get_parameter('edit_downtime'); -$id_downtime = (int) get_parameter('id_downtime'); +$first_create = (int) get_parameter('first_create'); +$create_downtime = (int) get_parameter('create_downtime'); +$update_downtime = (int) get_parameter('update_downtime'); +$edit_downtime = (int) get_parameter('edit_downtime'); +$id_downtime = (int) get_parameter('id_downtime'); -$id_agent = (int) get_parameter('id_agent'); -$insert_downtime_agent = (int) get_parameter('insert_downtime_agent'); -$delete_downtime_agent = (int) get_parameter('delete_downtime_agent'); +$id_agent = (int) get_parameter('id_agent'); +$insert_downtime_agent = (int) get_parameter('insert_downtime_agent'); +$delete_downtime_agent = (int) get_parameter('delete_downtime_agent'); $modules_selection_mode = (string) get_parameter('modules_selection_mode'); -// User groups with AD or AW permission for ACL checks -$user_groups_ad = array_keys(users_get_groups($config['id_user'], $access)); +// User groups with AD or AW permission for ACL checks. +$user_groups_ad = array_keys( + users_get_groups($config['id_user'], $access) +); -// INSERT A NEW DOWNTIME_AGENT ASSOCIATION +// INSERT A NEW DOWNTIME_AGENT ASSOCIATION. if ($insert_downtime_agent === 1) { - // Check AD permission on downtime - $downtime_group = db_get_value('id_group', 'tplanned_downtime', 'id', $id_downtime); + // Check AD permission on downtime. + $downtime_group = db_get_value( + 'id_group', + 'tplanned_downtime', + 'id', + $id_downtime + ); - if ($downtime_group === false || !in_array($downtime_group, $user_groups_ad)) { + if ($downtime_group === false + || !in_array($downtime_group, $user_groups_ad) + ) { db_pandora_audit( 'ACL Violation', 'Trying to access downtime scheduler' @@ -116,17 +169,27 @@ if ($insert_downtime_agent === 1) { $all_modules = (empty($module_names) || ($module_names[0] === '0')); - // 'Is running' check - $is_running = (bool) db_get_value('executed', 'tplanned_downtime', 'id', $id_downtime); + // 'Is running' check. + $is_running = (bool) db_get_value( + 'executed', + 'tplanned_downtime', + 'id', + $id_downtime + ); if ($is_running) { - ui_print_error_message(__('This elements cannot be modified while the downtime is being executed')); + ui_print_error_message( + __('This elements cannot be modified while the downtime is being executed') + ); } else { foreach ($agents as $agent_id) { - // check module belongs to the agent + // Check module belongs to the agent. if ($modules_selection_mode == 'all') { $check = false; foreach ($module_names as $module_name) { - $check_module = modules_get_agentmodule_id($module_name, $agent_id); + $check_module = modules_get_agentmodule_id( + $module_name, + $agent_id + ); if (!empty($check_module)) { $check = true; } @@ -137,10 +200,17 @@ if ($insert_downtime_agent === 1) { } } - // Check AD permission on agent - $agent_group = db_get_value('id_grupo', 'tagente', 'id_agente', $agent_id); + // Check AD permission on agent. + $agent_group = db_get_value( + 'id_grupo', + 'tagente', + 'id_agente', + $agent_id + ); - if ($agent_group === false || !in_array($agent_group, $user_groups_ad)) { + if ($agent_group === false + || !in_array($agent_group, $user_groups_ad) + ) { continue; } @@ -149,11 +219,17 @@ if ($insert_downtime_agent === 1) { 'id_agent' => $agent_id, 'all_modules' => $all_modules, ]; - $result = db_process_sql_insert('tplanned_downtime_agents', $values); + $result = db_process_sql_insert( + 'tplanned_downtime_agents', + $values + ); if ($result && !$all_modules) { foreach ($module_names as $module_name) { - $module = modules_get_agentmodule_id($module_name, $agent_id); + $module = modules_get_agentmodule_id( + $module_name, + $agent_id + ); if (empty($module)) { continue; @@ -164,7 +240,10 @@ if ($insert_downtime_agent === 1) { 'id_agent' => $agent_id, 'id_agent_module' => $module['id_agente_modulo'], ]; - $result = db_process_sql_insert('tplanned_downtime_modules', $values); + $result = db_process_sql_insert( + 'tplanned_downtime_modules', + $values + ); if ($result) { $values = ['id_user' => $config['id_user']]; @@ -180,14 +259,21 @@ if ($insert_downtime_agent === 1) { } } -// DELETE A DOWNTIME_AGENT ASSOCIATION +// DELETE A DOWNTIME_AGENT ASSOCIATION. if ($delete_downtime_agent === 1) { $id_da = (int) get_parameter('id_downtime_agent'); - // Check AD permission on downtime - $downtime_group = db_get_value('id_group', 'tplanned_downtime', 'id', $id_downtime); + // Check AD permission on downtime. + $downtime_group = db_get_value( + 'id_group', + 'tplanned_downtime', + 'id', + $id_downtime + ); - if ($downtime_group === false || !in_array($downtime_group, $user_groups_ad)) { + if ($downtime_group === false + || !in_array($downtime_group, $user_groups_ad) + ) { db_pandora_audit( 'ACL Violation', 'Trying to access downtime scheduler' @@ -196,10 +282,17 @@ if ($delete_downtime_agent === 1) { return; } - // Check AD permission on agent - $agent_group = db_get_value('id_grupo', 'tagente', 'id_agente', $id_agent); + // Check AD permission on agent. + $agent_group = db_get_value( + 'id_grupo', + 'tagente', + 'id_agente', + $id_agent + ); - if ($agent_group === false || !in_array($agent_group, $user_groups_ad)) { + if ($agent_group === false + || !in_array($agent_group, $user_groups_ad) + ) { db_pandora_audit( 'ACL Violation', 'Trying to access downtime scheduler' @@ -208,17 +301,27 @@ if ($delete_downtime_agent === 1) { return; } - // 'Is running' check - $is_running = (bool) db_get_value('executed', 'tplanned_downtime', 'id', $id_downtime); + // 'Is running' check. + $is_running = (bool) db_get_value( + 'executed', + 'tplanned_downtime', + 'id', + $id_downtime + ); if ($is_running) { - ui_print_error_message(__('This elements cannot be modified while the downtime is being executed')); + ui_print_error_message( + __('This elements cannot be modified while the downtime is being executed') + ); } else { $row_to_delete = db_get_row('tplanned_downtime_agents', 'id', $id_da); - $result = db_process_sql_delete('tplanned_downtime_agents', ['id' => $id_da]); + $result = db_process_sql_delete( + 'tplanned_downtime_agents', + ['id' => $id_da] + ); if ($result) { - // Delete modules in downtime + // Delete modules in downtime. db_process_sql_delete( 'tplanned_downtime_modules', [ @@ -230,7 +333,7 @@ if ($delete_downtime_agent === 1) { } } -// UPDATE OR CREATE A DOWNTIME (MAIN DATA, NOT AGENT ASSOCIATION) +// UPDATE OR CREATE A DOWNTIME (MAIN DATA, NOT AGENT ASSOCIATION). if ($create_downtime || $update_downtime) { $check = (bool) db_get_value('name', 'tplanned_downtime', 'name', $name); @@ -239,22 +342,32 @@ if ($create_downtime || $update_downtime) { $now = time(); if ($type_execution == 'once' && !$config['past_planned_downtimes'] && $datetime_from < $now) { - ui_print_error_message(__('Not created. Error inserting data. Start time must be higher than the current time')); + ui_print_error_message( + __('Not created. Error inserting data. Start time must be higher than the current time') + ); } else if ($type_execution == 'once' && $datetime_from >= $datetime_to) { - ui_print_error_message(__('Not created. Error inserting data').'. '.__('The end date must be higher than the start date')); + ui_print_error_message( + __('Not created. Error inserting data').'. '.__('The end date must be higher than the start date') + ); } else if ($type_execution == 'once' && $datetime_to <= $now && !$config['past_planned_downtimes']) { - ui_print_error_message(__('Not created. Error inserting data').'. '.__('The end date must be higher than the current time')); + ui_print_error_message( + __('Not created. Error inserting data').'. '.__('The end date must be higher than the current time') + ); } else if ($type_execution == 'periodically' && (($type_periodicity == 'weekly' && $periodically_time_from >= $periodically_time_to) || ($type_periodicity == 'monthly' && $periodically_day_from == $periodically_day_to && $periodically_time_from >= $periodically_time_to)) ) { - ui_print_error_message(__('Not created. Error inserting data').'. '.__('The end time must be higher than the start time')); + ui_print_error_message( + __('Not created. Error inserting data').'. '.__('The end time must be higher than the start time') + ); } else if ($type_execution == 'periodically' && $type_periodicity == 'monthly' && $periodically_day_from > $periodically_day_to) { - ui_print_error_message(__('Not created. Error inserting data').'. '.__('The end day must be higher than the start day')); + ui_print_error_message( + __('Not created. Error inserting data').'. '.__('The end day must be higher than the start day') + ); } else { $sql = ''; if ($create_downtime) { - // Check AD permission on new downtime + // Check AD permission on new downtime. if (!in_array($id_group, $user_groups_ad)) { db_pandora_audit( 'ACL Violation', @@ -295,7 +408,10 @@ if ($create_downtime || $update_downtime) { $values['periodically_time_to'] = '1970/01/01 '.$values['periodically_time_to']; } - $result = db_process_sql_insert('tplanned_downtime', $values); + $result = db_process_sql_insert( + 'tplanned_downtime', + $values + ); } else { ui_print_error_message( __('Each planned downtime must have a different name') @@ -309,7 +425,7 @@ if ($create_downtime || $update_downtime) { } else if ($update_downtime) { $old_downtime = db_get_row('tplanned_downtime', 'id', $id_downtime); - // Check AD permission on OLD downtime + // Check AD permission on OLD downtime. if (empty($old_downtime) || !in_array($old_downtime['id_group'], $user_groups_ad)) { db_pandora_audit( 'ACL Violation', @@ -319,7 +435,7 @@ if ($create_downtime || $update_downtime) { return; } - // Check AD permission on NEW downtime group + // Check AD permission on NEW downtime group. if (!in_array($id_group, $user_groups_ad)) { db_pandora_audit( 'ACL Violation', @@ -329,14 +445,17 @@ if ($create_downtime || $update_downtime) { return; } - // 'Is running' check + // 'Is running' check. $is_running = (bool) $old_downtime['executed']; $values = []; if (trim(io_safe_output($name)) == '') { - ui_print_error_message(__('Planned downtime must have a name')); + ui_print_error_message( + __('Planned downtime must have a name') + ); } - // When running only certain items can be modified for the 'once' type + + // When running only certain items can be modified for the 'once' type. else if ($is_running && $type_execution == 'once') { $values = [ 'description' => $description, @@ -344,7 +463,9 @@ if ($create_downtime || $update_downtime) { 'id_user' => $config['id_user'], ]; } else if ($is_running) { - ui_print_error_message(__('Cannot be modified while the downtime is being executed')); + ui_print_error_message( + __('Cannot be modified while the downtime is being executed') + ); } else { $values = [ 'name' => $name, @@ -376,7 +497,11 @@ if ($create_downtime || $update_downtime) { } if (!empty($values)) { - $result = db_process_sql_update('tplanned_downtime', $values, ['id' => $id_downtime]); + $result = db_process_sql_update( + 'tplanned_downtime', + $values, + ['id' => $id_downtime] + ); } } @@ -399,7 +524,7 @@ if ($create_downtime || $update_downtime) { // Have any data to show ? if ($id_downtime > 0) { - // Columns of the table tplanned_downtime + // Columns of the table tplanned_downtime. $columns = [ 'id', 'name', @@ -436,7 +561,8 @@ if ($id_downtime > 0) { break; case 'oracle': - // Oracle doesn't have TIME type, so we should transform the DATE value + // Oracle doesn't have TIME type, + // so we should transform the DATE value. $new_time_from = "TO_CHAR(periodically_time_from, 'HH24:MI:SS') AS periodically_time_from"; $new_time_to = "TO_CHAR(periodically_time_to, 'HH24:MI:SS') AS periodically_time_to"; @@ -500,7 +626,8 @@ if ($id_downtime > 0) { $running = (bool) $result['executed']; } -// when the planned downtime is in execution, only action to postpone on once type is enabled and the other are disabled. +// When the planned downtime is in execution, +// only action to postpone on once type is enabled and the other are disabled. $disabled_in_execution = (int) $running; $table = new StdClass(); @@ -508,11 +635,40 @@ $table->class = 'databox filters'; $table->width = '100%'; $table->data = []; $table->data[0][0] = __('Name'); -$table->data[0][1] = html_print_input_text('name', $name, '', 25, 40, true, $disabled_in_execution); +$table->data[0][1] = html_print_input_text( + 'name', + $name, + '', + 25, + 40, + true, + $disabled_in_execution +); $table->data[1][0] = __('Group'); -$table->data[1][1] = html_print_select_groups(false, $access, true, 'id_group', $id_group, '', '', 0, true, false, true, '', $disabled_in_execution); +$table->data[1][1] = html_print_select_groups( + false, + $access, + true, + 'id_group', + $id_group, + '', + '', + 0, + true, + false, + true, + '', + $disabled_in_execution +); $table->data[2][0] = __('Description'); -$table->data[2][1] = html_print_textarea('description', 3, 35, $description, '', true); +$table->data[2][1] = html_print_textarea( + 'description', + 3, + 35, + $description, + '', + true +); $table->data[3][0] = __('Type').ui_print_help_tip( __('Quiet: Modules will not generate events or fire alerts.').'
'.__('Disable Agents: Disables the selected agents.').'
'.__('Disable Alerts: Disable alerts for the selected agents.'), @@ -554,7 +710,7 @@ $table->data[4][1] = html_print_select( ); $days = array_combine(range(1, 31), range(1, 31)); -$table->data[5][0] = __('Configure the time').' '.ui_print_help_icon('planned_downtime_time', true); +$table->data[5][0] = __('Configure the time').' '; ; $table->data[5][1] = "
"; } -// Editor form +// Editor form. html_print_table($table); html_print_input_hidden('id_agent', $id_agent); @@ -686,10 +842,20 @@ echo '
'; if ($id_downtime > 0) { html_print_input_hidden('update_downtime', 1); html_print_input_hidden('id_downtime', $id_downtime); - html_print_submit_button(__('Update'), 'updbutton', false, 'class="sub upd"'); + html_print_submit_button( + __('Update'), + 'updbutton', + false, + 'class="sub upd"' + ); } else { html_print_input_hidden('create_downtime', 1); - html_print_submit_button(__('Add'), 'crtbutton', false, 'class="sub wand"'); + html_print_submit_button( + __('Add'), + 'crtbutton', + false, + 'class="sub wand"' + ); } echo '
'; @@ -700,11 +866,11 @@ if ($id_downtime > 0) { $filter_group = (int) get_parameter('filter_group', 0); - // User AD groups to str for the filter + // User AD groups to str for the filter. $id_groups_str = implode(',', $user_groups_ad); if (empty($id_groups_str)) { - // Restrictive filter on error. This will filter all the downtimes + // Restrictive filter on error. This will filter all the downtimes. $id_groups_str = '-1'; } @@ -752,7 +918,7 @@ if ($id_downtime > 0) { $agent_ids = extract_column($agents, 'id_agente'); $agent_names = extract_column($agents, 'alias'); - // item[] = ; + $agents = array_combine($agent_ids, $agent_names); if ($agents === false) { $agents = []; @@ -763,7 +929,6 @@ if ($id_downtime > 0) { $disabled_add_button = true; } - echo ""; html_print_select_groups(false, $access, true, 'filter_group', $filter_group, '', '', '', false, false, true, '', false, 'min-width:180px;margin-right:15px;'); @@ -803,7 +968,10 @@ if ($id_downtime > 0) { ); echo ''; - echo '

'.__('Available modules:').ui_print_help_tip(__('Only for type Quiet for downtimes.'), true).'

'; + echo '

'.__('Available modules:').ui_print_help_tip( + __('Only for type Quiet for downtimes.'), + true + ).'

'; if ($type_downtime != 'quiet') { echo '
'; - // Start Overview of existing planned downtime + // Start Overview of existing planned downtime. echo '

'.__('Agents planned for this downtime').':

'; - // User the $id_groups_str built before + // User the $id_groups_str built before. $sql = sprintf( 'SELECT ta.nombre, tpda.id, ta.id_os, ta.id_agente, ta.id_grupo, @@ -860,13 +1047,18 @@ if ($id_downtime > 0) { foreach ($downtimes_agents as $downtime_agent) { $data = []; - $alias = db_get_value('alias', 'tagente', 'id_agente', $downtime_agent['id_agente']); + $alias = db_get_value( + 'alias', + 'tagente', + 'id_agente', + $downtime_agent['id_agente'] + ); $data[0] = $alias; $data[1] = db_get_sql( 'SELECT nombre - FROM tgrupo - WHERE id_grupo = '.$downtime_agent['id_grupo'] + FROM tgrupo + WHERE id_grupo = '.$downtime_agent['id_grupo'] ); $data[2] = ui_print_os_icon($downtime_agent['id_os'], true, true); @@ -887,7 +1079,9 @@ if ($id_downtime > 0) { if (!$running) { $data[5] = ''; - if ($type_downtime != 'disable_agents_alerts' && $type_downtime != 'disable_agents') { + if ($type_downtime != 'disable_agents_alerts' + && $type_downtime != 'disable_agents' + ) { $data[5] = '
'.html_print_image('images/config.png', true, ['border' => '0', 'alt' => __('Delete')]).''; } diff --git a/pandora_console/godmode/agentes/planned_downtime.list.php b/pandora_console/godmode/agentes/planned_downtime.list.php index a9529248b0..961ea1f7d0 100755 --- a/pandora_console/godmode/agentes/planned_downtime.list.php +++ b/pandora_console/godmode/agentes/planned_downtime.list.php @@ -50,7 +50,7 @@ if ($migrate_malformed) { } } -// Header +// Header. ui_print_page_header( __('Planned Downtime'), 'images/gm_monitoring.png', @@ -115,7 +115,7 @@ if ($delete_downtime) { } } -// Filter parameters +// Filter parameters. $offset = (int) get_parameter('offset'); $filter_params = []; @@ -131,7 +131,7 @@ $module_name = $filter_params['module_name'] = (string) (!empty($module_ $filter_params_str = http_build_query($filter_params); -// Table filter +// Table filter. $table_form = new StdClass(); $table_form->class = 'databox filters'; $table_form->width = '100%'; @@ -143,9 +143,9 @@ $table_form->data = []; $row = []; -// Search text +// Search text. $row[] = __('Search').' '.html_print_input_text('search_text', $search_text, '', 50, 250, true); -// Dates +// Dates. $date_inputs = __('From').' '.html_print_input_text('date_from', $date_from, '', 10, 10, true); $date_inputs .= '  '; $date_inputs .= __('To').' '.html_print_input_text('date_to', $date_to, '', 10, 10, true); @@ -155,20 +155,20 @@ $table_form->data[] = $row; $row = []; -// Execution type +// Execution type. $execution_type_fields = [ 'once' => __('Once'), 'periodically' => __('Periodically'), ]; $row[] = __('Execution type').' '.html_print_select($execution_type_fields, 'execution_type', $execution_type, '', __('Any'), '', true, false, false); -// Show past downtimes +// Show past downtimes. $row[] = __('Show past downtimes').' '.html_print_checkbox('archived', 1, $show_archived, true); $table_form->data[] = $row; $row = []; -// Agent +// Agent. $params = []; $params['show_helptip'] = true; $params['input_name'] = 'agent_name'; @@ -180,14 +180,14 @@ $params['hidden_input_idagent_value'] = $agent_id; $agent_input = __('Agent').' '.ui_print_agent_autocomplete_input($params); $row[] = $agent_input; -// Module +// Module. $row[] = __('Module').' '.html_print_autocomplete_modules('module_name', $module_name, false, true, '', [], true); $row[] = html_print_submit_button(__('Search'), 'search', false, 'class="sub search"', true); $table_form->data[] = $row; -// End of table filter -// Useful to know if the user has done a form filtering +// End of table filter. +// Useful to know if the user has done a form filtering. $filter_performed = false; $groups = users_get_groups(false, $access); @@ -197,7 +197,7 @@ if (!empty($groups)) { $groups_string = implode(',', array_keys($groups)); $where_values .= " AND id_group IN ($groups_string)"; - // WARNING: add $filter_performed = true; to any future filter + // WARNING: add $filter_performed = true; to any future filter. if (!empty($search_text)) { $filter_performed = true; @@ -272,7 +272,7 @@ if (!empty($groups)) { AND tpda.all_modules = 1))"; } - // Columns of the table tplanned_downtime + // Columns of the table tplanned_downtime. $columns = [ 'id', 'name', @@ -353,23 +353,23 @@ if (!empty($groups)) { $downtimes = []; } -// No downtimes cause the user has not anyone +// No downtimes cause the user has not anyone. if (!$downtimes && !$filter_performed) { include_once $config['homedir'].'/general/firts_task/planned_downtime.php'; } -// No downtimes cause the user performed a search +// No downtimes cause the user performed a search. else if (!$downtimes) { - // Filter form + // Filter form. echo "
"; html_print_table($table_form); echo '
'; - // Info message + // Info message. echo '
'.__('No planned downtime').'
'; echo '
'; - // Create button + // Create button. if ($write_permisson) { echo ' '; echo '
'; @@ -379,7 +379,7 @@ else if (!$downtimes) { echo '
'; } -// Has downtimes +// Has downtimes. else { echo ""; html_print_table($table_form); @@ -387,11 +387,11 @@ else { ui_pagination($downtimes_number, "index.php?sec=estado&sec2=godmode/agentes/planned_downtime.list&$filter_params_str", $offset); - // User groups with AR, AD or AW permission + // User groups with AR, AD or AW permission. $groupsAD = users_get_groups($config['id_user'], $access); $groupsAD = array_keys($groupsAD); - // View available downtimes present in database (if any of them) + // View available downtimes present in database (if any of them). $table = new StdClass(); $table->class = 'info_table'; $table->width = '100%'; @@ -475,7 +475,7 @@ else { ); } - // If user have writting permissions + // If user have writting permissions. if (in_array($downtime['id_group'], $groupsAD)) { // Stop button if ($downtime['type_execution'] == 'once' && $downtime['executed'] == 1) { @@ -484,16 +484,16 @@ else { $data['stop'] = ''; } - // Edit & delete buttons + // Edit & delete buttons. if ($downtime['executed'] == 0) { - // Edit + // Edit. $data['edit'] = ''.html_print_image('images/config.png', true, ['title' => __('Update')]).''; - // Delete + // Delete. $data['delete'] = ''.html_print_image('images/cross.png', true, ['title' => __('Delete')]); } else if ($downtime['executed'] == 1 && $downtime['type_execution'] == 'once') { - // Edit + // Edit. $data['edit'] = ''.html_print_image('images/config.png', true, ['title' => __('Update')]).''; - // Delete + // Delete. $data['delete'] = __('N/A'); } else { $data['edit'] = ''; @@ -521,7 +521,7 @@ else { ui_pagination($downtimes_number, "index.php?sec=estado&sec2=godmode/agentes/planned_downtime.list&$filter_params_str", $offset, 0, false, 'offset', true, 'pagination-bottom'); echo '
'; - // CSV export button + // CSV export button. echo '
'; html_print_button( __('Export to CSV'), @@ -532,7 +532,7 @@ else { ); echo '
'; - // Create button + // Create button. if ($write_permisson) { echo ' '; echo ''; diff --git a/pandora_console/godmode/alerts/alert_actions.php b/pandora_console/godmode/alerts/alert_actions.php index 0de86bf070..b0a88eeec0 100644 --- a/pandora_console/godmode/alerts/alert_actions.php +++ b/pandora_console/godmode/alerts/alert_actions.php @@ -62,7 +62,7 @@ if ((!$copy_action) && (!$delete_action)) { if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { - ui_print_page_header(__('Alerts').' » '.__('Alert actions'), 'images/gm_alerts.png', false, 'alerts_config', true); + ui_print_page_header(__('Alerts').' » '.__('Alert actions'), 'images/gm_alerts.png', false, 'alerts_action', true); } } diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 2f8fb2dc04..7fa2b9a3f0 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -68,10 +68,6 @@ if (is_ajax()) { $fields_rows = []; for ($i = 1; $i <= $config['max_macro_fields']; $i++) { - if (($i == 5) && ($command['id'] == 3)) { - continue; - } - $field_description = $fields_descriptions[($i - 1)]; $field_value = $fields_values[($i - 1)]; $field_hidden = $fields_hidden_checked[($i - 1)]; @@ -88,9 +84,7 @@ if (is_ajax()) { // If the field is the number one, print the help message. if ($i == 1) { // If our context is snmpconsole, show snmp_alert helps. - if ((isset($_SERVER['HTTP_REFERER'])) && ( preg_match('/snmp_alert/', $_SERVER['HTTP_REFERER']) > 0 )) { - $fdesc .= ui_print_help_icon('snmp_alert_field1', true); - } else { + if ((!isset($_SERVER['HTTP_REFERER'])) && ( preg_match('/snmp_alert/', $_SERVER['HTTP_REFERER']) > 0 )) { $fdesc .= ui_print_help_icon('alert_config', true); } } @@ -255,10 +249,6 @@ if (is_ajax()) { } // If command is PandoraFMS event, field 5 must be empty because "severity" must be set by the alert. - if ($command['id'] == 3) { - $fields_rows[5] = ''; - } - $command['fields_rows'] = $fields_rows; echo json_encode($command); @@ -278,7 +268,13 @@ if ($update_command) { if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { - ui_print_page_header(__('Alerts').' » '.__('Alert commands'), 'images/gm_alerts.png', false, 'alerts_config', true); + ui_print_page_header( + __('Alerts').' » '.__('Alert commands'), + 'images/gm_alerts.png', + false, + 'alerts_command_tab', + true + ); } if ($create_command) { diff --git a/pandora_console/godmode/alerts/alert_list.builder.php b/pandora_console/godmode/alerts/alert_list.builder.php index 97d4c951bc..ca3a099bf3 100644 --- a/pandora_console/godmode/alerts/alert_list.builder.php +++ b/pandora_console/godmode/alerts/alert_list.builder.php @@ -124,11 +124,7 @@ $table->data[1][1] .= __('Number of alerts match from').' '; $table->data[1][1] .= html_print_input_text('fires_min', '', '', 4, 10, true); $table->data[1][1] .= ' '.__('to').' '; $table->data[1][1] .= html_print_input_text('fires_max', '', '', 4, 10, true); -$table->data[1][1] .= ui_print_help_icon( - 'alert-matches', - true, - ui_get_full_url(false, false, false, false) -); + $table->data[1][1] .= ''; if (check_acl($config['id_user'], 0, 'LM')) { $table->data[1][1] .= ''; @@ -172,8 +168,7 @@ if ($own_info['is_admin'] || check_acl($config['id_user'], 0, 'PM')) { $table->data[3][0] = __('Threshold'); $table->data[3][1] = html_print_input_text('module_action_threshold', '0', '', 5, 7, true); - $table->data[3][1] .= ' '.__('seconds').ui_print_help_icon('action_threshold', true); - + $table->data[3][1] .= ' '.__('seconds'); if (!isset($step)) { echo ''; diff --git a/pandora_console/godmode/alerts/alert_list.list.php b/pandora_console/godmode/alerts/alert_list.list.php index e7a013d971..4b3a3395cf 100644 --- a/pandora_console/godmode/alerts/alert_list.list.php +++ b/pandora_console/godmode/alerts/alert_list.list.php @@ -700,20 +700,41 @@ foreach ($simple_alerts as $alert) { $data[2] .= ''; $data[2] .= ''; $data[2] .= ''; - $data[2] .= __('Number of alerts match from').' '.ui_print_help_icon('alert-matches', true, ui_get_full_url(false, false, false, false)); + $data[2] .= __('Number of alerts match from'); $data[2] .= ''; $data[2] .= ''; - $data[2] .= html_print_input_text('fires_min', 0, '', 4, 10, true); + $data[2] .= html_print_input_text( + 'fires_min', + 0, + '', + 4, + 10, + true + ); $data[2] .= ' '.__('to').' '; - $data[2] .= html_print_input_text('fires_max', 0, '', 4, 10, true); + $data[2] .= html_print_input_text( + 'fires_max', + 0, + '', + 4, + 10, + true + ); $data[2] .= ''; $data[2] .= ''; $data[2] .= ''; $data[2] .= ''; - $data[2] .= __('Threshold').' '.ui_print_help_icon('action_threshold', true, ui_get_full_url(false, false, false, false)); + $data[2] .= __('Threshold'); $data[2] .= ''; $data[2] .= ''; - $data[2] .= html_print_input_text('module_action_threshold', '', '', 4, 10, true); + $data[2] .= html_print_input_text( + 'module_action_threshold', + '', + '', + 4, + 10, + true + ); $data[2] .= ''; $data[2] .= ''; $data[2] .= ''; diff --git a/pandora_console/godmode/alerts/alert_special_days.php b/pandora_console/godmode/alerts/alert_special_days.php index 45c69019c3..7dd02c28bd 100644 --- a/pandora_console/godmode/alerts/alert_special_days.php +++ b/pandora_console/godmode/alerts/alert_special_days.php @@ -41,7 +41,13 @@ if (is_ajax()) { } // Header -ui_print_page_header(__('Alerts').' » '.__('Special days list'), 'images/gm_alerts.png', false, 'alert_special_days', true); +ui_print_page_header( + __('Alerts').' » '.__('Special days list'), + 'images/gm_alerts.png', + false, + 'alert_special_days', + true +); $update_special_day = (bool) get_parameter('update_special_day'); $create_special_day = (bool) get_parameter('create_special_day'); diff --git a/pandora_console/godmode/alerts/alert_templates.php b/pandora_console/godmode/alerts/alert_templates.php index 8b83e0205f..d855fa8928 100644 --- a/pandora_console/godmode/alerts/alert_templates.php +++ b/pandora_console/godmode/alerts/alert_templates.php @@ -132,7 +132,13 @@ if (!$delete_template) { alerts_meta_print_header(); } else { // ~ ui_print_page_header (__('Alerts')." » ". __('Alert templates'), "images/gm_alerts.png", false, "alerts_config", true); - ui_print_page_header(__('Alerts').' » '.__('Alert templates'), 'images/gm_alerts.png', false, '', true); + ui_print_page_header( + __('Alerts').' » '.__('Alert templates'), + 'images/gm_alerts.png', + false, + 'alert_templates_tab', + true + ); } } @@ -201,7 +207,13 @@ if ($delete_template) { if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { - ui_print_page_header(__('Alerts').' » '.__('Alert templates'), 'images/gm_alerts.png', false, 'alerts_config', true); + ui_print_page_header( + __('Alerts').' » '.__('Alert templates'), + 'images/gm_alerts.png', + false, + 'alerts_config', + true + ); } } else { db_pandora_audit( @@ -216,7 +228,13 @@ if ($delete_template) { if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { - ui_print_page_header(__('Alerts').' » '.__('Alert templates'), 'images/gm_alerts.png', false, 'alerts_config', true); + ui_print_page_header( + __('Alerts').' » '.__('Alert templates'), + 'images/gm_alerts.png', + false, + 'alerts_config', + true + ); } } diff --git a/pandora_console/godmode/alerts/alert_view.php b/pandora_console/godmode/alerts/alert_view.php index 6de5473020..f96f6e6644 100644 --- a/pandora_console/godmode/alerts/alert_view.php +++ b/pandora_console/godmode/alerts/alert_view.php @@ -386,7 +386,7 @@ if (count($actions) == 1 && isset($actions[0])) { $table->data[$kaction][($k + 1)] = human_time_description_raw($action_threshold, true, 'tiny'); } - $table->head[($k + 1)] = __('Threshold').''.ui_print_help_icon('action_threshold', true, '', 'images/header_help.png').''; + $table->head[($k + 1)] = __('Threshold'); } } diff --git a/pandora_console/godmode/alerts/configure_alert_action.php b/pandora_console/godmode/alerts/configure_alert_action.php index c29cda623b..3b7b5a947d 100644 --- a/pandora_console/godmode/alerts/configure_alert_action.php +++ b/pandora_console/godmode/alerts/configure_alert_action.php @@ -184,7 +184,6 @@ $table->colspan[2][1] = 2; $table->data[3][0] = __('Threshold'); $table->data[3][1] = html_print_input_text('action_threshold', $action_threshold, '', 5, 7, true); -$table->data[3][1] .= ' '.__('seconds').ui_print_help_icon('action_threshold', true); $table->colspan[3][1] = 2; $table->data[4][0] = ''; diff --git a/pandora_console/godmode/alerts/configure_alert_command.php b/pandora_console/godmode/alerts/configure_alert_command.php index df03e42c45..ac23e44c89 100644 --- a/pandora_console/godmode/alerts/configure_alert_command.php +++ b/pandora_console/godmode/alerts/configure_alert_command.php @@ -43,7 +43,7 @@ if (defined('METACONSOLE')) { __('Alerts').' » '.__('Configure alert command'), 'images/gm_alerts.png', false, - 'alerts_config', + 'alerts_config_command_tab', true ); } @@ -174,7 +174,6 @@ $table->data['name'][2] = html_print_input_text('name', $name, '', 35, 255, true $table->colspan['command'][1] = 3; $table->data['command'][0] = __('Command'); -$table->data['command'][0] .= ui_print_help_icon('alert_macros', true); $table->data['command'][1] = html_print_textarea('command', 8, 30, $command, '', true); $table->colspan['group'][1] = 3; @@ -199,11 +198,6 @@ $table->data['description'][1] = html_print_textarea('description', 10, 30, $des for ($i = 1; $i <= $config['max_macro_fields']; $i++) { $table->data['field'.$i][0] = sprintf(__('Field %s description'), $i); - // Only show help on first row. - if ($i == 1) { - $table->data['field'.$i][0] .= ui_print_help_icon('alert_fields_description', true); - } - if (!empty($fields_descriptions)) { $field_description = $fields_descriptions[($i - 1)]; } else { @@ -214,11 +208,6 @@ for ($i = 1; $i <= $config['max_macro_fields']; $i++) { $table->data['field'.$i][2] = sprintf(__('Field %s values'), $i); - // Only show help on first row. - if ($i == 1) { - $table->data['field'.$i][2] .= ui_print_help_icon('alert_fields_values', true); - } - if (!empty($fields_values)) { $field_values = $fields_values[($i - 1)]; } else { diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php index 6603e5230f..d79ca90ca8 100644 --- a/pandora_console/godmode/alerts/configure_alert_template.php +++ b/pandora_console/godmode/alerts/configure_alert_template.php @@ -56,14 +56,20 @@ if ($a_template !== false) { if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { - // ~ ui_print_page_header (__('Alerts') . - // ~ ' » ' . __('Configure alert template'), "", - // ~ false, "alerts_config", true); + $step = (int) get_parameter('step', 1); + if ($step == 1) { + $help_header = 'configure_alert_template_step_1'; + } else if ($step == 2) { + $help_header = 'configure_alert_template_step_2'; + } else if ($step == 3) { + $help_header = 'configure_alert_template_step_3'; + } + ui_print_page_header( __('Alerts').' » '.__('Configure alert template'), '', false, - '', + $help_header, true ); } @@ -83,7 +89,13 @@ if ($a_template !== false) { if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { - ui_print_page_header(__('Alerts').' » '.__('Configure alert template'), 'images/gm_alerts.png', false, 'conf_alert_template', true); + ui_print_page_header( + __('Alerts').' » '.__('Configure alert template'), + 'images/gm_alerts.png', + false, + 'conf_alert_template', + true + ); } } else { db_pandora_audit( @@ -101,7 +113,22 @@ if ($a_template !== false) { if (defined('METACONSOLE')) { alerts_meta_print_header(); } else { - ui_print_page_header(__('Alerts').' » '.__('Configure alert template'), 'images/gm_alerts.png', false, 'conf_alert_template', true); + $step = (int) get_parameter('step', 1); + if ($step == 1) { + $help_header = 'configure_alert_template_step_1'; + } else if ($step == 2) { + $help_header = 'configure_alert_template_step_2'; + } else if ($step == 3) { + $help_header = 'configure_alert_template_step_3'; + } + + ui_print_page_header( + __('Alerts').' » '.__('Configure alert template'), + 'images/gm_alerts.png', + false, + $help_header, + true + ); } } diff --git a/pandora_console/godmode/events/event_responses.editor.php b/pandora_console/godmode/events/event_responses.editor.php index 18943e94ef..1705605744 100644 --- a/pandora_console/godmode/events/event_responses.editor.php +++ b/pandora_console/godmode/events/event_responses.editor.php @@ -124,7 +124,7 @@ $data[3] .= ''.html_print_input_text('modal_height', $event_r $table->data[2] = $data; $data = []; -$data[0] = __('Parameters').ui_print_help_icon('response_parameters', true); +$data[0] = __('Parameters'); $data[1] = html_print_input_text( 'params', $event_response['params'], diff --git a/pandora_console/godmode/events/events.php b/pandora_console/godmode/events/events.php index 65430d4fe9..c937ad281c 100644 --- a/pandora_console/godmode/events/events.php +++ b/pandora_console/godmode/events/events.php @@ -77,6 +77,7 @@ switch ($section) { case 'responses': $buttons['responses']['active'] = true; $subpage = ' - '.__('Responses'); + $help_header = 'events_responses_tab'; break; case 'view': @@ -90,7 +91,14 @@ switch ($section) { } if (! defined('METACONSOLE')) { - ui_print_page_header(__('Manage events').$subpage, 'images/gm_events.png', false, '', true, $buttons); + ui_print_page_header( + __('Manage events').$subpage, + 'images/gm_events.png', + false, + $help_header, + true, + $buttons + ); } else { ui_meta_print_header(__('Manage events').$subpage, '', $buttons); } diff --git a/pandora_console/godmode/gis_maps/configure_gis_map.php b/pandora_console/godmode/gis_maps/configure_gis_map.php index bbe0b48089..0e632380ce 100644 --- a/pandora_console/godmode/gis_maps/configure_gis_map.php +++ b/pandora_console/godmode/gis_maps/configure_gis_map.php @@ -277,7 +277,7 @@ ui_print_page_header( __('GIS Maps builder'), 'images/gm_gis.png', false, - 'configure_gis_map', + 'configure_gis_map_edit', true, $buttons ); diff --git a/pandora_console/godmode/groups/configure_group.php b/pandora_console/godmode/groups/configure_group.php index ae7e9f8d16..8960b0f1ac 100644 --- a/pandora_console/godmode/groups/configure_group.php +++ b/pandora_console/godmode/groups/configure_group.php @@ -87,7 +87,14 @@ if (defined('METACONSOLE')) { $title_in_header = __('Create group'); } - ui_print_page_header($title_in_header, 'images/group.png', false, '', true, ''); + ui_print_page_header( + $title_in_header, + 'images/group.png', + false, + 'create_group_tab', + true, + '' + ); $sec = 'gagente'; } @@ -175,11 +182,11 @@ if ($config['enterprise_installed']) { } $table->data[$i][0] = __('Alerts'); -$table->data[$i][1] = html_print_checkbox('alerts_enabled', 1, ! $alerts_disabled, true); +$table->data[$i][1] = html_print_checkbox_switch('alerts_enabled', 1, ! $alerts_disabled, true); $i++; $table->data[$i][0] = __('Propagate ACL').ui_print_help_tip(__('Propagate the same ACL security into the child subgroups.'), true); -$table->data[$i][1] = html_print_checkbox('propagate', 1, $propagate, true).ui_print_help_icon('propagate_acl', true); +$table->data[$i][1] = html_print_checkbox_switch('propagate', 1, $propagate, true); $i++; $table->data[$i][0] = __('Custom ID'); diff --git a/pandora_console/godmode/groups/group_list.php b/pandora_console/godmode/groups/group_list.php index 3659a87275..dfd2fbc30d 100644 --- a/pandora_console/godmode/groups/group_list.php +++ b/pandora_console/godmode/groups/group_list.php @@ -275,7 +275,7 @@ if (defined('METACONSOLE')) { __('Groups defined in %s', get_product_name()), 'images/group.png', false, - '', + 'group_list_tab', true, $buttons ); diff --git a/pandora_console/godmode/massive/massive_add_action_alerts.php b/pandora_console/godmode/massive/massive_add_action_alerts.php index 919380c9a9..9abac11def 100755 --- a/pandora_console/godmode/massive/massive_add_action_alerts.php +++ b/pandora_console/godmode/massive/massive_add_action_alerts.php @@ -215,7 +215,6 @@ $table->data[3][1] .= __('Number of alerts match from').' '; $table->data[3][1] .= html_print_input_text('fires_min', 0, '', 4, 10, true); $table->data[3][1] .= ' '.__('to').' '; $table->data[3][1] .= html_print_input_text('fires_max', 0, '', 4, 10, true); -$table->data[3][1] .= ui_print_help_icon('alert-matches', true); $table->data[3][1] .= ''; echo ''; diff --git a/pandora_console/godmode/massive/massive_copy_modules.php b/pandora_console/godmode/massive/massive_copy_modules.php index 00c76792e4..b79a64460e 100755 --- a/pandora_console/godmode/massive/massive_copy_modules.php +++ b/pandora_console/godmode/massive/massive_copy_modules.php @@ -125,7 +125,7 @@ echo ''; echo ''; -echo ''.__('Source').ui_print_help_icon('manageconfig', true).''; +echo ''.__('Source'); echo ''; html_print_table($table); echo ''; diff --git a/pandora_console/godmode/massive/massive_edit_agents.php b/pandora_console/godmode/massive/massive_edit_agents.php index 74d05c10d0..da1a0887b5 100755 --- a/pandora_console/godmode/massive/massive_edit_agents.php +++ b/pandora_console/godmode/massive/massive_edit_agents.php @@ -489,7 +489,7 @@ $params['selectbox_id'] = 'cascade_protection_module'; $params['javascript_is_function_select'] = true; $table->data[0][1] = ui_print_agent_autocomplete_input($params); -$table->data[0][1] .= ''.__('Cascade protection').' '.ui_print_help_icon('cascade_protection', true).html_print_select( +$table->data[0][1] .= ''.__('Cascade protection').''.html_print_select( [ 1 => __('Yes'), 0 => __('No'), @@ -587,7 +587,7 @@ $table->data[0][0] = __('Custom ID'); $table->data[0][1] = html_print_input_text('custom_id', $custom_id, '', 16, 255, true); // Learn mode / Normal mode -$table->data[1][0] = __('Module definition').ui_print_help_icon('module_definition', true); +$table->data[1][0] = __('Module definition'); $table->data[1][1] = __('No change').' '.html_print_radio_button_extended('mode', -1, '', $mode, false, '', 'style="margin-right: 40px;"', true); $table->data[1][1] .= __('Learning mode').' '.html_print_radio_button_extended('mode', 1, '', $mode, false, '', 'style="margin-right: 40px;"', true); $table->data[1][1] .= __('Normal mode').' '.html_print_radio_button_extended('mode', 0, '', $mode, false, '', 'style="margin-right: 40px;"', true); diff --git a/pandora_console/godmode/massive/massive_edit_modules.php b/pandora_console/godmode/massive/massive_edit_modules.php index ae6b5b1432..a803fa4725 100755 --- a/pandora_console/godmode/massive/massive_edit_modules.php +++ b/pandora_console/godmode/massive/massive_edit_modules.php @@ -695,7 +695,7 @@ $table->data['edit1'][1] = ''; true ); - $table->data['edit3'][0] = __('Post process').ui_print_help_icon('postprocess', true); + $table->data['edit3'][0] = __('Post process'); $table->data['edit3'][1] = html_print_extended_select_for_post_process( 'post_process', @@ -846,10 +846,6 @@ $table->data['edit1'][1] = '
'; // FF stands for Flip-flop. $table->data['edit7'][0] = __('FF threshold').' '; - $table->data['edit7'][0] .= ui_print_help_icon( - 'ff_threshold', - true - ); $table->colspan['edit7'][1] = 3; $table->data['edit7'][1] = __('Mode').' '; @@ -1060,26 +1056,26 @@ $table->data['edit1'][1] = '
'; true ); - $table->data['edit22'][0] = __('Web checks').ui_print_help_icon('web_checks', true); + $table->data['edit22'][0] = __('Web checks'); ; $table->data['edit22'][1] = ''; $table->data['edit16'][2] = __('Port'); $table->data['edit16'][3] = html_print_input_text('tcp_port', '', '', 5, 20, true); - $table->data['edit17'][0] = __('TCP send').' '.ui_print_help_icon('tcp_send', true); + $table->data['edit17'][0] = __('TCP send'); $table->data['edit17'][1] = html_print_textarea('tcp_send2', 2, 65, '', '', true); $table->data['edit17'][2] = __('TCP receive'); $table->data['edit17'][3] = html_print_textarea('tcp_rcv', 2, 65, '', '', true); - $table->data['edit18'][0] = __('WMI query').ui_print_help_icon('wmiquery', true); + $table->data['edit18'][0] = __('WMI query'); $table->data['edit18'][1] = html_print_input_text('wmi_query', '', '', 35, 255, true); $table->data['edit18'][2] = __('Key string'); $table->data['edit18'][3] = html_print_input_text('key_string', '', '', 20, 60, true); - $table->data['edit19'][0] = __('Field number').ui_print_help_icon('wmifield', true); + $table->data['edit19'][0] = __('Field number'); $table->data['edit19'][1] = html_print_input_text('field_number', '', '', 5, 15, true); $table->data['edit20'][0] = __('Plugin').ui_print_help_icon('plugin_macros', true); diff --git a/pandora_console/godmode/massive/massive_operations.php b/pandora_console/godmode/massive/massive_operations.php index d8e9335137..9e81bd3aaa 100755 --- a/pandora_console/godmode/massive/massive_operations.php +++ b/pandora_console/godmode/massive/massive_operations.php @@ -11,7 +11,7 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// Load global vars +// Load global vars. check_login(); if (! check_acl($config['id_user'], 0, 'AW')) { @@ -72,6 +72,7 @@ if (! check_acl($config['id_user'], 0, 'AW')) { $options_policies = []; $policies_options = enterprise_hook('massive_policies_options'); +$policies_options = array_unique($policies_options); if ($policies_options != ENTERPRISE_NOT_HOOK) { $options_policies = array_merge($options_policies, $policies_options); @@ -118,10 +119,12 @@ switch ($tab) { case 'massive_agents': $options = $options_agents; + $help_header = 'massive_agents_tab'; break; case 'massive_modules': $options = $options_modules; + $help_header = 'massive_modules_tab'; break; case 'massive_users': @@ -130,6 +133,7 @@ switch ($tab) { case 'massive_policies': $options = $options_policies; + $help_header = 'massive_policies_tab'; break; case 'massive_snmp': @@ -143,9 +147,13 @@ switch ($tab) { case 'massive_plugins': $options = $options_plugins; break; + + default: + // Default. + break; } -// Set the default option of the category +// Set the default option of the category. if ($option == '') { $option = array_shift(array_keys($options)); } @@ -235,16 +243,16 @@ ui_print_page_header( __('Bulk operations').' » '.$options[$option], 'images/gm_massive_operations.png', false, - '', + $help_header, true, $onheader, true, 'massivemodal' ); -// Checks if the PHP configuration is correctly +// Checks if the PHP configuration is correctly. if ((get_cfg_var('max_execution_time') != 0) - or (get_cfg_var('max_input_time') != -1) + || (get_cfg_var('max_input_time') != -1) ) { echo '
'; echo __('In order to perform massive operations, PHP needs a correct configuration in timeout parameters. Please, open your PHP configuration file (php.ini) for example: sudo vi /etc/php5/apache2/php.ini;
And set your timeout parameters to a correct value:
max_execution_time = 0 and max_input_time = -1'); @@ -256,7 +264,7 @@ if ($tab == 'massive_policies' && is_central_policies_on_node()) { return; } -// Catch all submit operations in this view to display Wait banner +// Catch all submit operations in this view to display Wait banner. $submit_action = get_parameter('go'); $submit_update = get_parameter('updbutton'); $submit_del = get_parameter('del'); diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index ac3154b657..eaf33df640 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -457,19 +457,6 @@ if (check_acl($config['id_user'], 0, 'PM') && $config['enable_update_manager']) $sub['godmode/update_manager/update_manager&tab=setup']['text'] = __('Update Manager options'); $sub['godmode/update_manager/update_manager&tab=setup']['id'] = 'Options'; - if (license_free() && is_user_admin($config['id_user'])) { - include_once 'include/functions_update_manager.php'; - // If there are unread messages, display the notification icon - $number_total_messages; - $number_unread_messages = update_manager_get_unread_messages(); - if ($number_unread_messages > 0) { - $menu_godmode['messages']['notification'] = $number_unread_messages; - } - - $sub['godmode/update_manager/update_manager&tab=messages']['text'] = __('Messages'); - $sub['godmode/update_manager/update_manager&tab=messages']['id'] = 'Messages'; - } - $menu_godmode['messages']['sub'] = $sub; } diff --git a/pandora_console/godmode/modules/manage_nc_groups.php b/pandora_console/godmode/modules/manage_nc_groups.php index 088d73026b..d53de32ce1 100644 --- a/pandora_console/godmode/modules/manage_nc_groups.php +++ b/pandora_console/godmode/modules/manage_nc_groups.php @@ -36,7 +36,13 @@ if (defined('METACONSOLE')) { components_meta_print_header(); $sec = 'advanced'; } else { - ui_print_page_header(__('Module management').' » '.__('Component group management'), '', false, 'component_groups', true); + ui_print_page_header( + __('Module management').' » '.__('Component group management'), + '', + false, + 'component_groups', + true + ); $sec = 'gmodules'; } diff --git a/pandora_console/godmode/modules/manage_network_components.php b/pandora_console/godmode/modules/manage_network_components.php index 341a19cfbb..82cd02d771 100644 --- a/pandora_console/godmode/modules/manage_network_components.php +++ b/pandora_console/godmode/modules/manage_network_components.php @@ -46,11 +46,22 @@ if (defined('METACONSOLE')) { */ + $id_modulo = (int) get_parameter('id_component_type'); + $new_component = (bool) get_parameter('new_component'); + if ($id_modulo == 2 || $id_modulo == 4 || $id_modulo == 6) { + $help_header = 'local_module_tab'; + } else if (!$new_component) { + $help_header = 'network_component_tab'; + } else { + $help_header = 'network_component_tab'; + } + + ui_print_page_header( __('Module management').' » '.__('Network component management'), '', false, - 'network_component', + $help_header, true, '', false, @@ -90,7 +101,6 @@ if (!empty($macros)) { $max_timeout = (int) get_parameter('max_timeout'); $max_retries = (int) get_parameter('max_retries'); -$id_modulo = (int) get_parameter('id_component_type'); $id_plugin = (int) get_parameter('id_plugin'); $dynamic_interval = (int) get_parameter('dynamic_interval'); $dynamic_max = (int) get_parameter('dynamic_max'); @@ -150,7 +160,6 @@ $disabled_types_event = json_encode($disabled_types_event); $create_component = (bool) get_parameter('create_component'); $update_component = (bool) get_parameter('update_component'); $delete_component = (bool) get_parameter('delete_component'); -$new_component = (bool) get_parameter('new_component'); $duplicate_network_component = (bool) get_parameter('duplicate_network_component'); $delete_multiple = (bool) get_parameter('delete_multiple'); $multiple_delete = (bool) get_parameter('multiple_delete', 0); diff --git a/pandora_console/godmode/modules/manage_network_components_form_common.php b/pandora_console/godmode/modules/manage_network_components_form_common.php index 7b33a0a275..2a55efb1dd 100644 --- a/pandora_console/godmode/modules/manage_network_components_form_common.php +++ b/pandora_console/godmode/modules/manage_network_components_form_common.php @@ -72,7 +72,7 @@ if (enterprise_installed()) { } } -$table->data[1][0] = __('Type').' '.ui_print_help_icon('module_type', true); +$table->data[1][0] = __('Type').' '.ui_print_help_icon($help_type, true, '', 'images/help_green.png', '', 'module_type_help'); $sql = sprintf( 'SELECT id_tipo, descripcion FROM ttipo_modulo @@ -154,7 +154,7 @@ $table->data[2][1] = html_print_select( $table->data[2][2] = __('Interval'); $table->data[2][3] = html_print_extended_select_for_time('module_interval', $module_interval, '', '', '0', false, true); -$table->data[3][0] = __('Dynamic Interval').' '.ui_print_help_icon('dynamic_threshold', true); +$table->data[3][0] = __('Dynamic Interval'); $table->data[3][1] = html_print_extended_select_for_time('dynamic_interval', $dynamic_interval, '', 'None', '0', 10, true, 'width:150px', false); $table->data[3][1] .= ''.html_print_image('images/cog.png', true, ['title' => __('Advanced options Dynamic Threshold')]).''; @@ -165,7 +165,7 @@ $table->data[3][2] .= html_print_input_text('dynamic_max', $dynamic_max, '', 10, $table->data[3][3] = ''.__('Dynamic Two Tailed: ').''; $table->data[3][3] .= html_print_checkbox('dynamic_two_tailed', 1, $dynamic_two_tailed, true); -$table->data[4][0] = __('Warning status').' '.ui_print_help_icon('warning_status', true); +$table->data[4][0] = __('Warning status'); $table->data[4][1] = ''.__('Min.').'  '; $table->data[4][1] .= html_print_input_text( 'min_warning', @@ -200,7 +200,7 @@ $table->data[4][2] = ' '; $table->colspan[4][2] = 2; $table->rowspan[4][2] = 3; -$table->data[5][0] = __('Critical status').' '.ui_print_help_icon('critical_status', true); +$table->data[5][0] = __('Critical status'); $table->data[5][1] = ''.__('Min.').'  '; $table->data[5][1] .= html_print_input_text( 'min_critical', @@ -231,7 +231,7 @@ $table->data[5][1] .= html_print_input_text( $table->data[5][1] .= '
'.__('Inverse interval').''; $table->data[5][1] .= html_print_checkbox('critical_inverse', 1, $critical_inverse, true); -$table->data[6][0] = __('FF threshold').' '.ui_print_help_icon('ff_threshold', true); +$table->data[6][0] = __('FF threshold'); $table->colspan[6][1] = 3; $table->data[6][1] = __('Keep counters'); @@ -396,6 +396,124 @@ $next_row++; var type_names = jQuery.parseJSON(Base64.decode($('#hidden-type_names').val())); var type_name_selected = type_names[type_selected]; + console.log(type_name_selected); + var element = document.getElementById("module_type_help"); + var language = "" ; + element.onclick = function (event) { + if(type_name_selected == 'async_data' || + type_name_selected == 'async_proc' || + type_name_selected == 'async_string' || + type_name_selected == 'generic_proc'|| + type_name_selected == 'generic_data' || + type_name_selected == 'generic_data_inc' || + type_name_selected == 'generic_data_inc_abs'|| + type_name_selected == 'generic_data_string' || + type_name_selected == 'keep_alive' + ){ + if (language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Operacion&printable=yes#Tipos_de_m.C3.B3dulos', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Operations&printable=yes#Types_of_Modules', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'remote_icmp' || + type_name_selected == 'remote_icmp_proc' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_ICMP', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Remote_Monitoring&printable=yes#ICMP_Monitoring', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'remote_snmp_string' || + type_name_selected == 'remote_snmp_proc' || + type_name_selected == 'remote_snmp_inc' || + type_name_selected == 'remote_snmp' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_remota&printable=yes#Monitorizando_con_m.C3.B3dulos_de_red_tipo_SNMP', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Remote_Monitoring&printable=yes#Monitoring_by_Network_Modules_with_SNMP', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'remote_tcp_string' || + type_name_selected == 'remote_tcp_proc' || + type_name_selected == 'remote_tcp_inc' || + type_name_selected == 'remote_tcp' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_TCP', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Remote_Monitoring&printable=yes#TCP_Monitoring', + '_blank', + 'width=800,height=600' + ); + } + + + } + if(type_name_selected == 'web_data' || + type_name_selected == 'web_proc' || + type_name_selected == 'web_content_data' || + type_name_selected == 'web_content_string' + ){ + if(language == 'es'){ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:Monitorizacion_web&printable=yes#Creaci.C3.B3n_de_m.C3.B3dulos_web', + '_blank', + 'width=800,height=600' + ); + } + else{ + window.open( + 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:Web_Monitoring&printable=yes#Creating_Web_Modules', + '_blank', + 'width=800,height=600' + ); + } + + + } + } if (type_name_selected.match(/_string$/) == null) { // Numeric types diff --git a/pandora_console/godmode/modules/manage_network_components_form_network.php b/pandora_console/godmode/modules/manage_network_components_form_network.php index 8befa28555..0f39406ce9 100755 --- a/pandora_console/godmode/modules/manage_network_components_form_network.php +++ b/pandora_console/godmode/modules/manage_network_components_form_network.php @@ -57,16 +57,16 @@ $data = []; $data[0] = __('SNMP Enterprise String'); $data[1] = html_print_input_text('snmp_oid', $snmp_oid, '', 30, 400, true); // $table->colspan['snmp_2'][1] = 3; -$data[2] = __('SNMP community').ui_print_help_icon('column_macros', true); +$data[2] = __('SNMP community'); $data[3] = html_print_input_text('snmp_community', $snmp_community, '', 15, 60, true); push_table_row($data, 'snmp_2'); $data = []; -$data[0] = __('Auth user').ui_print_help_icon('column_macros', true); +$data[0] = __('Auth user'); $data[1] = html_print_input_text('snmp3_auth_user', $snmp3_auth_user, '', 15, 60, true); -$data[2] = __('Auth password').ui_print_help_icon('column_macros', true); +$data[2] = __('Auth password'); $data[3] = html_print_input_password('snmp3_auth_pass', $snmp3_auth_pass, '', 15, 60, true); $data[3] .= html_print_input_hidden_extended('active_snmp_v3', 0, 'active_snmp_v3_mncfn', true); push_table_row($data, 'field_snmpv3_row1'); @@ -74,7 +74,7 @@ push_table_row($data, 'field_snmpv3_row1'); $data = []; $data[0] = __('Privacy method'); $data[1] = html_print_select(['DES' => __('DES'), 'AES' => __('AES')], 'snmp3_privacy_method', $snmp3_privacy_method, '', '', '', true); -$data[2] = __('Privacy pass').ui_print_help_icon('column_macros', true); +$data[2] = __('Privacy pass'); $data[3] = html_print_input_password('snmp3_privacy_pass', $snmp3_privacy_pass, '', 15, 60, true); push_table_row($data, 'field_snmpv3_row2'); @@ -98,7 +98,7 @@ $data[3] = html_print_select( push_table_row($data, 'field_snmpv3_row3'); $data = []; -$data[0] = __('Post process').' '.ui_print_help_icon('postprocess', true); +$data[0] = __('Post process'); $data[1] = html_print_extended_select_for_post_process( 'post_process', $post_process, @@ -117,7 +117,7 @@ push_table_row($data, 'field_process'); // Advanced stuff $data = []; -$data[0] = __('TCP send').' '.ui_print_help_icon('tcp_send', true); +$data[0] = __('TCP send'); $data[1] = html_print_textarea('tcp_send', 2, 65, $tcp_send, '', true); $table->colspan['tcp_send'][1] = 3; diff --git a/pandora_console/godmode/modules/manage_network_components_form_plugin.php b/pandora_console/godmode/modules/manage_network_components_form_plugin.php index edbabe69eb..19d3c45e8f 100755 --- a/pandora_console/godmode/modules/manage_network_components_form_plugin.php +++ b/pandora_console/godmode/modules/manage_network_components_form_plugin.php @@ -31,7 +31,7 @@ $data[1] = html_print_select_from_sql( ); // Store the macros in base64 into a hidden control to move between pages $data[1] .= html_print_input_hidden('macros', base64_encode($macros), true); -$data[2] = __('Post process').' '.ui_print_help_icon('postprocess', true, ui_get_full_url(false, false, false, false)); +$data[2] = __('Post process'); $data[3] = html_print_extended_select_for_post_process( 'post_process', $post_process, diff --git a/pandora_console/godmode/modules/manage_network_components_form_wmi.php b/pandora_console/godmode/modules/manage_network_components_form_wmi.php index f88441f5d5..e76d3c086a 100755 --- a/pandora_console/godmode/modules/manage_network_components_form_wmi.php +++ b/pandora_console/godmode/modules/manage_network_components_form_wmi.php @@ -28,31 +28,31 @@ if (! check_acl($config['id_user'], 0, 'PM')) { require_once $config['homedir'].'/include/functions_modules.php'; $data = []; -$data[0] = __('WMI query'); +$data[0] = __('WMI query').' '.ui_print_help_icon('wmi_query_tab', true); $data[1] = html_print_input_text('snmp_oid', $snmp_oid, '', 25, 255, true); -$data[2] = __('Key string').' '.ui_print_help_icon('wmikey', true, ui_get_full_url(false, false, false, false)); +$data[2] = __('Key string'); $data[3] = html_print_input_text('snmp_community', $snmp_community, '', 25, 255, true); push_table_row($data, 'wmi_1'); $data = []; -$data[0] = __('Field number').' '.ui_print_help_icon('wmifield', true, ui_get_full_url(false, false, false, false)); +$data[0] = __('Field number'); $data[1] = html_print_input_text('tcp_port', $tcp_port, '', 5, 25, true); -$data[2] = __('Namespace').' '.ui_print_help_icon('wminamespace', true, ui_get_full_url(false, false, false, false)); +$data[2] = __('Namespace'); $data[3] = html_print_input_text('tcp_send', $tcp_send, '', 25, 255, true); push_table_row($data, 'wmi_2'); $data = []; -$data[0] = __('Username').ui_print_help_icon('column_macros', true); +$data[0] = __('Username'); $data[1] = html_print_input_text('plugin_user', $plugin_user, '', 15, 255, true); -$data[2] = __('Password').ui_print_help_icon('column_macros', true); +$data[2] = __('Password'); $data[3] = html_print_input_password('plugin_pass', $plugin_pass, '', 25, 255, true); push_table_row($data, 'wmi_3'); $data = []; -$data[0] = __('Post process').' '.ui_print_help_icon('postprocess', true, ui_get_full_url(false, false, false, false)); +$data[0] = __('Post process'); $data[1] = html_print_extended_select_for_post_process( 'post_process', $post_process, diff --git a/pandora_console/godmode/modules/manage_network_templates.php b/pandora_console/godmode/modules/manage_network_templates.php index ae1b5b2d07..eebf408caa 100644 --- a/pandora_console/godmode/modules/manage_network_templates.php +++ b/pandora_console/godmode/modules/manage_network_templates.php @@ -35,7 +35,16 @@ if (! check_acl($config['id_user'], 0, 'PM')) { */ -ui_print_page_header(__('Module management').' » '.__('Module template management'), 'images/gm_modules.png', false, 'template_tab', true, '', true, 'modulemodal'); +ui_print_page_header( + __('Module management').' » '.__('Module template management'), + 'images/gm_modules.png', + false, + 'module_template_tab', + true, + '', + true, + 'modulemodal' +); require_once 'include/functions_network_profiles.php'; diff --git a/pandora_console/godmode/netflow/nf_edit.php b/pandora_console/godmode/netflow/nf_edit.php index 10bcf1ce89..eb9b84546b 100644 --- a/pandora_console/godmode/netflow/nf_edit.php +++ b/pandora_console/godmode/netflow/nf_edit.php @@ -34,7 +34,13 @@ $pure = get_parameter('pure', 0); // Header if (! defined('METACONSOLE')) { - ui_print_page_header(__('Manage Netflow Filter'), 'images/gm_netflow.png', false, '', true); + ui_print_page_header( + __('Manage Netflow Filter'), + 'images/gm_netflow.png', + false, + 'pcap_filter', + true + ); $is_windows = strtoupper(substr(PHP_OS, 0, 3)) == 'WIN'; if ($is_windows) { diff --git a/pandora_console/godmode/netflow/nf_edit_form.php b/pandora_console/godmode/netflow/nf_edit_form.php index 60cd41f019..0f0c9f5194 100644 --- a/pandora_console/godmode/netflow/nf_edit_form.php +++ b/pandora_console/godmode/netflow/nf_edit_form.php @@ -54,7 +54,14 @@ if (! defined('METACONSOLE')) { $buttons['add']['text'] = ''.html_print_image('images/add_mc.png', true, ['title' => __('Add filter')]).''; - ui_print_page_header(__('Netflow Filter'), 'images/gm_netflow.png', false, '', true, $buttons); + ui_print_page_header( + __('Netflow Filter'), + 'images/gm_netflow.png', + false, + 'pcap_filter', + true, + $buttons + ); } else { $nav_bar = [ [ @@ -230,10 +237,9 @@ $table->data[5][1] = html_print_input_text('dst_port', $dst_port, false, 40, 80, $table->data[6][0] = __('Src Port').ui_print_help_tip(__('Source port. A comma separated list of source ports. If we leave the field blank, will show all ports. Example filter by ports 80 and 22:
80,22'), true); $table->data[6][1] = html_print_input_text('src_port', $src_port, false, 40, 80, true); -$table->data[7][0] = ui_print_help_icon('pcap_filter', true); $table->data[7][1] = html_print_textarea('advanced_filter', 4, 40, $advanced_filter, '', true); -$table->data[8][0] = ''.__('Aggregate by').''.ui_print_help_icon('aggregate_by', true); +$table->data[8][0] = ''.__('Aggregate by').''; $aggregate_list = [ 'srcip' => __('Src Ip Address'), 'dstip' => __('Dst Ip Address'), diff --git a/pandora_console/godmode/reporting/graph_builder.php b/pandora_console/godmode/reporting/graph_builder.php index 28bae38d3d..7a83697824 100644 --- a/pandora_console/godmode/reporting/graph_builder.php +++ b/pandora_console/godmode/reporting/graph_builder.php @@ -276,19 +276,30 @@ if (isset($name)) { $head .= ' - '.$name; } -// Header +// Header. $tab = get_parameter('tab', ''); switch ($tab) { + default: case 'main': - ui_print_page_header($head, 'images/chart.png', false, 'graph_builder', false, $buttons); + ui_print_page_header( + $head, + 'images/chart.png', + false, + 'graph_builder', + false, + $buttons + ); break; case 'graph_editor': - ui_print_page_header($head, 'images/chart.png', false, 'graph_editor', false, $buttons); - break; - - default: - ui_print_page_header($head, 'images/chart.png', false, 'graph_builder', false, $buttons); + ui_print_page_header( + $head, + 'images/chart.png', + false, + 'graph_editor', + false, + $buttons + ); break; } diff --git a/pandora_console/godmode/reporting/map_builder.php b/pandora_console/godmode/reporting/map_builder.php index 9b83a15600..8ce970262d 100644 --- a/pandora_console/godmode/reporting/map_builder.php +++ b/pandora_console/godmode/reporting/map_builder.php @@ -15,7 +15,7 @@ global $config; require_once $config['homedir'].'/include/functions_visual_map.php'; -// ACL for the general permission +// ACL for the general permission. $vconsoles_read = check_acl($config['id_user'], 0, 'VR'); $vconsoles_write = check_acl($config['id_user'], 0, 'VW'); $vconsoles_manage = check_acl($config['id_user'], 0, 'VM'); @@ -84,7 +84,7 @@ if (!$is_metaconsole) { __('Reporting').' » '.__('Visual Console'), 'images/op_reporting.png', false, - 'map_builder', + 'map_builder_intro', false, $buttons ); diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 71536d023f..93806138cb 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -820,7 +820,7 @@ $class = 'databox filters';
'.''.''.''.'
- + @@ -981,11 +981,6 @@ $class = 'databox filters'; @@ -1004,10 +999,7 @@ $class = 'databox filters';
@@ -1026,10 +1018,7 @@ $class = 'databox filters';
@@ -4865,7 +4854,6 @@ function chooseType() { switch (type) { case 'event_report_agent': case 'simple_graph': - case 'agent_configuration': case 'event_report_module': case 'alert_report_agent': case 'alert_report_module': @@ -4876,8 +4864,6 @@ function chooseType() { case 'min_value': case 'max_value': case 'avg_value': - case 'projection_graph': - case 'prediction_date': case 'TTRT': case 'TTO': case 'MTBF': diff --git a/pandora_console/godmode/reporting/reporting_builder.list_items.php b/pandora_console/godmode/reporting/reporting_builder.list_items.php index 9addb32f26..b2a206a40a 100755 --- a/pandora_console/godmode/reporting/reporting_builder.list_items.php +++ b/pandora_console/godmode/reporting/reporting_builder.list_items.php @@ -745,7 +745,12 @@ function message_check_delete_items() { } function added_ids_deleted_items_to_hidden_input() { - message_check_delete_items(); + var success = message_check_delete_items(); + + if(success === false){ + $(".check_delete").prop("checked", false); + return false; + } var ids = ''; var first = true; diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index e48c6dc858..e8af78ed62 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -480,6 +480,7 @@ switch ($action) { } $subsection = ''; + $helpers = ''; switch ($activeTab) { case 'main': $buttons['list_reports']['active'] = true; @@ -487,10 +488,14 @@ switch ($action) { break; default: - $subsection = reporting_enterprise_add_subsection_main( + $data_tab = reporting_enterprise_add_subsection_main( $activeTab, $buttons ); + + $subsection = $data_tab['subsection']; + $buttons = $data_tab['buttons']; + $helpers = $data_tab['helpers']; break; } @@ -2909,6 +2914,7 @@ switch ($action) { $buttons = reporting_enterprise_add_main_Tabs($buttons); $subsection = ''; + $helpers = ''; switch ($activeTab) { case 'main': $buttons['list_reports']['active'] = true; @@ -2916,10 +2922,14 @@ switch ($action) { break; default: - $subsection = reporting_enterprise_add_subsection_main( + $data_tab = reporting_enterprise_add_subsection_main( $activeTab, $buttons ); + + $subsection = $data_tab['subsection']; + $buttons = $data_tab['buttons']; + $helpers = $data_tab['helper']; break; } @@ -3027,11 +3037,21 @@ if ($enterpriseEnable && defined('METACONSOLE')) { // Print header. ui_meta_print_header(__('Reporting').$textReportName, '', $buttons); } else { + switch ($activeTab) { + case 'main': + $helpers = ''; + break; + + default: + $helpers = 'reporting_'.$activeTab.'_tab'; + break; + } + ui_print_page_header( $textReportName, 'images/op_reporting.png', false, - 'reporting_'.$activeTab.'_tab', + $helpers, false, $buttons, false, diff --git a/pandora_console/godmode/reporting/visual_console_favorite.php b/pandora_console/godmode/reporting/visual_console_favorite.php index df13291539..d1cd7ce2ef 100644 --- a/pandora_console/godmode/reporting/visual_console_favorite.php +++ b/pandora_console/godmode/reporting/visual_console_favorite.php @@ -78,7 +78,7 @@ if (!$is_metaconsole) { __('Reporting').' » '.__('Visual Favourite Console'), 'images/op_reporting.png', false, - 'map_builder', + 'map_builder_favorite', false, $buttons ); diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index e205203f9d..57fa1a1e67 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -403,7 +403,7 @@ if (($create != '') || ($view != '')) { $table->data['plugin_command'] = $data; $data = []; - $data[0] = __('Plug-in parameters').ui_print_help_icon('plugin_parameters', true); + $data[0] = __('Plug-in parameters'); $data[1] = ''; if ($locked) { $data[1] .= html_print_image('images/lock.png', true, ['class' => 'command_advanced_conf lock']); @@ -549,7 +549,7 @@ if (($create != '') || ($view != '')) { $table->headstyle[0] = 'text-align: center'; html_print_table($table); } else { - echo '
'.''.__('Parameters macros').ui_print_help_icon('macros', true).''; + echo '
'.''.__('Parameters macros').''; html_print_table($table); echo '
'; } @@ -612,7 +612,16 @@ if (($create != '') || ($view != '')) { config_update_value('metaconsole_deploy_plugin_server', 1); } } else { - ui_print_page_header(__('Plug-ins registered on %s', get_product_name()), 'images/gm_servers.png', false, '', true); + ui_print_page_header( + __( + 'Plug-ins registered on %s', + get_product_name() + ), + 'images/gm_servers.png', + false, + '', + true + ); $management_allowed = !is_central_policies_on_node(); if (!$management_allowed) { diff --git a/pandora_console/godmode/setup/gis.php b/pandora_console/godmode/setup/gis.php index e6ff8dd3ab..526abc0b0a 100755 --- a/pandora_console/godmode/setup/gis.php +++ b/pandora_console/godmode/setup/gis.php @@ -28,8 +28,14 @@ require_once 'include/functions_gis.php'; ui_require_javascript_file('openlayers.pandora'); -// Header -ui_print_page_header(__('Map conections GIS'), '', false, 'setup_gis_index', true); +// Header. +ui_print_page_header( + __('Map conections GIS'), + '', + false, + '', + true +); $action = get_parameter('action'); diff --git a/pandora_console/godmode/setup/gis_step_2.php b/pandora_console/godmode/setup/gis_step_2.php index 5203bdef23..133b4fdeaa 100644 --- a/pandora_console/godmode/setup/gis_step_2.php +++ b/pandora_console/godmode/setup/gis_step_2.php @@ -13,7 +13,7 @@ * GNU General Public License for more details. */ -// Load global vars +// Load global vars. global $config; check_login(); @@ -35,8 +35,14 @@ echo ''.'
'.htmlentities(__('Tile Server URL'), ENT_QUOTES, 'UTF-8').':'.html_print_input_text('url', $mapConnectionDataUrl, '', 45, 90, true).'
'; -// Google Maps Connection +// Google Maps Connection. $gmaps_types['G_PHYSICAL_MAP'] = __('Google Physical'); $gmaps_types['G_HYBRID_MAP'] = __('Google Hybrid'); $gmaps_types['G_SATELITE_MAP'] = __('Google Satelite'); // TODO: Use label tags for the forms. $optionsConnectionGmapTable = ''.''.''.''.''.''.''.''.''.''.''.'
'.__('Google Map Type').':'.trim(html_print_select($gmaps_types, 'gmap_type', $gmap_type, '', '', 0, true)).'
'.__('Google Maps Key').':
'.html_print_input_text('gmap_key', $gmap_key, '', 90, 128, true).'
'; -// Image Map Connection +// Image Map Connection. $optionsConnectionImageTable = ''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.''.'
'.__('Image URL').':'.html_print_input_text('url', $mapConnectionDataUrl, '', 45, 90, true).'
'.__('Corners of the area of the image').':
'.__('Left').':'.html_print_input_text('bb_left', $bb_left, '', 25, 25, true).''.__('Bottom').':'.html_print_input_text('bb_bottom', $bb_bottom, '', 25, 25, true).'
'.__('Right').':'.html_print_input_text('bb_right', $bb_right, '', 25, 25, true).''.__('Top').':'.html_print_input_text('bb_top', $bb_top, '', 25, 25, true).'
'.__('Image Size').':
'.__('Width').':'.html_print_input_text('image_width', $image_width, '', 25, 25, true).''.__('Height').':'.html_print_input_text('image_height', $image_height, '', 25, 25, true).'
'; -// WMS Server Connection +// WMS Server Connection. $optionsConnectionWMSTable = ''.''.''.''.''.''.''.''.''.'
'.__('WMS Server URL').''.''.html_print_input_text('url', $mapConnectionDataUrl, '', 90, 255, true).'
'.__('Layers').ui_print_help_tip(__('Enter a single element or a comma separated list'), true).''.html_print_input_text('layers', $layers, '', 90, 255, true).'
'; if ($mapConnectionData != null) { @@ -274,6 +297,10 @@ if ($mapConnectionData != null) { case 'WMS': $optionsConnectionTypeTable = $optionsConnectionWMSTable; break; + + default: + // Default. + break; } } diff --git a/pandora_console/godmode/setup/license.php b/pandora_console/godmode/setup/license.php index 413b1d7fe1..f03d32ef0a 100644 --- a/pandora_console/godmode/setup/license.php +++ b/pandora_console/godmode/setup/license.php @@ -1,15 +1,32 @@ $value) { - db_process_sql_update( - 'tupdate_settings', - [db_escape_key_identifier('value') => $value], - [db_escape_key_identifier('key') => $key] - ); - } - - ui_print_success_message(__('License updated')); + ui_require_javascript_file_enterprise('load_enterprise'); + enterprise_include_once('include/functions_license.php'); +} + +if ($update_settings) { + if (!is_metaconsole()) { + // Node. + foreach ($_POST['keys'] as $key => $value) { + db_process_sql_update( + 'tupdate_settings', + [db_escape_key_identifier('value') => $value], + [db_escape_key_identifier('key') => $key] + ); + } + + ui_print_success_message(__('License updated')); + } } -ui_require_javascript_file_enterprise('load_enterprise'); -enterprise_include_once('include/functions_license.php'); $license = enterprise_hook('license_get_info'); $rows = db_get_all_rows_in_table('tupdate_settings'); @@ -55,11 +88,20 @@ if (enterprise_installed()) { echo ''; echo ''; +// Retrieve UM url configured (or default). +$url = get_um_url(); $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; +if (is_metaconsole()) { + $table->head[0] = __('Licence'); + $table->head_colspan[0] = 3; + $table->headstyle[0] = 'text-align: center'; + $table->style[0] = 'font-weight: bold;'; +} + $table->data = []; $table->data[0][0] = ''.__('Customer key').''; @@ -98,34 +140,45 @@ if (enterprise_installed()) { html_print_input_hidden('update_settings', 1); html_print_submit_button(__('Validate'), 'update_button', false, 'class="sub upd"'); echo '  '; - html_print_button(__('Request new license'), '', false, 'generate_request_code()', 'class="ui-button-dialog ui-widget ui-state-default ui-corner-all ui-button-text-only sub next"'); + html_print_button(__('Request new license'), '', false, 'generate_request_code()', 'class="sub next"'); echo '
'; } -echo ''; -echo ''; +if (is_metaconsole()) { + ui_require_css_file('pandora_enterprise', '../../'.ENTERPRISE_DIR.'/include/styles/'); + ui_require_css_file('register', '../../include/styles/'); +} else { + ui_require_css_file('pandora'); + ui_require_css_file('pandora_enterprise', ENTERPRISE_DIR.'/include/styles/'); + ui_require_css_file('register'); +} + +if (enterprise_hook('print_activate_licence_dialog') == ENTERPRISE_NOT_HOOK) { + echo ''; + echo ''; +} diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index b46530fdee..f0e2359be4 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -628,7 +628,7 @@ $table_other->data[6][1] = html_print_input_text( true ); -$table_other->data[7][0] = __('Use agent access graph').ui_print_help_icon('agent_access', true); +$table_other->data[7][0] = __('Use agent access graph'); $table_other->data[7][1] = html_print_checkbox_switch('agentaccess', 1, $config['agentaccess'], true); $table_other->data[8][0] = __('Max. recommended number of files in attachment directory'); @@ -707,24 +707,24 @@ $table_other->data[13][1] = html_print_input_text( echo '
'; echo '
'; - echo ''.__('Database maintenance status').''; + echo ''.__('Database maintenance status').' '.ui_print_help_icon('database_maintenance_status_tab', true).''; html_print_table($table_status); echo '
'; echo '
'; - echo ''.__('Database maintenance options').''; + echo ''.__('Database maintenance options').' '.ui_print_help_icon('database_maintenance_options_tab', true).''; html_print_table($table); echo '
'; if ($config['history_db_enabled'] == 1) { echo '
'; - echo ''.__('Historical database maintenance options').''; + echo ''.__('Historical database maintenance options').' '.ui_print_help_icon('historical_database_maintenance_options_tab', true).''; html_print_table($table_historical); echo '
'; } echo '
'; - echo ''.__('Others').''; + echo ''.__('Others').' '.ui_print_help_icon('others_database_maintenance_options_tab', true).''; html_print_table($table_other); echo '
'; diff --git a/pandora_console/godmode/setup/setup.php b/pandora_console/godmode/setup/setup.php index 6ee8577367..f5bfc8c635 100644 --- a/pandora_console/godmode/setup/setup.php +++ b/pandora_console/godmode/setup/setup.php @@ -135,9 +135,9 @@ if (enterprise_installed()) { switch ($section) { case 'general': - default: $buttons['general']['active'] = true; $subpage = ' » '.__('General'); + $help_header = 'setup_general_tab'; break; case 'auth': @@ -148,7 +148,7 @@ switch ($section) { case 'perf': $buttons['perf']['active'] = true; $subpage = ' » '.__('Performance'); - $help_header = 'performance'; + $help_header = ''; break; case 'vis': @@ -164,16 +164,34 @@ switch ($section) { case 'ehorus': $buttons['ehorus']['active'] = true; $subpage = ' » '.__('eHorus'); + $help_header = 'setup_ehorus_tab'; break; case 'notifications': $buttons['notifications']['active'] = true; $subpage = ' » '.__('Notifications'); break; + + case 'enterprise': + $buttons['enterprise']['active'] = true; + $subpage = ' » '.__('Enterprise'); + $help_header = 'setup_enterprise_tab'; + break; + + default: + // Default. + break; } // Header. -ui_print_page_header(__('Configuration').$subpage, '', false, $help_header, true, $buttons); +ui_print_page_header( + __('Configuration').$subpage, + '', + false, + $help_header, + true, + $buttons +); if (isset($config['error_config_update_config'])) { if ($config['error_config_update_config']['correct'] == false) { diff --git a/pandora_console/godmode/setup/setup_general.php b/pandora_console/godmode/setup/setup_general.php index 4f2679fcf9..8079aee1e8 100644 --- a/pandora_console/godmode/setup/setup_general.php +++ b/pandora_console/godmode/setup/setup_general.php @@ -82,7 +82,7 @@ $table->data[2][1] = html_print_input_text('phantomjs_bin', io_safe_output($conf $table->data[6][0] = __('Auto login (hash) password'); $table->data[6][1] = html_print_input_password('loginhash_pwd', io_output_password($config['loginhash_pwd']), '', 15, 15, true); -$table->data[9][0] = __('Time source').ui_print_help_icon('timesource', true); +$table->data[9][0] = __('Time source'); $sources['system'] = __('System'); $sources['sql'] = __('Database'); $table->data[9][1] = html_print_select($sources, 'timesource', $config['timesource'], '', '', '', true); @@ -107,7 +107,7 @@ $table->data[13][1] = html_print_input_text('cert_path', io_safe_output($config[ $table->data[14][0] = __('Attachment store').ui_print_help_tip(__('Directory where temporary data is stored.'), true); $table->data[14][1] = html_print_input_text('attachment_store', io_safe_output($config['attachment_store']), '', 50, 255, true); -$table->data[15][0] = __('IP list with API access').ui_print_help_icon('ip_api_list', true); +$table->data[15][0] = __('IP list with API access'); if (isset($_POST['list_ACL_IPs_for_API'])) { $list_ACL_IPs_for_API = get_parameter_post('list_ACL_IPs_for_API'); } else { diff --git a/pandora_console/godmode/setup/setup_notifications.php b/pandora_console/godmode/setup/setup_notifications.php index 9ee95f78cc..8f6630d4e3 100644 --- a/pandora_console/godmode/setup/setup_notifications.php +++ b/pandora_console/godmode/setup/setup_notifications.php @@ -160,6 +160,20 @@ if (get_parameter('get_notifications_dropdown', 0)) { return; } +if (get_parameter('get_notification', 0)) { + $msg_id = get_parameter('id', 0); + + if ($msg_id > 0) { + $msg = messages_get_message($msg_id); + + $msg['mensaje'] = io_safe_output($msg['mensaje']); + $msg['subject'] = io_safe_output($msg['subject']); + echo json_encode($msg); + } + + return; +} + // Notification table. It is just a wrapper. $table_content = new StdClass(); $table_content->data = []; diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 70a111f59c..cff2c81c34 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -117,7 +117,7 @@ if (enterprise_installed()) { } echo '
'; -echo ''.__('Behaviour configuration').''; +echo ''.__('Behaviour configuration').' '.ui_print_help_icon('behavoir_conf_tab', true).''; html_print_table($table_behaviour); echo '
'; // ---------------------------------------------------------------------- @@ -263,12 +263,12 @@ function logo_custom_enterprise($name, $logo) } -$table_styles->data[$row][0] = __('Custom logo (menu)').ui_print_help_icon('custom_logo', true); +$table_styles->data[$row][0] = __('Custom logo (menu)'); $table_styles->data[$row][1] = logo_custom_enterprise('custom_logo', $config['custom_logo']); $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); $row++; -$table_styles->data[$row][0] = __('Custom logo collapsed (menu)').ui_print_help_icon('custom_logo_collapsed', true); +$table_styles->data[$row][0] = __('Custom logo collapsed (menu)'); $table_styles->data[$row][1] = logo_custom_enterprise('custom_logo_collapsed', $config['custom_logo_collapsed']); $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_collapsed_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); $row++; @@ -312,7 +312,7 @@ if (enterprise_installed()) { $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_white_bg_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); $row++; -$table_styles->data[$row][0] = __('Custom logo (login)').ui_print_help_icon('custom_logo', true); +$table_styles->data[$row][0] = __('Custom logo (login)'); if (enterprise_installed()) { $table_styles->data[$row][1] = html_print_select( @@ -565,7 +565,7 @@ $row++; echo '
'; - echo ''.__('Style configuration').''; + echo ''.__('Style configuration').' '.ui_print_help_icon('style_conf_tab', true).''; html_print_table($table_styles); echo '
'; // ---------------------------------------------------------------------- @@ -608,7 +608,7 @@ $row++; $row++; echo '
'; - echo ''.__('GIS configuration').''; + echo ''.__('GIS configuration').' '.ui_print_help_icon('gis_conf_tab', true).''; html_print_table($table_gis); echo '
'; // ---------------------------------------------------------------------- @@ -702,7 +702,7 @@ $row++; $row++; echo '
'; - echo ''.__('Font and Text configuration').''; + echo ''.__('Font and Text configuration').' '.ui_print_help_icon('front_and_text_conf_tab', true).''; html_print_table($table_font); echo '
'; // ---------------------------------------------------------------------- @@ -890,7 +890,7 @@ $row++; */ echo '
'; - echo ''.__('Charts configuration').''; + echo ''.__('Charts configuration').' '.ui_print_help_icon('charts_conf_tab', true).''; html_print_table($table_chars); echo '
'; // ---------------------------------------------------------------------- @@ -937,7 +937,7 @@ $row++; echo '
'; - echo ''.__('Visual consoles configuration').''; + echo ''.__('Visual consoles configuration').' '.ui_print_help_icon('visual_consoles_conf_tab', true).''; html_print_table($table_vc); echo '
'; @@ -955,7 +955,7 @@ $row++; $table_ser->data['number'][1] = ""; echo '
'; - echo ''.__('Services configuration').''; + echo ''.__('Services configuration').' '.ui_print_help_icon('services_conf_tab', true).''; html_print_table($table_ser); echo '
'; @@ -1134,7 +1134,7 @@ $row++; ); $row++; - $table_other->data[$row][0] = __('Date format string').ui_print_help_icon('date_format', true); + $table_other->data[$row][0] = __('Date format string'); $table_other->data[$row][1] = ''.__('Example').' '.date($config['date_format']); $table_other->data[$row][1] .= html_print_input_text('date_format', $config['date_format'], '', 30, 100, true); $row++; @@ -1147,7 +1147,7 @@ $row++; $comparation = false; } - $table_other->data[$row][0] = __('Timestamp or time comparation').ui_print_help_icon('time_stamp-comparation', true); + $table_other->data[$row][0] = __('Timestamp or time comparation'); $table_other->data[$row][1] = __('Comparation in rollover').' '; $table_other->data[$row][1] .= html_print_radio_button('prominent_time', 'comparation', '', $comparation, true); $table_other->data[$row][1] .= '
'.__('Timestamp in rollover').' '; @@ -1253,7 +1253,7 @@ $row++; echo '
'; - echo ''.__('Other configuration').''; + echo ''.__('Other configuration').' '.ui_print_help_icon('other_conf_tab', true).''; html_print_table($table_other); echo '
'; diff --git a/pandora_console/godmode/snmpconsole/snmp_alert.php b/pandora_console/godmode/snmpconsole/snmp_alert.php index 677a283854..a2a1b8b811 100755 --- a/pandora_console/godmode/snmpconsole/snmp_alert.php +++ b/pandora_console/godmode/snmpconsole/snmp_alert.php @@ -76,7 +76,7 @@ if ($update_alert || $modify_alert) { __('SNMP Console').' » '.__('Update alert'), 'images/op_snmp.png', false, - 'snmp_alert', + 'snmp_alert_update_tab', false ); } else if ($create_alert || $save_alert) { @@ -84,7 +84,7 @@ if ($update_alert || $modify_alert) { __('SNMP Console').' » '.__('Create alert'), 'images/op_snmp.png', false, - 'snmp_alert', + 'snmp_alert_overview_tab', false ); } else { @@ -92,7 +92,7 @@ if ($update_alert || $modify_alert) { __('SNMP Console').' » '.__('Alert overview'), 'images/op_snmp.png', false, - 'snmp_alert', + 'snmp_alert_overview_tab', false ); } @@ -757,7 +757,6 @@ if ($create_alert || $update_alert) { // Custom echo ''.__('Custom Value/OID'); - echo ui_print_help_icon('snmp_alert_custom', true); echo ''; html_print_textarea('custom_value', 2, 2, $custom_value, 'style="width:400px;"'); @@ -804,7 +803,7 @@ if ($create_alert || $update_alert) { echo ''; // Variable bindings/Data #1 - echo ''.''.__('Variable bindings/Data').ui_print_help_icon('field_match_snmp', true).''.''; + echo ''.''.__('Variable bindings/Data').''; echo '#'; html_print_input_text('order_1', $order_1, '', 4); html_print_input_text('custom_oid_data_1', $custom_oid_data_1, '', 60); @@ -1077,7 +1076,7 @@ if ($create_alert || $update_alert) { } echo ''; - echo ''.__('Position').ui_print_help_icon('snmp_alert_position', true).''; + echo ''.__('Position').''; html_print_input_text('position', $position, '', 3); echo ''; diff --git a/pandora_console/godmode/snmpconsole/snmp_trap_generator.php b/pandora_console/godmode/snmpconsole/snmp_trap_generator.php index ec8ed20930..43ed63abec 100755 --- a/pandora_console/godmode/snmpconsole/snmp_trap_generator.php +++ b/pandora_console/godmode/snmpconsole/snmp_trap_generator.php @@ -33,7 +33,13 @@ $snmp_type = (int) get_parameter('snmp_type', 0); $snmp_value = (string) get_parameter('snmp_value', ''); $generate_trap = (bool) get_parameter('generate_trap', 0); -ui_print_page_header(__('SNMP Trap generator'), 'images/op_snmp.png', false, '', false); +ui_print_page_header( + __('SNMP Trap generator'), + 'images/op_snmp.png', + false, + 'snmp_trap_generator_view', + false +); if ($generate_trap) { $result = true; @@ -64,22 +70,64 @@ $table->size = []; $table->data = []; $table->data[0][0] = __('Host address'); -$table->data[0][1] = html_print_input_text('snmp_host_address', $snmp_host_address, '', 50, 255, true); +$table->data[0][1] = html_print_input_text( + 'snmp_host_address', + $snmp_host_address, + '', + 50, + 255, + true +); $table->data[0][2] = __('Community'); -$table->data[0][3] = html_print_input_text('snmp_community', $snmp_community, '', 50, 255, true); +$table->data[0][3] = html_print_input_text( + 'snmp_community', + $snmp_community, + '', + 50, + 255, + true +); $table->data[2][0] = __('Enterprise String'); -$table->data[2][1] = html_print_input_text('snmp_oid', $snmp_oid, '', 50, 255, true); +$table->data[2][1] = html_print_input_text( + 'snmp_oid', + $snmp_oid, + '', + 50, + 255, + true +); $table->data[2][2] = __('Value'); -$table->data[2][3] = html_print_input_text('snmp_value', $snmp_value, '', 50, 255, true); +$table->data[2][3] = html_print_input_text( + 'snmp_value', + $snmp_value, + '', + 50, + 255, + true +); $table->data[3][0] = __('SNMP Agent'); -$table->data[3][1] = html_print_input_text('snmp_agent', $snmp_agent, '', 50, 255, true); +$table->data[3][1] = html_print_input_text( + 'snmp_agent', + $snmp_agent, + '', + 50, + 255, + true +); -$table->data[3][2] = __('SNMP Type').' '.ui_print_help_icon('snmp_trap_types', true); -$table->data[3][3] = html_print_input_text('snmp_type', $snmp_type, '', 50, 255, true); +$table->data[3][2] = __('SNMP Type'); +$table->data[3][3] = html_print_input_text( + 'snmp_type', + $snmp_type, + '', + 50, + 255, + true +); $types = [ 0 => 'Cold start (0)', @@ -90,7 +138,17 @@ $types = [ 5 => 'EGP neighbor loss (5)', 6 => 'Enterprise (6)', ]; -$table->data[3][3] = html_print_select($types, 'snmp_type', $snmp_type, '', __('Select'), -1, true, false, false); +$table->data[3][3] = html_print_select( + $types, + 'snmp_type', + $snmp_type, + '', + __('Select'), + -1, + true, + false, + false +); $traps_generator .= html_print_table($table, true); diff --git a/pandora_console/godmode/tag/tag.php b/pandora_console/godmode/tag/tag.php index 9d5040c0de..8a8ddc8887 100644 --- a/pandora_console/godmode/tag/tag.php +++ b/pandora_console/godmode/tag/tag.php @@ -117,7 +117,14 @@ if (is_metaconsole()) { // ui_meta_print_header(__('Tags'), "", $buttons); } else { // Header - ui_print_page_header(__('Tags configuration'), 'images/tag.png', false, 'tags_config', true, $buttons); + ui_print_page_header( + __('Tags configuration'), + 'images/tag.png', + false, + 'tags_config', + true, + $buttons + ); } // Two actions can performed in this page: search and delete tags diff --git a/pandora_console/godmode/update_manager/update_manager.messages.php b/pandora_console/godmode/update_manager/update_manager.messages.php deleted file mode 100644 index 31f9866b01..0000000000 --- a/pandora_console/godmode/update_manager/update_manager.messages.php +++ /dev/null @@ -1,340 +0,0 @@ - $message_id) { - update_manger_set_read_message($message_id, 0); - } -} - -if ($read_action !== false) { - $selected = get_parameter('select_multiple', false); - foreach ($selected as $k => $message_id) { - update_manger_set_read_message($message_id, 1); - } -} - -if ($delete_action !== false) { - $selected = get_parameter('select_multiple', false); - foreach ($selected as $k => $message_id) { - update_manger_set_deleted_message($message_id); - } -} - -$offset = (int) get_parameter('offset', 0); - -$total_messages = update_manager_get_not_deleted_messages(); -if ($total_messages) { - // Get all messages - $sql = 'SELECT data, svn_version, filename, data_rollback, db_field_value FROM tupdate '; - $sql .= 'WHERE description NOT LIKE \'%"'.$config['id_user'].'":1%\' '; - $sql .= 'OR description IS NULL '; - $sql .= 'ORDER BY svn_version DESC '; - $sql .= 'LIMIT '.$offset.','.$config['block_size'].' '; - $um_messages = []; - $um_messages = db_get_all_rows_sql($sql); - - echo ''; - - html_print_input_hidden('tab', 'messages'); - html_print_input_hidden('offset', $offset); - echo '
'; - html_print_submit_button( - __('Delete'), - 'delete_button', - false, - 'class="sub delete"' - ); - echo '
'; - - echo '
'; - html_print_submit_button( - __('Mark as not read'), - 'not_read_button', - false, - 'class="sub wand"' - ); - echo '
'; - - echo '
'; - html_print_submit_button( - __('Mark as read'), - 'read_button', - false, - 'class="sub upd"' - ); - echo '
'; - - // Pagination - if ($total_messages > $config['block_size']) { - ui_pagination(update_manager_get_total_messages(), false, 0); - } - - $table = new stdClass(); - $table->width = '100%'; - $table->class = 'databox data'; - $table->cellpadding = 4; - $table->cellspacing = 4; - $table->head = []; - $table->data = []; - $table->align = []; - $table->size = []; - $table->id = 'um_messages_table'; - - $table->align[0] = 'left'; - $table->align[1] = 'left'; - $table->align[2] = 'left'; - $table->align[3] = 'left'; - $table->align[4] = 'left'; - - $table->size[0] = '30px'; - $table->size[1] = '100px'; - $table->size[3] = '80px'; - $table->size[4] = '60px'; - - $table->style[0] = 'padding-left: 20px'; - $table->style[1] = 'display: none'; - - $table->head[0] = html_print_checkbox_extended('all_selection[]', 0, false, false, '', '', true); - $table->head[2] = __('Subject'); - - - $i = 0; - foreach ($um_messages as $message) { - $data[0] = html_print_checkbox_extended('select_multiple[]', $message['svn_version'], false, false, '', 'class="check_selection"', true); - $table->cellclass[count($table->data)][0] = 'um_individual_check'; - - $data[1] = $message['svn_version']; - $table->cellclass[count($table->data)][1] = 'um_individual_info'; - - $data[2] = io_safe_output($message['db_field_value']); - $table->cellclass[count($table->data)][2] = 'um_individual_subject'; - - - // Change row class if message is read or not by this user - if (update_manger_get_read_message($message['svn_version'], $message['data_rollback'])) { - $table->rowclass[count($table->data)] = 'um_read_message'; - } else { - $table->rowclass[count($table->data)] = 'um_not_read_message'; - } - - array_push($table->data, $data); - } - - html_print_table($table); - - echo '
'; - html_print_submit_button( - __('Delete'), - 'delete_button', - false, - 'class="sub delete"' - ); - echo '
'; - - echo '
'; - html_print_submit_button( - __('Mark as not read'), - 'not_read_button', - false, - 'class="sub wand"' - ); - echo '
'; - - echo '
'; - html_print_submit_button( - __('Mark as read'), - 'read_button', - false, - 'class="sub upd"' - ); - echo '
'; - echo '
'; - - // Get unread messages to update the notification ball. - // Clean the cache because the unread messages can be different. - db_clean_cache(); - $total_unread_messages = update_manager_get_unread_messages(); -} else { - ui_print_info_message([ 'no_close' => true, 'message' => __('There is not any update manager messages.') ]); -} -?> - - - - diff --git a/pandora_console/godmode/update_manager/update_manager.online.php b/pandora_console/godmode/update_manager/update_manager.online.php index ef9b25075c..a1524d5518 100644 --- a/pandora_console/godmode/update_manager/update_manager.online.php +++ b/pandora_console/godmode/update_manager/update_manager.online.php @@ -1,22 +1,32 @@ - @import 'styles/meta_pandora.css'; - "; -} - -if (is_metaconsole()) { - $baseurl = ui_get_full_url(false, false, false, false); - echo ' '; - echo "
"; } else { - echo "
"; + $php_settings_fine++; } -echo ""; -echo ""; -echo ''; - -echo '

'.__('The latest version of package installed is:').'

'; -if ($open) { - echo '
'.$build_version.'
'; +$post_max_size = config_return_in_bytes(ini_get('post_max_size')); +if ($post_max_size < $PHPpost_max_size_min) { + ui_print_error_message( + sprintf( + __('Your PHP has post_max_size limited to %s. To use Update Manager Online, please set it to %s'), + ini_get('post_max_size'), + $post_max_size_min + ) + ); } else { - echo '
'.$current_package.'
'; + $php_settings_fine++; } - echo "'; +$upload_max_filesize = config_return_in_bytes(ini_get('upload_max_filesize')); +if ($upload_max_filesize < $PHPupload_max_filesize_min) { + ui_print_error_message( + sprintf( + __('Your PHP has set maximum allowed size for uploaded files limit in %s. To use Update Manager Online, please set it to %s'), + ini_get('upload_max_filesize'), + $upload_max_filesize_min + ) + ); +} else { + $php_settings_fine++; +} - echo "'; +// Verify registry. +if (update_manager_verify_registration() === false) { + ui_require_css_file('register'); + registration_wiz_modal(false, true, 'location.reload()'); + ui_print_error_message( + __('Update Manager Online requires registration') + ); +} else { + // Console registered. + $current_package = update_manager_get_current_package(); - echo "
"; + if (!enterprise_installed()) { + $open = true; + } - echo ""; + // Translators: Do not translade Update Manager, it's the name of the program. + if (is_metaconsole()) { + echo ""; + } + + if (is_metaconsole()) { + $baseurl = ui_get_full_url(false, false, false, false); + echo ' '; + echo "
"; + } else { + echo "
"; + } + + if ($php_settings_fine >= $PHP_SETTINGS_REQUIRED) { + echo ""; + echo ""; + echo ''; + } + + echo '

'.__('The latest version of package installed is:').'

'; + if ($open) { + echo '
'.$build_version.'
'; + } else { + echo '
'.$current_package.'
'; + } + + echo "'; + + echo "'; + + echo "
"; + + echo ""; /* - ------------------------------------------------------------------------- + * ------------------------------------------------------------------------- + * Hello there! :) + * We added some of what seems to be "buggy" messages to the openSource + * version recently. This is not to force open-source users to move to the + * enterprise version, this is just to inform people using Pandora FMS open + * source that it requires skilled people to maintain and keep it running + * smoothly without professional support. This does not imply open-source + * version is limited in any way. If you check the recently added code, it + * contains only warnings and messages, no limitations except one: + * we removed the option to add custom logo in header. + * + * In the Update Manager section, it warns about the 'danger’ of applying + * automated updates without a proper backup, remembering in the process + * that the Enterprise version comes with a human-tested package. + * + * Maintaining an OpenSource version with more than 500 agents is not so + * easy, that's why someone using a Pandora with 8000 agents should consider + * asking for support. It's not a joke, we know of many setups with a huge + * number of agents, and we hate to hear that “its becoming unstable and + * slow” :( + * + * You can of course remove the warnings, that's why we include the source + * and do not use any kind of trick. And that's why we added here this + * comment, to let you know this does not reflect any change in our + * opensource mentality of does the last 14 years. + * ------------------------------------------------------------------------- + */ - Hello there! :) + if ($open) { + echo "
+
+
+

".__('WARNING: You are just one click away from an automated update. This may result in a damaged system, including loss of data and operativity. Check you have a recent backup. OpenSource updates are automatically created packages, and there is no WARRANTY or SUPPORT. If you need professional support and warranty, please upgrade to Enterprise Version.')."

+
+ +
"; + } - We added some of what seems to be "buggy" messages to the openSource version - recently. This is not to force open-source users to move to the enterprise - version, this is just to inform people using Pandora FMS open source that it - requires skilled people to maintain and keep it running smoothly without - professional support. This does not imply open-source version is limited - in any way. If you check the recently added code, it contains only warnings - and messages, no limitations except one: we removed the option to add custom - logo in header. In the Update Manager section, it warns about the 'danger’ - of applying automated updates without a proper backup, remembering in the - process that the Enterprise version comes with a human-tested package. - Maintaining an OpenSource version with more than 500 agents is not so - easy, that's why someone using a Pandora with 8000 agents should consider - asking for support. It's not a joke, we know of many setups with a huge - number of agents, and we hate to hear that “its becoming unstable and slow” :( - You can of course remove the warnings, that's why we include the source and - do not use any kind of trick. And that's why we added here this comment, to - let you know this does not reflect any change in our opensource mentality of - does the last 14 years. + if ($php_settings_fine >= $PHP_SETTINGS_REQUIRED) { + $enterprise = enterprise_hook('update_manager_enterprise_main'); - ------------------------------------------------------------------------- - */ + if ($enterprise == ENTERPRISE_NOT_HOOK) { + // Open view. + update_manager_main(); + } + ?> -if ($open) { - echo "
-
-
-

".__('WARNING: You are just one click away from an automated update. This may result in a damaged system, including loss of data and operativity. Check you have a recent backup. OpenSource updates are automatically created packages, and there is no WARRANTY or SUPPORT. If you need professional support and warranty, please upgrade to Enterprise Version.')."

-
- -
"; + + - - \ No newline at end of file diff --git a/pandora_console/godmode/update_manager/update_manager.php b/pandora_console/godmode/update_manager/update_manager.php index db91738a17..7954fd0ada 100644 --- a/pandora_console/godmode/update_manager/update_manager.php +++ b/pandora_console/godmode/update_manager/update_manager.php @@ -45,12 +45,6 @@ $buttons = [ ], ]; -if (license_free()) { - $buttons['messages'] = [ - 'active' => ($tab == 'messages') ? true : false, - 'text' => ''.html_print_image('images/email_mc.png', true, ['title' => __('Update manager messages')]).'', - ]; -} switch ($tab) { case 'setup': @@ -59,14 +53,12 @@ switch ($tab) { case 'offline': $title = __('Update manager » Offline'); + $help_header = 'update_manager_offline_tab'; break; case 'online': $title = __('Update manager » Online'); - break; - - case 'messages': - $title = __('Update manager » Messages'); + $help_header = 'update_manager_online_tab'; break; } @@ -74,7 +66,7 @@ ui_print_page_header( $title, 'images/gm_setup.png', false, - '', + $help_header, true, $buttons ); @@ -88,10 +80,6 @@ switch ($tab) { include $config['homedir'].'/godmode/update_manager/update_manager.offline.php'; break; - case 'messages': - include $config['homedir'].'/godmode/update_manager/update_manager.messages.php'; - break; - case 'online': default: include $config['homedir'].'/godmode/update_manager/update_manager.online.php'; diff --git a/pandora_console/godmode/users/configure_profile.php b/pandora_console/godmode/users/configure_profile.php index a9adcd0069..418add8aa8 100644 --- a/pandora_console/godmode/users/configure_profile.php +++ b/pandora_console/godmode/users/configure_profile.php @@ -47,7 +47,14 @@ if (!is_metaconsole()) { $buttons[$tab]['active'] = true; - ui_print_page_header(__('User management').' » '.__('Profiles defined on %s', get_product_name()), 'images/gm_users.png', false, '', true, $buttons); + ui_print_page_header( + __('User management').' » '.__('Profiles defined on %s', get_product_name()), + 'images/gm_users.png', + false, + 'configure_profiles_tab', + true, + $buttons + ); $sec2 = 'gusuarios'; } else { user_meta_print_header(); diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 8df7f9d6f9..9118b5b9e4 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -90,7 +90,14 @@ if ($meta) { $buttons[$tab]['active'] = true; - ui_print_page_header(__('User detail editor'), 'images/gm_users.png', false, '', true, $buttons); + ui_print_page_header( + __('User detail editor'), + 'images/gm_users.png', + false, + 'profile_tab', + true, + $buttons + ); $sec = 'gusuarios'; } diff --git a/pandora_console/godmode/users/profile_list.php b/pandora_console/godmode/users/profile_list.php index afc2b9813c..da77dffd9f 100644 --- a/pandora_console/godmode/users/profile_list.php +++ b/pandora_console/godmode/users/profile_list.php @@ -51,7 +51,14 @@ if (!defined('METACONSOLE')) { $buttons[$tab]['active'] = true; - ui_print_page_header(__('User management').' » '.__('Profiles defined on %s', get_product_name()), 'images/gm_users.png', false, 'profile', true, $buttons); + ui_print_page_header( + __('User management').' » '.__('Profiles defined on %s', get_product_name()), + 'images/gm_users.png', + false, + 'profile_tab', + true, + $buttons + ); $sec = 'gusuarios'; } else { user_meta_print_header(); diff --git a/pandora_console/godmode/wizards/HostDevices.class.php b/pandora_console/godmode/wizards/HostDevices.class.php index cd7f52f0df..3cc2e3f71d 100755 --- a/pandora_console/godmode/wizards/HostDevices.class.php +++ b/pandora_console/godmode/wizards/HostDevices.class.php @@ -594,106 +594,122 @@ class HostDevices extends Wizard if (isset($this->page) === false || $this->page == 0 ) { - // Comment input - $comment_input = '
'; + $form = []; - $comment_input .= $this->printInput( - [ - 'name' => 'comment', - 'rows' => 1, - 'columns' => 1, - 'value' => $this->task['description'], - 'type' => 'textarea', - 'size' => 25, - 'class' => 'discovery_textarea_input', - 'return' => true, - ] - ); + $str = __('Next'); - // Task input - $taskname_input_label = '
'; + if (isset($this->task['id_rt']) === true) { + $str = __('Update and continue'); + } - $taskname_input = $this->printInput( - [ - 'name' => 'taskname', - 'value' => $this->task['name'], - 'type' => 'text', - 'size' => 25, - 'class' => 'discovery_full_width_input', - ] - ); - - // Network input - $network_input_label .= '
'.ui_print_help_tip(__('You can specify several networks, separated by commas, for example: 192.168.50.0/24,192.168.60.0/24'), true).'
'; - - $network_input = $this->printInput( - [ - 'name' => 'network', - 'value' => $this->task['subnet'], - 'type' => 'text', - 'size' => 25, - 'class' => 'discovery_full_width_input', - ] - ); - - // Discovery server input - $discovery_server_select_label = '
'.ui_print_help_tip(__('You must select a Discovery Server to run the Task, otherwise the Recon Task will never run'), true).'
'; - - $discovery_server_select = $this->printInput( - [ - 'type' => 'select_from_sql', - 'sql' => sprintf( - 'SELECT id_server, name - FROM tserver - WHERE server_type = %d - ORDER BY name', - SERVER_TYPE_DISCOVERY - ), - 'name' => 'id_recon_server', - 'selected' => $this->task['id_recon_server'], - 'return' => true, - 'style' => 'width: 100%', - ] - ); - - // Interval input + // Interval and schedules. $interv_manual = 0; if ((int) $this->task['interval_sweep'] == 0) { $interv_manual = 1; } - $interval_input_label = '
'.ui_print_help_tip(__('Manual interval means that it will run only on demand.'), true).'
'; + $form['rows'][0]['new_form_block'] = true; - $interval_input = $this->printInput( - [ - 'type' => 'select', - 'selected' => $interv_manual, - 'fields' => [ - 0 => __('Defined'), - 1 => __('Manual'), + $form['rows'][0]['columns'][0] = [ + 'width' => '30%', + 'style' => 'padding: 9px;', + 'inputs' => [ + '0' => [ + 'arguments' => [ + 'name' => 'submit', + 'label' => $str, + 'type' => 'submit', + 'attributes' => 'class="sub next"', + 'return' => true, + ], ], - 'name' => 'interval_manual_defined', - 'return' => true, - 'style' => 'float: right;', - ] - ); + '1' => '
'.html_print_image('images/wizard/netscan_green.png', true, ['title' => __('Close')], false).'
', + '2' => [ + 'label' => ''.__('Interval').':'.ui_print_help_tip( + __('Manual interval means that it will be executed only On-demand'), + true + ), + 'arguments' => [ + 'type' => 'select', + 'selected' => $interv_manual, + 'fields' => [ + 0 => __('Defined'), + 1 => __('Manual'), + ], + 'name' => 'interval_manual_defined', + 'return' => true, + ], + 'extra' => ''.html_print_extended_select_for_time( + 'interval', + $this->task['interval_sweep'], + '', + '', + '0', + false, + true, + false, + false + ).ui_print_help_tip( + __('The minimum recomended interval for Recon Task is 5 minutes'), + true + ).'', - $interval_input_extra = ''.html_print_extended_select_for_time( - 'interval', - $this->task['interval_sweep'], - '', - '', - '0', - false, - true, - false, - false - ).ui_print_help_tip( - __('The minimum recomended interval for Recon Task is 5 minutes'), - true - ).''; + ], + ], + ]; - // Group select + $form['rows'][0]['columns'][1] = [ + 'width' => '40%', + 'padding-right' => '12%', + 'padding-left' => '5%', + 'inputs' => [ + '0' => [ + 'label' => ''.__('Task name').':', + 'arguments' => [ + 'name' => 'taskname', + 'value' => $this->task['name'], + 'type' => 'text', + 'size' => 25, + 'class' => 'discovery_full_width_input', + ], + ], + '1' => [ + 'label' => ''.__('Discovery server').':'.ui_print_help_tip( + __('You must select a Discovery Server to run the Task, otherwise the Recon Task will never run'), + true + ), + 'arguments' => [ + 'type' => 'select_from_sql', + 'sql' => sprintf( + 'SELECT id_server, name + FROM tserver + WHERE server_type = %d + ORDER BY name', + SERVER_TYPE_DISCOVERY + ), + 'name' => 'id_recon_server', + 'style' => 'width: 100%;', + 'selected' => $this->task['id_recon_server'], + 'return' => true, + ], + ], + '2' => [ + 'label' => ''.__('Network').':'.ui_print_help_tip( + __('You can specify several networks, separated by commas, for example: 192.168.50.0/24,192.168.60.0/24'), + true + ), + 'arguments' => [ + 'name' => 'network', + 'value' => $this->task['subnet'], + 'type' => 'text', + 'size' => 25, + 'class' => 'discovery_full_width_input', + ], + ], + ], + ]; + + // Group select (custom for this section). $group_select = '
'; $group_select .= $this->printInput( @@ -710,22 +726,41 @@ class HostDevices extends Wizard ] ); - if (isset($this->task['id_rt']) === true) { - // Propagate ID - $task_hidden = $this->printInput( - [ - 'name' => 'task', - 'value' => $this->task['id_rt'], - 'type' => 'hidden', - ] - ); - } + $form['rows'][0]['columns'][2] = [ + 'width' => '30%', + 'inputs' => ['0' => $group_select], + ]; + + $form['rows'][1]['style'] = 'style de row'; + $form['rows'][1]['columns'][0] = [ + 'padding-right' => '0', + 'inputs' => [ + '0' => [ + 'label' => ''.__('Comment').':', + 'arguments' => [ + 'name' => 'comment', + 'rows' => 1, + 'columns' => 1, + 'value' => $this->task['description'], + 'type' => 'textarea', + 'size' => 25, + 'class' => 'discovery_textarea_input', + 'return' => true, + ], + ], + ], + ]; $task_url = ''; if (isset($this->task['id_rt'])) { $task_url = '&task='.$this->task['id_rt']; } + $form['form'] = [ + 'method' => 'POST', + 'action' => $this->url.'&mode=netscan&page='.($this->page + 1).$task_url, + ]; + // Default. $interval = 600; $unit = 60; @@ -734,34 +769,7 @@ class HostDevices extends Wizard $unit = $this->getTimeUnit($interval); } - // XXX: Could be improved validating inputs before continue (JS) - // Print NetScan page 0. - // $this->printForm($form); - echo '
'; - echo $task_hidden; - - echo '
-
-
'.'
'.html_print_image('images/wizard/netscan_green.png', true, ['title' => __('Close')], false).'
'.'
'.$interval_input_label.'
'.$interval_input.'
'.$interval_input_extra.'
'.'
- -
-
'.$taskname_input_label.'
'.$taskname_input.'
'.'
'.$discovery_server_select_label.$discovery_server_select.'
'.'
'.$network_input_label.'
'.$network_input.'
'.'
'.'
'.$group_select.'
'.'
'.'
-
- '.$comment_input.' -
-
'.'
'; - - $str = __('Next'); - - if (isset($this->task['id_rt']) === true) { - $str = __('Update and continue'); - } - - echo '
'.html_print_submit_button($str, 'submit', false, 'class="sub next"', true).'
'; - echo '
'; - - echo ''; + $this->printFormAsGrid($form); } } @@ -793,7 +801,6 @@ class HostDevices extends Wizard ], ]; - // Hidden, page. $form['inputs'][] = [ 'arguments' => [ 'name' => 'page', @@ -807,7 +814,6 @@ class HostDevices extends Wizard 'extra' => '

Please, configure task '.io_safe_output($this->task['name']).'

', ]; - // Input: Module template. $form['inputs'][] = [ 'label' => __('Module template'), 'arguments' => [ @@ -870,7 +876,7 @@ class HostDevices extends Wizard 'action' => $this->url.'&mode=netscan&page='.($this->page + 1).'&task='.$this->task['id_rt'], ]; - $this->printForm($form, false, true); + $this->printFormAsList($form); } if ($this->page == 2) { diff --git a/pandora_console/godmode/wizards/Wizard.main.php b/pandora_console/godmode/wizards/Wizard.main.php index dab50570f9..6468f1d2ac 100644 --- a/pandora_console/godmode/wizards/Wizard.main.php +++ b/pandora_console/godmode/wizards/Wizard.main.php @@ -624,6 +624,162 @@ class Wizard } + /** + * Print a block of inputs with grid format. + * + * @param array $input Definition of target block to be printed. + * @param boolean $return Return as string or direct output. + * + * @return string HTML content. + */ + public function printBlockAsGrid(array $input, bool $return=false) + { + $output = ''; + if ($input['hidden'] == 1) { + $class = ' hidden'; + } else { + $class = ''; + } + + if (isset($input['class']) === true) { + $class = $input['class'].$class; + } + + if (is_array($input['block_content']) === true) { + // Print independent block of inputs. + $output .= '
  • '; + $output .= '
      '; + foreach ($input['block_content'] as $input) { + $output .= $this->printBlockAsGrid($input, $return); + } + + $output .= '
  • '; + } else { + if ($input['arguments']['type'] != 'hidden') { + if ($input['arguments']['inline'] != 'true') { + $output .= '
    '; + } else { + $output .= '
    '; + if (!isset($input['extra'])) { + $output .= '
    '; + } + + if (isset($input['extra'])) { + $output .= '
    '; + } + } + + if ($input['arguments']['inline'] == 'true' && isset($input['extra'])) { + $output .= '
    '; + } + + $output .= '
    '; + $output .= $input['label']; + $output .= '
    '; + + if ($input['arguments']['inline'] == 'true' && isset($input['extra'])) { + $output .= '
    '; + } + + if ($input['arguments']['inline'] == 'true' && !isset($input['extra'])) { + $output .= '
    '; + } + + if ($input['arguments']['type'] == 'text' || $input['arguments']['type'] == 'text_extended') { + $output .= '
    '; + $output .= $this->printInput($input['arguments']); + $output .= '
    '; + } else if ($input['arguments']['inline'] == 'true') { + $output .= '
    '; + + if (isset($input['extra'])) { + $output .= '
    '; + } else { + $output .= '
    '; + } + + $output .= $this->printInput($input['arguments']); + $output .= '
    '; + $output .= '
    '; + + if (isset($input['extra'])) { + $output .= '
    '; + } + } else { + $output .= $this->printInput($input['arguments']); + } + + // Allow dynamic content. + $output .= $input['extra']; + $output .= '
    '; + } else { + $output .= $this->printInput($input['arguments']); + // Allow dynamic content. + $output .= $input['extra']; + } + } + + if ($return === false) { + echo $output; + } + + return $output; + } + + + /** + * Print a block of inputs as a list element. + * + * @param array $input Definition of target block to be printed. + * @param boolean $return Return as string or direct output. + * + * @return string HTML content. + */ + public function printBlockAsList(array $input, bool $return=false) + { + $output = ''; + if ($input['hidden'] == 1) { + $class = ' hidden'; + } else { + $class = ''; + } + + if (isset($input['class']) === true) { + $class = $input['class'].$class; + } + + if (is_array($input['block_content']) === true) { + // Print independent block of inputs. + $output .= '
  • '; + $output .= '
      '; + foreach ($input['block_content'] as $input) { + $output .= $this->printBlockAsList($input, $return); + } + + $output .= '
  • '; + } else { + if ($input['arguments']['type'] != 'hidden') { + $output .= '
  • '; + $output .= ''; + $output .= $this->printInput($input['arguments']); + // Allow dynamic content. + $output .= $input['extra']; + $output .= '
  • '; + } else { + $output .= $this->printInput($input['arguments']); + // Allow dynamic content. + $output .= $input['extra']; + } + } + + if ($return === false) { + echo $output; + } + + return $output; + } + + /** * Print a form. * @@ -694,6 +850,163 @@ class Wizard } + /** + * Print a form as a grid of inputs. + * + * @param array $data Definition of target form to be printed. + * @param boolean $return Return as string or direct output. + * + * @return string HTML code. + */ + public function printFormAsGrid(array $data, bool $return=false) + { + $form = $data['form']; + + $rows = $data['rows']; + + $js = $data['js']; + $cb_function = $data['cb_function']; + $cb_args = $data['cb_args']; + + $output_head = '
    '; + + if ($return === false) { + echo $output_head; + } + + try { + if (isset($cb_function) === true) { + call_user_func_array( + $cb_function, + (isset($cb_args) === true) ? $cb_args : [] + ); + } + } catch (Exception $e) { + error_log('Error executing wizard callback: ', $e->getMessage()); + } + + $output_submit = ''; + $output = ''; + + $first_block_printed = false; + + foreach ($rows as $row) { + if ($row['new_form_block'] == true) { + if ($first_block_printed === true) { + // If first form block has been placed, then close it before starting a new one. + $output .= '
    '; + $output .= '
    '; + } else { + $output .= '
    '; + } + + $first_block_printed = true; + } + + $output .= '
    '; + + foreach ($row['columns'] as $column) { + $width = isset($column['width']) ? 'width: '.$column['width'].';' : 'width: 100%;'; + $padding_left = isset($column['padding-left']) ? 'padding-left: '.$column['padding-left'].';' : 'padding-left: 0;'; + $padding_right = isset($column['padding-right']) ? 'padding-right: '.$column['padding-right'].';' : 'padding-right: 0;'; + $extra_styles = isset($column['style']) ? $column['style'] : ''; + + $output .= '
    '; + + foreach ($column['inputs'] as $input) { + if (is_array($input)) { + if ($input['arguments']['type'] != 'submit') { + $output .= $this->printBlockAsGrid($input, true); + } else { + $output_submit .= $this->printBlockAsGrid($input, true); + } + } else { + $output .= $input; + } + } + + $output .= '
    '; + } + + $output .= '
    '; + } + + $output .= '
    '; + + $output .= '
      '.$output_submit.'
    '; + $output .= ''; + $output .= ''; + + if ($return === false) { + echo $output; + } + + return $output_head.$output; + + } + + + /** + * Print a form as a list. + * + * @param array $data Definition of target form to be printed. + * @param boolean $return Return as string or direct output. + * + * @return string HTML code. + */ + public function printFormAsList(array $data, bool $return=false) + { + $form = $data['form']; + $inputs = $data['inputs']; + $js = $data['js']; + $cb_function = $data['cb_function']; + $cb_args = $data['cb_args']; + + $output_head = '
    '; + + if ($return === false) { + echo $output_head; + } + + try { + if (isset($cb_function) === true) { + call_user_func_array( + $cb_function, + (isset($cb_args) === true) ? $cb_args : [] + ); + } + } catch (Exception $e) { + error_log('Error executing wizard callback: ', $e->getMessage()); + } + + $output = '
    '; + $output .= '
      '; + + foreach ($inputs as $input) { + if ($input['arguments']['type'] != 'submit') { + $output .= $this->printBlockAsList($input, true); + } else { + $output_submit .= $this->printBlockAsList($input, true); + } + } + + $output .= '
    '; + $output .= '
    '; + $output .= '
      '.$output_submit.'
    '; + $output .= '
    '; + $output .= ''; + + if ($return === false) { + echo $output; + } + + return $output_head.$output; + + } + + /** * Print a big button element (huge image, big text and link). * diff --git a/pandora_console/include/ajax/alert_list.ajax.php b/pandora_console/include/ajax/alert_list.ajax.php index fef3f3c97c..b8c3705046 100644 --- a/pandora_console/include/ajax/alert_list.ajax.php +++ b/pandora_console/include/ajax/alert_list.ajax.php @@ -153,24 +153,48 @@ if ($show_update_action_menu) { $id_alert = (int) get_parameter('id_alert'); $module_name = modules_get_agentmodule_name($id_agent_module); - $agent_alias = modules_get_agentmodule_agent_alias($id_agent); + + $agent_alias = modules_get_agentmodule_agent_alias($id_agent_module); $id_action = (int) get_parameter('id_action'); $actions = alerts_get_alert_agent_module_actions($id_alert); - $action_opction = db_get_row('talert_template_module_actions', 'id_alert_template_module', $id_alert); + $action_opction = db_get_row( + 'talert_template_module_actions', + 'id_alert_template_module', + $id_alert + ); $data .= '
    '; $data .= ''; - $data .= html_print_input_hidden('update_action', 1, true); - $data .= html_print_input_hidden('id_module_action_ajax', $id_module_action, true); + $data .= html_print_input_hidden( + 'update_action', + 1, + true + ); + $data .= html_print_input_hidden( + 'id_module_action_ajax', + $id_module_action, + true + ); if (! $id_agente) { $data .= ''; $data .= ''; $data .= ''; $data .= ''; } @@ -180,7 +204,14 @@ if ($show_update_action_menu) { $data .= __('Module'); $data .= ''; $data .= ''; $data .= ''; $data .= ''; @@ -188,29 +219,72 @@ if ($show_update_action_menu) { $data .= __('Action'); $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= ''; $data .= '
    '; - $data .= __('Agent'); + $data .= __('Agent').' '.ui_print_help_icon( + 'alert_scalate', + true, + ui_get_full_url(false, false, false, false) + ); $data .= ''; - $data .= ui_print_truncate_text($agent_alias, 'agent_small', false, true, true, '[…]'); + $data .= ui_print_truncate_text( + $agent_alias, + 'agent_small', + false, + true, + true, + '[…]' + ); $data .= '
    '; - $data .= ui_print_truncate_text($module_name, 'module_small', false, true, true, '[…]'); + $data .= ui_print_truncate_text( + $module_name, + 'module_small', + false, + true, + true, + '[…]' + ); $data .= '
    '; - $data .= html_print_select($actions, 'action_select_ajax', $id_action, '', __('None'), 0, true, false, true, '', false, 'width:150px'); + $data .= html_print_select( + $actions, + 'action_select_ajax', + $id_action, + '', + __('None'), + 0, + true, + false, + true, + '', + false, + 'width:150px' + ); $data .= '
    '; - $data .= __('Number of alerts match from').' '.ui_print_help_icon('alert-matches', true, ui_get_full_url(false, false, false, false)); + $data .= __('Number of alerts match from'); $data .= ''; - $data .= html_print_input_text('fires_min_ajax', $action_opction['fires_min'], '', 4, 10, true); + $data .= html_print_input_text( + 'fires_min_ajax', + $action_opction['fires_min'], + '', + 4, + 10, + true + ); $data .= ' '.__('to').' '; - $data .= html_print_input_text('fires_max_ajax', $action_opction['fires_max'], '', 4, 10, true); + $data .= html_print_input_text( + 'fires_max_ajax', + $action_opction['fires_max'], + '', + 4, + 10, + true + ); $data .= '
    '; - $data .= __('Threshold').' '.ui_print_help_icon('action_threshold', true, ui_get_full_url(false, false, false, false)); + $data .= __('Threshold'); $data .= ''; - $data .= html_print_input_text('module_action_threshold_ajax', $action_opction['module_action_threshold'], '', 4, 10, true); + $data .= html_print_input_text( + 'module_action_threshold_ajax', + $action_opction['module_action_threshold'], + '', + 4, + 10, + true + ); $data .= '
    '; - $data .= html_print_submit_button(__('Update'), 'updbutton', false, ['class' => 'sub next', 'style' => 'float:right'], true); + $data .= html_print_submit_button( + __('Update'), + 'updbutton', + false, + [ + 'class' => 'sub next', + 'style' => 'float:right', + ], + true + ); $data .= '
    '; echo $data; return; diff --git a/pandora_console/include/auth/mysql.php b/pandora_console/include/auth/mysql.php index 718a3a6c71..1ab383b672 100644 --- a/pandora_console/include/auth/mysql.php +++ b/pandora_console/include/auth/mysql.php @@ -1254,11 +1254,49 @@ function fill_permissions_ldap($sr) global $config; $permissions = []; $permissions_profile = []; - if ((bool) $config['ldap_save_profile'] === false) { + if (defined('METACONSOLE')) { + $meta = true; + } + + if ($meta && (bool) $config['ldap_save_profile'] === false && $config['ldap_advanced_config'] == 0) { + $result = 0; $result = db_get_all_rows_filter( 'tusuario_perfil', ['id_usuario' => $sr['uid'][0]] ); + if ($result == false) { + $permissions[0]['profile'] = $config['default_remote_profile']; + $permissions[0]['groups'][] = $config['default_remote_group']; + $permissions[0]['tags'] = $config['default_assign_tags']; + $permissions[0]['no_hierarchy'] = $config['default_no_hierarchy']; + return $permissions; + } + + foreach ($result as $perms) { + $permissions_profile[] = [ + 'profile' => $perms['id_perfil'], + 'groups' => [$perms['id_grupo']], + 'tags' => $perms['tags'], + 'no_hierarchy' => (bool) $perms['no_hierarchy'] ? 1 : 0, + ]; + } + + return $permissions_profile; + } + + if ((bool) $config['ldap_save_profile'] === false && $config['ldap_advanced_config'] == '') { + $result = db_get_all_rows_filter( + 'tusuario_perfil', + ['id_usuario' => $sr['uid'][0]] + ); + if ($result == false) { + $permissions[0]['profile'] = $config['default_remote_profile']; + $permissions[0]['groups'][] = $config['default_remote_group']; + $permissions[0]['tags'] = $config['default_assign_tags']; + $permissions[0]['no_hierarchy'] = $config['default_no_hierarchy']; + return $permissions; + } + foreach ($result as $perms) { $permissions_profile[] = [ 'profile' => $perms['id_perfil'], @@ -1268,18 +1306,54 @@ function fill_permissions_ldap($sr) ]; } - if (empty($permissions_profile)) { - $permissions[0]['profile'] = $config['default_remote_profile']; - $permissions[0]['groups'][] = $config['default_remote_group']; - $permissions[0]['tags'] = $config['default_assign_tags']; - $permissions[0]['no_hierarchy'] = $config['default_no_hierarchy']; - return $permissions; - } else { - return $permissions_profile; - } + return $permissions_profile; } - if ($config['autocreate_remote_users']) { + if ($config['ldap_advanced_config'] == 1 && $config['ldap_save_profile'] == 1) { + $ldap_adv_perms = json_decode(io_safe_output($config['ldap_adv_perms']), true); + foreach ($ldap_adv_perms as $ldap_adv_perm) { + $permissions[] = [ + 'profile' => $ldap_adv_perm['profile'], + 'groups' => $ldap_adv_perm['group'], + 'tags' => implode(',', $ldap_adv_perm['tags']), + 'no_hierarchy' => (bool) $ldap_adv_perm['no_hierarchy'] ? 1 : 0, + ]; + } + + return $permissions; + } + + if ($config['ldap_advanced_config'] == 1 && $config['ldap_save_profile'] == 0) { + $result = db_get_all_rows_filter( + 'tusuario_perfil', + ['id_usuario' => $sr['uid'][0]] + ); + if ($result == false) { + $ldap_adv_perms = json_decode(io_safe_output($config['ldap_adv_perms']), true); + foreach ($ldap_adv_perms as $ldap_adv_perm) { + $permissions[] = [ + 'profile' => $ldap_adv_perm['profile'], + 'groups' => $ldap_adv_perm['group'], + 'tags' => implode(',', $ldap_adv_perm['tags']), + 'no_hierarchy' => (bool) $ldap_adv_perm['no_hierarchy'] ? 1 : 0, + ]; + return $permissions; + } + } + + foreach ($result as $perms) { + $permissions_profile[] = [ + 'profile' => $perms['id_perfil'], + 'groups' => [$perms['id_grupo']], + 'tags' => $perms['tags'], + 'no_hierarchy' => (bool) $perms['no_hierarchy'] ? 1 : 0, + ]; + }; + + return $permissions_profile; + } + + if ($config['autocreate_remote_users'] && $config['ldap_save_profile'] == 1) { $permissions[0]['profile'] = $config['default_remote_profile']; $permissions[0]['groups'][] = $config['default_remote_group']; $permissions[0]['tags'] = $config['default_assign_tags']; diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index 7259287d68..1b5a114287 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -194,6 +194,20 @@ class ConsoleSupervisor $this->checkCronRunning(); } + /* + * Check if instance is registered. + * NOTIF.UPDATEMANAGER.REGISTRATION + */ + + $this->checkUpdateManagerRegistration(); + + /* + * Check if there're new messages in UM. + * NOTIF.UPDATEMANAGER.MESSAGES + */ + + $this->getUMMessages(); + } @@ -406,6 +420,20 @@ class ConsoleSupervisor $this->checkCronRunning(); } + /* + * Check if instance is registered. + * NOTIF.UPDATEMANAGER.REGISTRATION + */ + + $this->checkUpdateManagerRegistration(); + + /* + * Check if there're new messages in UM. + * NOTIF.UPDATEMANAGER.MESSAGES + */ + + $this->getUMMessages(); + } @@ -571,6 +599,7 @@ class ConsoleSupervisor case 'NOTIF.UPDATEMANAGER.OPENSETUP': case 'NOTIF.UPDATEMANAGER.UPDATE': case 'NOTIF.UPDATEMANAGER.MINOR': + case 'NOTIF.UPDATEMANAGER.MESSAGES': case 'NOTIF.CRON.CONFIGURED': default: // NOTIF.SERVER.STATUS. @@ -1913,25 +1942,15 @@ class ConsoleSupervisor global $config; $login = get_parameter('login', false); - if (license_free() === true - && users_is_admin($config['id_user']) === true - ) { - $login = get_parameter('login', false); - // Registration advice. - if ((isset($config['instance_registered']) === true - || ($config['instance_registered'] != 1)) && ($login === false) - ) { - $this->notify( - [ - 'type' => 'NOTIF.UPDATEMANAGER.REGISTRATION', - 'title' => __('This instance is not registered in the Update manager section'), - 'message' => __('Click here to start the registration process'), - 'url' => 'javascript: force_run_register();', - ] - ); - } else { - $this->cleanNotifications('NOTIF.UPDATEMANAGER.REGISTRATION'); - } + if (update_manager_verify_registration() === false) { + $this->notify( + [ + 'type' => 'NOTIF.UPDATEMANAGER.REGISTRATION', + 'title' => __('This instance is not registered in the Update manager section'), + 'message' => __('Click here to start the registration process'), + 'url' => 'javascript: force_run_register();', + ] + ); } else { $this->cleanNotifications('NOTIF.UPDATEMANAGER.REGISTRATION'); } @@ -2217,4 +2236,70 @@ class ConsoleSupervisor } + /** + * Search for messages. + * + * @return void + */ + public function getUMMessages() + { + global $config; + + if (update_manager_verify_registration() === false) { + // Console not subscribed. + return; + } + + // Avoid contact for messages too much often. + if (isset($config['last_um_check']) + && time() < $config['last_um_check'] + ) { + return; + } + + // Only ask for messages once a day. + $future = (time() + 2 * SECONDS_1HOUR); + config_update_value('last_um_check', $future); + + include_once $config['homedir'].'/include/functions_update_manager.php'; + + $params = [ + 'pandora_uid' => $config['pandora_uid'], + 'timezone' => $config['timezone'], + 'language' => $config['language'], + ]; + + $result = update_manager_curl_request('get_messages', $params); + + try { + if ($result['success'] === true) { + $messages = json_decode($result['update_message'], true); + } + } catch (Exception $e) { + error_log($e->getMessage()); + }; + + if (is_array($messages)) { + $source_id = get_notification_source_id( + 'Official communication' + ); + foreach ($messages as $message) { + if (!isset($message['url'])) { + $message['url'] = '#'; + } + + $this->notify( + [ + 'type' => 'NOTIF.UPDATEMANAGER.MESSAGES.'.$message['id'], + 'title' => $message['subject'], + 'message' => base64_decode($message['message_html']), + 'url' => $message['url'], + ], + $source_id + ); + } + } + } + + } diff --git a/pandora_console/include/class/CustomNetScan.class.php b/pandora_console/include/class/CustomNetScan.class.php index dc28a696e7..dff9d227e1 100644 --- a/pandora_console/include/class/CustomNetScan.class.php +++ b/pandora_console/include/class/CustomNetScan.class.php @@ -360,7 +360,7 @@ class CustomNetScan extends Wizard // Avoid to print header out of wizard. $this->prepareBreadcrum($breadcrum); - // Header + // Header. ui_print_page_header(__('NetScan Custom'), '', false, '', true, '', false, '', GENERIC_SIZE_TEXT, '', $this->printHeader(true)); } @@ -385,7 +385,7 @@ class CustomNetScan extends Wizard // Avoid to print header out of wizard. $this->prepareBreadcrum($breadcrum); - // Header + // Header. ui_print_page_header(__('NetScan Custom'), '', false, '', true, '', false, '', GENERIC_SIZE_TEXT, '', $this->printHeader(true)); } @@ -594,7 +594,7 @@ class CustomNetScan extends Wizard // XXX: Could be improved validating inputs before continue (JS) // Print NetScan page 0. - $this->printForm($form, false, true); + $this->printFormAsList($form); } } @@ -742,7 +742,7 @@ class CustomNetScan extends Wizard get_explanation_recon_script($(this).val(), "'.$id_task.'", "'.$url_ajax.'"); })'.$change; - $this->printForm($form, false, true); + $this->printFormAsList($form); } if (isset($this->page) === true && $this->page === 2) { diff --git a/pandora_console/include/class/NetworkMap.class.php b/pandora_console/include/class/NetworkMap.class.php index d5e9056be5..90e2f2a0d4 100644 --- a/pandora_console/include/class/NetworkMap.class.php +++ b/pandora_console/include/class/NetworkMap.class.php @@ -3467,19 +3467,18 @@ class NetworkMap $output .= '
    '; - $output .= ' 'arrow_minimap_'.$networkmap['id']]); $output .= '
    '; $output .= '
    '; - $output .= ''; + $output .= html_print_image('/images/icono_borrar.png', true, ['id' => 'image_hide_show_labels']); $output .= '
    '; $output .= '
    'image_hide_show_labels']); $output .= '
    '; // Close networkconsole_id div. diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index e3ce79afd1..e0180374e9 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,8 +20,8 @@ /** * Pandora build version and version */ -$build_version = 'PC190516'; -$pandora_version = 'v7.0NG.734'; +$build_version = 'PC190527'; +$pandora_version = 'v7.0NG.735'; // Do not overwrite default timezone set if defined. $script_tz = @date_default_timezone_get(); diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 8628efb700..73b787ff99 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -3951,3 +3951,1329 @@ function mask2cidr($mask) $base = ip2long('255.255.255.255'); return (32 - log((($long ^ $base) + 1), 2)); } + + +function get_help_info($section_name) +{ + global $config; + // hd($section_name); + $user_language = get_user_language($id_user); + + $es = false; + $result = 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_en:'; + if ($user_language == 'es') { + $es = true; + $result = 'https://wiki.pandorafms.com/index.php?title=Pandora:Documentation_es:'; + } + + switch ($section_name) { + case 'tactical_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Vista_t.C3.A1ctica'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Tactical_view'; + } + break; + + case 'group_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Vista_de_Grupos'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Group_view'; + } + break; + + case 'tree_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Vista_de_.C3.A1rbol'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#The_Tree_View'; + } + break; + + case 'monitor_detail_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Detalles_Monitores'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Monitor_Details'; + } + break; + + case 'tag_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Vista_de_etiquetas'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Tag_view'; + } + break; + + case 'alert_validation': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Detalles_de_Alertas'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Alert_Details'; + } + break; + + case 'agents_alerts_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Vista_de_agente_.2F_alerta'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Agent.2F_Alert_View'; + } + break; + + case 'agents_module_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Vista_de_agente_.2F_modulo'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Agents_.2F_Modules_View'; + } + break; + + case 'module_groups_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Vista_de_grupos_de_m.C3.B3dulos'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Module_Groups_View'; + } + break; + + case 'snmp_browser_view': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Navegador_SNMP_de_Pandora_FMS'; + } else { + $result .= 'Remote_Monitoring&printable=yes#Pandora_FMS_SNMP_MIB_Browser'; + } + break; + + case 'snmp_trap_generator_view': + if ($es) { + $result .= 'Monitorizacion_traps_SNMP&printable=yes#Generador_de_Traps'; + } else { + $result .= 'SNMP_traps_Monitoring&printable=yes#Trap_Generator'; + } + break; + + case 'real_time_view': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Gr.C3.A1ficas_Real-time'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Real-time_Graphs'; + } + break; + + case 'agent_status': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Detalles_del_agente'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Agent_Details'; + } + break; + + case 'agent_main_tab': + if ($es) { + $result .= 'Intro_Monitorizacion&printable=yes#Visualizaci.C3.B3n_del_agente'; + } else { + $result .= 'Intro_Monitoring&printable=yes#Agent_configuration_in_the_console_2'; + } + break; + + case 'alert_config': + if ($es) { + $result .= 'Alertas&printable=yes#Creaci.C3.B3n_de_una_Acci.C3.B3n'; + } else { + $result .= 'Alerts&printable=yes#Creating_an_Action'; + } + break; + + case 'alert_macros': + if ($es) { + $result .= 'Alertas&printable=yes#Macros_sustituibles_en_los_campos_Field1.2C_Field2.2C_Field3..._Field10'; + } else { + $result .= 'Alerts&printable=yes#Replaceable_Macros_within_Field_1_through_Field_10'; + } + break; + + case 'alerts_config': + if ($es) { + $result .= 'Alertas&printable=yes#Configuraci.C3.B3n_de_alertas_en_Pandora_FMS'; + } else { + $result .= 'Alerts&printable=yes#Alert_Configuration_in_Pandora_FMS'; + } + break; + + case 'alert_special_days': + if ($es) { + $result .= 'Alertas&printable=yes#Lista_de_d.C3.ADas_especiales'; + } else { + $result .= 'Alerts&printable=yes#List_of_special_days'; + } + break; + + case 'alerts': + if ($es) { + $result .= 'Politicas&printable=yes#Alertas'; + } else { + $result .= 'Policy&printable=yes#Alerts'; + } + break; + + case 'collections': + if ($es) { + $result .= 'Politicas&printable=yes#Colecciones_de_ficheros'; + } else { + $result .= 'Policy&printable=yes#File_Collections'; + } + break; + + case 'component_groups': + if ($es) { + $result .= 'Plantillas_y_Componentes&printable=yes#Grupos_de_componentes'; + } else { + $result .= 'Templates_and_components&printable=yes#Component_Groups'; + } + break; + + case 'configure_gis_map': + if ($es) { + $result .= 'Pandora_GIS&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'GIS&printable=yes#Introduction'; + } + break; + + case 'configure_gis_map_edit': + if ($es) { + $result .= 'Pandora_GIS&printable=yes#GIS_Maps'; + } else { + $result .= 'GIS&printable=yes#GIS_Maps'; + } + break; + + case 'event_alert': + if ($es) { + $result .= 'Eventos&printable=yes#Introducci.C3.B3n_2'; + } else { + $result .= 'Events&printable=yes#Introduction_2'; + } + break; + + case 'eventview': + if ($es) { + $result .= 'Eventos&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Events&printable=yes#Introduction'; + } + break; + + case 'export_server': + if ($es) { + $result .= 'ExportServer&printable=yes#A.C3.B1adir_un_servidor_de_destino'; + } else { + $result .= 'Export_Server&printable=yes#Adding_a_Target_Server'; + } + break; + + case 'external_alert': + if ($es) { + $result .= 'Politicas&printable=yes#Alertas_Externas'; + } else { + $result .= 'Policy&printable=yes#External_Alerts'; + } + break; + + case 'gis_tab': + if ($es) { + $result .= 'Pandora_GIS&printable=yes#Configuraci.C3.B3n_del_Agent_GIS'; + } else { + $result .= 'GIS&printable=yes#The_Agent.27s_GIS_Setup'; + } + break; + + case 'graph_builder': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Crear_Gr.C3.A1ficas_combinadas'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Creating_combined_graphs'; + } + break; + + case 'graph_editor': + if ($es) { + $result .= 'Presentacion_datos/visualizacion&printable=yes#Agregar_elementos_a_gr.C3.A1ficas_combinadas'; + } else { + $result .= 'Data_Presentation/Visualization&printable=yes#Adding_elements_to_combined_graphs'; + } + break; + + case 'dashboards_tab': + if ($es) { + $result .= 'Dashboard&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Dashboard&printable=yes#Introduction'; + } + break; + + case 'history_database': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Base_de_datos_hist.C3.B3rica'; + } else { + $result .= 'Console_Setup&printable=yes#The_History_Database'; + } + break; + + case 'inventory_tab': + if ($es) { + $result .= 'Inventario&printable=yes#M.C3.B3dulos_de_inventario'; + } else { + $result .= 'Inventory&printable=yes#Inventory_Modules'; + } + break; + + case 'ipam_list_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'IPAM&printable=yes#Introduction'; + } + break; + + case 'ipam_calculator_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Calculadora_de_subredes'; + } else { + $result .= 'IPAM&printable=yes#Subnetwork_calculator'; + } + break; + + case 'ipam_vlan_config_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Vlan_IPAM'; + } else { + $result .= 'IPAM&printable=yes#VLAN_IPAM'; + } + break; + + case 'ipam_vlan_statistics_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Estad.C3.ADsticas_IPAM_Vlan'; + } else { + $result .= 'IPAM&printable=yes#IPAM_VLAN_Stats'; + } + break; + + case 'ipam_vlan_wizard_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Wizard_IPAM_Vlan'; + } else { + $result .= 'IPAM&printable=yes#IPAM_VLAN_Wizard:'; + } + break; + + case 'ipam_supernet_config_tab': + if ($es) { + $result .= 'IPAM&printable=yes#IPAM_Supernet'; + } else { + $result .= 'IPAM&printable=yes#IPAM_Supernet'; + } + break; + + case 'ipam_supernet_map_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Mapa_Superred_IPAM'; + } else { + $result .= 'IPAM&printable=yes#IPAM_Supernet_Map'; + } + break; + + case 'ipam_supernet_statistics_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Estad.C3.ADsticas_IPAM_Superred'; + } else { + $result .= 'IPAM&printable=yes#IPAM_Supernet_Stats'; + } + break; + + case 'ipam_new_tab': + case 'ipam_edit_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Vista_de_edici.C3.B3n'; + } else { + $result .= 'IPAM&printable=yes#Edit_view'; + } + break; + + case 'ipam_massive_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Vista_Operaciones_masivas'; + } else { + $result .= 'IPAM&printable=yes#Massive_operations_view'; + } + break; + + case 'ipam_network_tab': + case 'ipam_force_tab': + if ($es) { + $result .= 'IPAM&printable=yes#Vista_de_iconos'; + } else { + $result .= 'IPAM&printable=yes#Icon_view'; + } + break; + + case 'macros_visual_maps': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Macros_en_las_consolas_visuales'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Macros_in_Visual_Consoles'; + } + break; + + case 'linked_map_status_calc': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Mapa_asociado'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Associated_Map'; + } + break; + + case 'main_tab': + if ($es) { + $result .= 'Intro_Monitorizacion&printable=yes#Configuraci.C3.B3n_del_agente_en_consola'; + } else { + $result .= 'Intro_Monitoring&printable=yes#Agent_configuration_in_the_console'; + } + break; + + case 'manage_alert_list': + if ($es) { + $result .= 'Alertas&printable=yes#Gestionar_alertas_desde_el_agente'; + } else { + $result .= 'Alerts&printable=yes#Managing_Alerts_from_within_the_Agent'; + } + break; + + case 'alert_scalate': + if ($es) { + $result .= 'Alertas&printable=yes#Escalado_de_alertas'; + } else { + $result .= 'Alerts&printable=yes#Scaling_Alerts'; + } + break; + + case 'map_builder_intro': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Introduction'; + } + break; + + case 'map_builder_favorite': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Consolas_visuales_favoritas'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Favorite_visual_consoles'; + } + break; + + case 'map_builder_template': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Plantillas_de_consolas_visuales'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Visual_Console_Templates'; + } + break; + + case 'map_builder_wizard': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Asistente_de_consola_visuales'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Wizard_Visual_Console'; + } + break; + + case 'module_linking': + if ($es) { + $result .= 'Politicas&printable=yes#Tipos_de_m.C3.B3dulos'; + } else { + $result .= 'Policy&printable=yes#Types_of_Modules'; + } + break; + + case 'network_map_enterprise_edit': + if ($es) { + $result .= 'Presentacion_datos/Mapas_de_red&printable=yes#Mapa_de_red_no_vac.C3.ADo'; + } else { + $result .= 'Data_Presentation/Network_Maps&printable=yes#Non_empty_network_map'; + } + break; + + case 'network_map_enterprise_list': + if ($es) { + $result .= 'Presentacion_datos/Mapas_de_red&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Data_Presentation/Network_Maps&printable=yes#Introduction'; + } + break; + + case 'network_map_enterprise_empty': + if ($es) { + $result .= 'Presentacion_datos/Mapas_de_red&printable=yes#Mapa_de_red_vac.C3.ADo'; + } else { + $result .= 'Data_Presentation/Network_Maps&printable=yes#Empty_network_map'; + } + break; + + case 'network_map_enterprise_view': + if ($es) { + $result .= 'Presentacion_datos/Mapas_de_red&printable=yes#Vista_de_un_mapa_de_red'; + } else { + $result .= 'Data_Presentation/Network_Maps&printable=yes#Network_map_view'; + } + break; + + case 'transactional_view': + if ($es) { + $result .= 'Monitorizacion_transaccional&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Transactional_Monitoring&printable=yes#Introduction'; + } + break; + + case 'pcap_filter': + if ($es) { + $result .= 'Netflow&printable=yes#Creaci.C3.B3n_del_filtro'; + } else { + $result .= 'Netflow&printable=yes#Filter_creation'; + } + break; + + case 'planned_downtime': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Introducci.C3.B3n_4'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Introduction_4'; + } + break; + + case 'planned_downtime_editor': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Creaci.C3.B3n_parada_planificada'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Create_a_scheduled_downtime'; + } + break; + + case 'plugin_definition': + if ($es) { + $result .= 'Anexo_Server_Plugins&printable=yes#Registro_manual_de_un_plugin_en_la_consola'; + } else { + $result .= 'Anexo_Server_plugins_developement&printable=yes#Plugin_manual_registration'; + } + break; + + case 'plugin_macros': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Macros_internas'; + } else { + $result .= 'Remote_Monitoring&printable=yes#Internal_Macros'; + } + break; + + case 'plugin_policy': + if ($es) { + $result .= 'Politicas&printable=yes#Plugins_de_agente'; + } else { + $result .= 'Policy&printable=yes#Agent_Plug_Ins'; + } + break; + + case 'policy_queue': + if ($es) { + $result .= 'Politicas&printable=yes#Gesti.C3.B3n_de_la_cola_de_pol.C3.ADticas'; + } else { + $result .= 'Policy&printable=yes#Policy_Queues_Management'; + } + break; + + case 'prediction_source_module': + if ($es) { + $result .= 'Monitorizacion_otra&printable=yes#Tipos_de_monitorizaci.C3.B3n_predictiva'; + } else { + $result .= 'Other_Monitoring&printable=yes#Types_of_predictive_monitoring'; + } + break; + + case 'wmi_module_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_de_Windows_remotos_con_WMI'; + } else { + $result .= 'Remote_Monitoring&printable=yes#Windows_Remote_Monitoring_with_WMI'; + } + break; + + case 'template_reporting_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#Introduction'; + } + break; + + case 'reporting_template_list_item_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Pesta.C3.B1a_List_Items'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_.27List_Items.27_Tab'; + } + break; + + case 'reporting_template_item_editor_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Pesta.C3.B1a_Item_editor'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_.27Item_Editor.27_Tab'; + } + break; + + case 'reporting_template_advanced_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Opciones_avanzadas_de_informe'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_Advanced_Options_Tab'; + } + break; + + case 'reporting_advanced_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Opciones_avanzadas_de_informe'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_Advanced_Options_Tab'; + } + break; + + case 'reporting_global_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Global'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_Global_Tab'; + } + break; + + case 'reporting_item_editor_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Pesta.C3.B1a_Item_editor'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_.27Item_Editor.27_Tab'; + } + break; + + case 'reporting_list_items_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Pesta.C3.B1a_List_Items'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_.27List_Items.27_Tab'; + } + break; + + case 'reporting_wizard_sla_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Wizard_SLA'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_SLA_Wizard_Tab'; + } + break; + + case 'reporting_wizard_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Wizard_general'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#The_Wizard_Tab'; + } + break; + + case 'response_macros': + if ($es) { + $result .= 'Eventos&printable=yes#Event_Responses_macros'; + } else { + $result .= 'Events&printable=yes#Event_Responses_macros'; + } + break; + + case 'events_responses_tab': + if ($es) { + $result .= 'Eventos&printable=yes#Introducci.C3.B3n_3'; + } else { + $result .= 'Events&printable=yes#Introduction_3'; + } + break; + + case 'servers': + if ($es) { + $result .= 'Interfaz&printable=yes#Gesti.C3.B3n_de_servidores'; + } else { + $result .= 'Interface&printable=yes#Server_management'; + } + break; + + case 'snmpwalk': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Navegador_SNMP_de_Pandora_FMS'; + } else { + $result .= 'Remote_Monitoring&printable=yes#Pandora_FMS_SNMP_MIB_Browser'; + } + break; + + case 'tags_config': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Sistemas_de_permisos_ampliados_mediante_etiquetas_.28tags.29'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Permission_system_extended_by_tags'; + } + break; + + case 'transactional_map_phases': + if ($es) { + $result .= 'Monitorizacion_transaccional&printable=yes#Creaci.C3.B3n_del_.C3.A1rbol_de_fases'; + } else { + $result .= 'Transactional_Monitoring&printable=yes#Creating_the_phase_tree'; + } + break; + + case 'transactional_map_phases_data': + if ($es) { + $result .= 'Monitorizacion_transaccional&printable=yes#Configuraci.C3.B3n_de_los_scripts_de_control'; + } else { + $result .= 'Transactional_Monitoring&printable=yes#Control_scripts_configuration'; + } + break; + + case 'wizard_reporting_tab': + if ($es) { + $result .= 'Presentacion_datos/Informes&printable=yes#Asistente_de_plantillas'; + } else { + $result .= 'Data_Presentation/Reports&printable=yes#Template_Wizard'; + } + break; + + case 'user_edit_notifications': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Configuraci.C3.B3n_de_notificaciones'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Notification_configuration'; + } + break; + + case 'view_services': + if ($es) { + $result .= 'Servicios&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Services&printable=yes#Introduction'; + } + break; + + case 'visual_console_editor_data_tab': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Creaci.C3.B3n_-_Datos_generales'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Creation_-_General_data'; + } + break; + + case 'visual_console_editor_editor_tab': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Creaci.C3.B3n_y_edici.C3.B3n_de_consolas_visuales'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Creation_and_edition_of_Visual_Consoles'; + } + break; + + case 'visual_console_editor_list_elements_tab': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Creaci.C3.B3n_-_lista_de_elementos'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Creation_-_List_of_Elements'; + } + break; + + case 'visual_console_editor_wizard_tab': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Creaci.C3.B3n_-_Wizard'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Creation_-_Wizard'; + } + break; + + case 'visual_console_editor_wizard_services_tab': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Creaci.C3.B3n_-_Wizard_de_Servicios'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Creation_-_Service_Wizard'; + } + break; + + case 'visual_console_tab': + if ($es) { + $result .= 'Presentacion_datos/Mapas_visuales&printable=yes#Mapa_asociado'; + } else { + $result .= 'Data_Presentation/Visual_Maps&printable=yes#Associated_Map'; + } + break; + + case 'view_created_map_services_tab': + if ($es) { + $result .= 'Servicios&printable=yes#Vista_de_mapa_de_servicio'; + } else { + $result .= 'Services&printable=yes#Service_Map_View'; + } + break; + + case 'view_created_services_tab': + if ($es) { + $result .= 'Servicios&printable=yes#Lista_simple_de_un_servicio_y_todos_los_elementos_que_contiene'; + } else { + $result .= 'Services&printable=yes#List-based_view_of_a_Service_and_its_Elements'; + } + break; + + case 'config_service_element_tab': + if ($es) { + $result .= 'Servicios&printable=yes#Configuraci.C3.B3n_de_elementos'; + } else { + $result .= 'Services&printable=yes#Element_Configuration'; + } + break; + + case 'config_service_tab': + if ($es) { + $result .= 'Servicios&printable=yes#Configuraci.C3.B3n_inicial'; + } else { + $result .= 'Services&printable=yes#Initial_Configuration'; + } + break; + + case 'other_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Otra_configuraci.C3.B3n'; + } else { + $result .= 'Console_Setup&printable=yes#Other_configuration'; + } + break; + + case 'services_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Configuraci.C3.B3n_servicios'; + } else { + $result .= 'Console_Setup&printable=yes#Services_configuration'; + } + break; + + case 'visual_consoles_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Configuraci.C3.B3n_de_las_consolas_visuales'; + } else { + $result .= 'Console_Setup&printable=yes#Visual_console_configuration'; + } + break; + + case 'charts_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Configuraci.C3.B3n_de_gr.C3.A1ficas'; + } else { + $result .= 'Console_Setup&printable=yes#Chart_settings'; + } + break; + + case 'front_and_text_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Configuraci.C3.B3n_de_Fuente_y_texto'; + } else { + $result .= 'Console_Setup&printable=yes#Font_and_text_settings'; + } + break; + + case 'gis_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Configuraci.C3.B3n_GIS'; + } else { + $result .= 'Console_Setup&printable=yes#GIS_configuration'; + } + break; + + case 'style_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Configuraci.C3.B3n_de_estilo'; + } else { + $result .= 'Console_Setup&printable=yes#Style_configuration'; + } + break; + + case 'behavoir_conf_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Configuraci.C3.B3n_del_comportamiento'; + } else { + $result .= 'Console_Setup&printable=yes#Behaviour_configuration'; + } + break; + + case 'setup_ehorus_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#eHorus'; + } else { + $result .= 'Console_Setup&printable=yes#EHorus'; + } + break; + + case 'diagnostic_tool_tab': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Diagnostic_tool'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Diagnostic_tool'; + } + break; + + case 'performance_metrics_tab': + if ($es) { + $result .= 'Optimizacion&printable=yes#Comprobaci.C3.B3n_del_fichero_my.ini.2Fcnf'; + } else { + $result .= 'Optimization&printable=yes#Check_my.ini.2Fcnf_settings'; + } + break; + + case 'db_status_tab': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#DB_Schema_Check'; + } else { + $result .= 'Managing_and_Administration&printable=yes#DB_Schema_Check'; + } + break; + + case 'database_backup_utility_tab': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Backup'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Backup'; + } + break; + + case 'update_manager_offline_tab': + if ($es) { + $result .= 'Actualizacion&printable=yes#Actualizaciones_.22offline.22'; + } else { + $result .= 'Anexo_Upgrade&printable=yes#.22Offline.22_updates'; + } + break; + + case 'update_manager_online_tab': + if ($es) { + $result .= 'Actualizacion&printable=yes#Actualizaciones_.22online.22'; + } else { + $result .= 'Anexo_Upgrade&printable=yes#.22Online.22_updates'; + } + break; + + case 'others_database_maintenance_options_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Otros'; + } else { + $result .= 'Console_Setup&printable=yes#Others'; + } + break; + + case 'database_maintenance_options_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Opciones_de_mantenimiento_de_la_base_de_datos'; + } else { + $result .= 'Console_Setup&printable=yes#Database_maintenance_options'; + } + break; + + case 'database_maintenance_status_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Estado_del_mantenimiento_de_las_bases_de_datos'; + } else { + $result .= 'Console_Setup&printable=yes#Database_maintenance_status'; + } + break; + + case 'historical_database_maintenance_options_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Opciones_de_mantenimiento_de_la_base_de_datos_hist.C3.B3rica'; + } else { + $result .= 'Console_Setup&printable=yes#Historical_database_maintenance_options'; + } + break; + + case 'setup_enterprise_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#Enterprise'; + } else { + $result .= 'Console_Setup&printable=yes#Features_of_the_Enterprise_Version'; + } + break; + + case 'setup_general_tab': + if ($es) { + $result .= 'Configuracion_Consola&printable=yes#General_Setup'; + } else { + $result .= 'Console_Setup&printable=yes#General_Setup'; + } + break; + + case 'export_target_tab': + if ($es) { + $result .= 'ExportServer&printable=yes#A.C3.B1adir_un_servidor_de_destino'; + } else { + $result .= 'Export_Server&printable=yes#Adding_a_Target_Server'; + } + break; + + case 'servers_ha_clusters_tab': + if ($es) { + $result .= 'HA&printable=yes#Alta_disponibilidad_del_Servidor_de_Datos'; + } else { + $result .= 'HA&printable=yes#HA_of_Data_Server'; + } + break; + + case 'plugins_tab': + if ($es) { + $result .= 'Anexo_Agent_Plugins&printable=yes#Caracter.C3.ADsticas_b.C3.A1sicas_de_plugin_de_agente'; + } else { + $result .= 'Anexo_Agent_Plugins&printable=yes#Basic_Features_of_the_Agent_Plugin'; + } + break; + + case 'agent_snmp_explorer_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Wizard_SNMP'; + } else { + $result .= 'Remote_Monitoring&printable=yes#SNMP_Wizard'; + } + break; + + case 'agent_snmp_interfaces_explorer_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#SNMP_Interfaces_wizard'; + } else { + $result .= 'Remote_Monitoring&printable=yes#SNMP_Interface_Wizard'; + } + break; + + case 'agent_snmp_wmi_explorer_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Wizard_WMI'; + } else { + $result .= 'Remote_Monitoring&printable=yes#WMI_Wizard'; + } + break; + + case 'group_list_tab': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Introducci.C3.B3n_2'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Introduction_2'; + } + break; + + case 'acl_setup_tab': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Introducci.C3.B3n_3'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Introduction_3'; + } + break; + + case 'profile_tab': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Perfiles_en_Pandora_FMS'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Profiles_in_Pandora_FMS'; + } + break; + + case 'configure_profiles_tab': + if ($es) { + $result .= 'Gestion_y_Administracion&printable=yes#Perfiles_en_Pandora_FMS'; + } else { + $result .= 'Managing_and_Administration&printable=yes#Profiles_in_Pandora_FMS'; + } + break; + + case 'network_component_tab': + if ($es) { + $result .= 'Plantillas_y_Componentes&printable=yes#Componentes_de_red'; + } else { + $result .= 'Templates_and_components&printable=yes#Network_Components'; + } + break; + + case 'local_component_tab': + if ($es) { + $result .= 'Plantillas_y_Componentes&printable=yes#Componentes_locales'; + } else { + $result .= 'Templates_and_components&printable=yes#Local_Components'; + } + break; + + case 'module_template_tab': + if ($es) { + $result .= 'Plantillas_y_Componentes&printable=yes#Plantillas_de_m.C3.B3dulos'; + } else { + $result .= 'Templates_and_components&printable=yes#Module_Templates'; + } + break; + + case 'agent_autoconf_tab': + if ($es) { + $result .= 'Configuracion_Agentes&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Configuration_Agents&printable=yes#Introduction'; + } + break; + + case 'policies_management_tab': + if ($es) { + $result .= 'Politicas&printable=yes#Introducci.C3.B3n'; + } else { + $result .= 'Policy&printable=yes#Introduction'; + } + break; + + case 'massive_agents_tab': + if ($es) { + $result .= 'Operaciones_Masivas&printable=yes#Edici.C3.B3n_masiva_de_agentes'; + } else { + $result .= 'Massive_Operations&printable=yes#Agent_massive_edition'; + } + break; + + case 'massive_modules_tab': + if ($es) { + $result .= 'Operaciones_Masivas&printable=yes#Edici.C3.B3n_masiva_de_m.C3.B3dulos'; + } else { + $result .= 'Massive_Operations&printable=yes#Modules_massive_edition'; + } + break; + + case 'massive_policies_tab': + if ($es) { + $result .= 'Operaciones_Masivas&printable=yes#Editar_m.C3.B3dulos_de_pol.C3.ADticas_masivamente'; + } else { + $result .= 'Massive_Operations&printable=yes#Edit_policy_modules_massively'; + } + break; + + case 'alert_templates_tab': + if ($es) { + $result .= 'Alertas&printable=yes#Introducci.C3.B3n_4'; + } else { + $result .= 'Alerts&printable=yes#Introduction_4'; + } + break; + + case 'configure_alert_template_step_1': + if ($es) { + $result .= 'Alertas&printable=yes#Paso_1:_General'; + } else { + $result .= 'Alerts&printable=yes#Step_1:_General'; + } + break; + + case 'configure_alert_template_step_2': + if ($es) { + $result .= 'Alertas&printable=yes#Paso_2:_Condiciones'; + } else { + $result .= 'Alerts&printable=yes#Step_2:_Conditions'; + } + break; + + case 'configure_alert_template_step_3': + if ($es) { + $result .= 'Alertas&printable=yes#Paso_3:_Campos_avanzados'; + } else { + $result .= 'Alerts&printable=yes#Step_3:_Advanced_fields'; + } + break; + + case 'alerts_action': + if ($es) { + $result .= 'Alertas&printable=yes#Introducci.C3.B3n_3'; + } else { + $result .= 'Alerts&printable=yes#Introduction_3'; + } + break; + + case 'alerts_command_tab': + if ($es) { + $result .= 'Alertas&printable=yes#Introducci.C3.B3n_2'; + } else { + $result .= 'Alerts&printable=yes#Introduction_2'; + } + break; + + case 'alerts_config_command_tab': + if ($es) { + $result .= 'Alertas&printable=yes#Creaci.C3.B3n_de_un_comando_para_una_alerta'; + } else { + $result .= 'Alerts&printable=yes#Command_Creation_for_an_Alert'; + } + break; + + case 'configure_alert_event_step_1': + if ($es) { + $result .= 'Eventos&printable=yes#Creaci.C3.B3n_alerta_de_evento'; + } else { + $result .= 'Events&printable=yes#Event_Alert_creation'; + } + break; + + case 'configure_event_rule_tab': + if ($es) { + $result .= 'Eventos&printable=yes#Creaci.C3.B3n_alerta_de_evento'; + } else { + $result .= 'Events&printable=yes#Event_Alert_creation'; + } + break; + + case 'snmp_alert_overview_tab': + if ($es) { + $result .= 'Monitorizacion_traps_SNMP&printable=yes#Introducci.C3.B3n_2'; + } else { + $result .= 'SNMP_traps_Monitoring&printable=yes#Introduction_2'; + } + break; + + case 'snmp_alert_update_tab': + if ($es) { + $result .= 'Monitorizacion_traps_SNMP&printable=yes#A.C3.B1adir_una_alerta'; + } else { + $result .= 'SNMP_traps_Monitoring&printable=yes#Alert_Creation'; + } + break; + + case 'sound_console_tab': + if ($es) { + $result .= 'Eventos&printable=yes#Uso'; + } else { + $result .= 'Events&printable=yes#Use'; + } + break; + + case 'local_module_tab': + if ($es) { + $result .= 'Intro_Monitorizacion&printable=yes#Par.C3.A1metros_comunes'; + } else { + $result .= 'Intro_Monitoring&printable=yes#Common_Parameters'; + } + break; + + case 'local_module': + if ($es) { + $result .= 'Operacion&printable=yes#Tipos_de_m.C3.B3dulos'; + } else { + $result .= 'Operations&printable=yes#Types_of_Modules'; + } + break; + + case 'data_server_module_tab': + if ($es) { + $result .= 'Operacion&printable=yes#Tipos_de_m.C3.B3dulos'; + } else { + $result .= 'Operations&printable=yes#Types_of_Modules'; + } + break; + + case 'network_module_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_ICMP'; + } else { + $result .= 'Remote_Monitoring&printable=yes#ICMP_Monitoring'; + } + break; + + case 'wux_console': + if ($es) { + $result .= 'Monitorizacion_Usuario&printable=yes#Crear_un_m.C3.B3dulo_de_an.C3.A1lisis_web_en_Pandora_FMS_Console'; + } else { + $result .= 'User_Monitorization&printable=yes#Creating_a_Web_Analytics_module_in_Pandora_FMS_Console'; + } + break; + + case 'gis_basic_configurations_tab': + if ($es) { + $result .= 'Pandora_GIS&printable=yes#Configuraci.C3.B3n_B.C3.A1sica'; + } else { + $result .= 'GIS&printable=yes#Basic_Configuration'; + } + break; + + case 'gis_map_connection_tab': + if ($es) { + $result .= 'Pandora_GIS&printable=yes#Mapas_Open_Street'; + } else { + $result .= 'GIS&printable=yes#Open_Street_Maps'; + } + break; + + case 'icmp_module_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_ICMP'; + } else { + $result .= 'Remote_Monitoring&printable=yes#ICMP_Monitoring'; + } + break; + + case 'snmp_module_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Monitorizando_con_m.C3.B3dulos_de_red_tipo_SNMP'; + } else { + $result .= 'Remote_Monitoring&printable=yes#Monitoring_by_Network_Modules_with_SNMP'; + } + break; + + case 'tcp_module_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_TCP'; + } else { + $result .= 'Remote_Monitoring&printable=yes#TCP_Monitoring'; + } + break; + + case 'webserver_module_tab': + if ($es) { + $result .= 'Monitorizacion_web&printable=yes#Creaci.C3.B3n_de_m.C3.B3dulos_web'; + } else { + $result .= 'Web_Monitoring&printable=yes#Creating_Web_Modules'; + } + break; + + case 'wmi_query_tab': + if ($es) { + $result .= 'Monitorizacion_remota&printable=yes#Monitorizaci.C3.B3n_de_Windows_remotos_con_WMI'; + } else { + $result .= 'Remote_Monitoring&printable=yes#Windows_Remote_Monitoring_with_WMI'; + } + break; + + case 'module_type_tab': + if ($es) { + $result .= 'Operacion&printable=yes#Tipos_de_m.C3.B3dulos'; + } else { + $result .= ''; + } + break; + + case 'render_view_tab': + if ($es) { + $result .= 'Pandora_GIS&printable=yes#Operaci.C3.B3n'; + } else { + $result .= 'GIS&printable=yes#Operation'; + } + break; + } + + // hd($result); + return $result; +} diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index a1c6953d34..1036593727 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -2744,6 +2744,31 @@ function config_check() } +/** + * Retrieves base url stored for Update Manager. + * + * @return string URL. + */ +function get_um_url() +{ + global $config; + + if (isset($config['url_update_manager'])) { + $url = $config['url_update_manager']; + $url = substr($url, 0, (strlen($url) - strpos(strrev($url), '/'))); + } else { + $url = 'https://licensing.artica.es/pandoraupdate7/'; + config_update_value( + 'url_update_manager', + 'https://licensing.artica.es/pandoraupdate7/server.php' + ); + } + + return $url; + +} + + /** * Return in bytes * diff --git a/pandora_console/include/functions_graph.php b/pandora_console/include/functions_graph.php index 4d1fed36e0..81a3365fc5 100644 --- a/pandora_console/include/functions_graph.php +++ b/pandora_console/include/functions_graph.php @@ -1,16 +1,32 @@ 0) { - // Propagate the last known data to the end of the interval + // Propagate the last known data to the end of the interval. $nextData = [ 'datos' => $data[(count($data) - 1)]['datos'], 'utimestamp' => $date_array['final_date'], @@ -114,9 +144,8 @@ function grafico_modulo_sparse_data_chart( array_push($data, $nextData); } - // Check available data + // Check available data. if (count($data) < 1) { - // return fs_error_image (); return false; } @@ -126,7 +155,7 @@ function grafico_modulo_sparse_data_chart( $array_percentil = []; foreach ($data as $k => $v) { - // convert array + // Convert array. if ($params['flag_overlapped']) { $array_data['sum'.$series_suffix]['data'][$k] = [ (($v['utimestamp'] + $date_array['period'] ) * 1000), @@ -139,40 +168,43 @@ function grafico_modulo_sparse_data_chart( ]; } - // min + // Min. if ($min_value > $v['datos']) { $min_value = $v['datos']; } - // max + // Max. if ($max_value < $v['datos']) { $max_value = $v['datos']; } - // avg + // Avg. $sum_data += $v['datos']; $count_data++; - // percentil - if (!is_null($params['percentil']) && $params['percentil']) { + // Percentil. + if (!isset($params['percentil']) && $params['percentil']) { $array_percentil[] = $v['datos']; } } - $array_data['sum'.$series_suffix]['min'] = $min_value; - $array_data['sum'.$series_suffix]['max'] = $max_value; - $array_data['sum'.$series_suffix]['avg'] = ($sum_data / $count_data); + $array_data['sum'.$series_suffix]['min'] = $min_value; + $array_data['sum'.$series_suffix]['max'] = $max_value; + $array_data['sum'.$series_suffix]['avg'] = ($sum_data / $count_data); $array_data['sum'.$series_suffix]['agent_module_id'] = $agent_module_id; $array_data['sum'.$series_suffix]['id_module_type'] = $data_module_graph['id_module_type']; - $array_data['sum'.$series_suffix]['agent_name'] = $data_module_graph['agent_name']; - $array_data['sum'.$series_suffix]['module_name'] = $data_module_graph['module_name']; - $array_data['sum'.$series_suffix]['agent_alias'] = $data_module_graph['agent_alias']; + $array_data['sum'.$series_suffix]['agent_name'] = $data_module_graph['agent_name']; + $array_data['sum'.$series_suffix]['module_name'] = $data_module_graph['module_name']; + $array_data['sum'.$series_suffix]['agent_alias'] = $data_module_graph['agent_alias']; - if (!is_null($params['percentil']) + if (!isset($params['percentil']) && $params['percentil'] && !$params['flag_overlapped'] ) { - $percentil_result = get_percentile($params['percentil'], $array_percentil); + $percentil_result = get_percentile( + $params['percentil'], + $array_percentil + ); $array_data['percentil'.$series_suffix]['data'][0] = [ ($date_array['start_date'] * 1000), $percentil_result, @@ -188,6 +220,17 @@ function grafico_modulo_sparse_data_chart( } +/** + * Prepare data for send to function js paint charts. + * + * @param integer $agent_module_id ID. + * @param array $date_array Date stasrt finish and period. + * @param array $data_module_graph Data module. + * @param array $params Params graphs. + * @param integer $series_suffix Int. + * + * @return array Prepare data to paint js. + */ function grafico_modulo_sparse_data( $agent_module_id, $date_array, @@ -210,7 +253,7 @@ function grafico_modulo_sparse_data( $params['type_mode_graph'] ); } else { - // uncompress data except boolean and string. + // Uncompress data except boolean and string. if ($data_module_graph['id_module_type'] == 23 || $data_module_graph['id_module_type'] == 3 || $data_module_graph['id_module_type'] == 17 @@ -232,6 +275,7 @@ function grafico_modulo_sparse_data( $series_suffix ); } else { + $data_slice = ($date_array['period'] / (250 * $params['zoom']) + 100); $array_data = fullscale_data( $agent_module_id, $date_array, @@ -239,7 +283,7 @@ function grafico_modulo_sparse_data( $params['percentil'], $series_suffix, $params['flag_overlapped'], - $data_slice = ($date_array['period'] / (250 * $params['zoom']) + 100), + $data_slice, $params['type_mode_graph'] ); } @@ -253,12 +297,13 @@ function grafico_modulo_sparse_data( $array_data['sum'.$series_suffix]['agent_module_id'] = $agent_module_id; $array_data['sum'.$series_suffix]['id_module_type'] = $data_module_graph['id_module_type']; - $array_data['sum'.$series_suffix]['agent_name'] = $data_module_graph['agent_name']; - $array_data['sum'.$series_suffix]['module_name'] = $data_module_graph['module_name']; - $array_data['sum'.$series_suffix]['agent_alias'] = $data_module_graph['agent_alias']; - $array_data['sum'.$series_suffix]['unit'] = $data_module_graph['unit']; + $array_data['sum'.$series_suffix]['agent_name'] = $data_module_graph['agent_name']; + $array_data['sum'.$series_suffix]['module_name'] = $data_module_graph['module_name']; + $array_data['sum'.$series_suffix]['agent_alias'] = $data_module_graph['agent_alias']; + $array_data['sum'.$series_suffix]['unit'] = $data_module_graph['unit']; - // This is for a specific type of report that consists in passing an interval and doing the average sum and avg. + // This is for a specific type of report that consists in passing + // an interval and doing the average sum and avg. if ($params['force_interval'] != '') { $period_time_interval = ($date_array['period'] * 1000); $start_period = ($date_array['start_date'] * 1000); @@ -270,7 +315,9 @@ function grafico_modulo_sparse_data( while ($period_time_interval > 0) { foreach ($array_data['sum1']['data'] as $key => $value) { - if ($value[0] >= $start_period && $value[0] < ($start_period + $params['time_interval'] * 1000)) { + if ($value[0] >= $start_period + && $value[0] < ($start_period + $params['time_interval'] * 1000) + ) { $sum_data = $value[1]; $array_data_only[] = $value[1]; $count_data++; @@ -278,7 +325,9 @@ function grafico_modulo_sparse_data( } else { if ($params['force_interval'] == 'max_only') { $acum_array_data[$i][0] = $start_period; - if (is_array($array_data_only) && count($array_data_only) > 0) { + if (is_array($array_data_only) + && count($array_data_only) > 0 + ) { $acum_array_data[$i][1] = max($array_data_only); $data_last_acum = $array_data_only[(count($array_data_only) - 1)]; } else { @@ -288,7 +337,9 @@ function grafico_modulo_sparse_data( if ($params['force_interval'] == 'min_only') { $acum_array_data[$i][0] = $start_period; - if (is_array($array_data_only) && count($array_data_only) > 0) { + if (is_array($array_data_only) + && count($array_data_only) > 0 + ) { $acum_array_data[$i][1] = min($array_data_only); $data_last_acum = $array_data_only[(count($array_data_only) - 1)]; } else { @@ -298,7 +349,9 @@ function grafico_modulo_sparse_data( if ($params['force_interval'] == 'avg_only') { $acum_array_data[$i][0] = $start_period; - if (is_array($array_data_only) && count($array_data_only) > 0) { + if (is_array($array_data_only) + && count($array_data_only) > 0 + ) { $acum_array_data[$i][1] = ($sum_data / $count_data); } else { $acum_array_data[$i][1] = $data_last_acum; @@ -317,7 +370,7 @@ function grafico_modulo_sparse_data( $period_time_interval = ($period_time_interval - $params['time_interval']); } - // drag the last value to paint the graph correctly + // Drag the last value to paint the graph correctly. $acum_array_data[] = [ 0 => $start_period, 1 => $acum_array_data[($i - 1)][1], @@ -361,7 +414,6 @@ function grafico_modulo_sparse_data( $date_array['final_date'], $data_module_graph['history_db'], 1 - // fix the time ranges to start_date - final_date ); if ($unknown_events !== false) { @@ -496,57 +548,55 @@ function grafico_modulo_sparse_data( } -/* - $params =array( - 'agent_module_id' => $agent_module_id, - 'period' => $period, - 'show_events' => false, - 'width' => $width, - 'height' => $height, - 'title' => '', - 'unit_name' => null, - 'show_alerts' => false, - 'date' => 0, - 'unit' => '', - 'baseline' => 0, - 'return_data' => 0, - 'show_title' => true, - 'only_image' => false, - 'homeurl' => $config['homeurl'], - 'ttl' => 1, - 'adapt_key' => '', - 'compare' => false, - 'show_unknown' => false, - 'menu' => true, - 'backgroundColor' => 'white', - 'percentil' => null, - 'dashboard' => false, - 'vconsole' => false, - 'type_graph' => 'area', - 'fullscale' => false, - 'id_widget_dashboard' => false, - 'force_interval' => '', - 'time_interval' => 300, - 'array_data_create' => 0, - 'show_legend' => true, - 'show_overview' => true, - 'return_img_base_64' => false, - 'image_treshold' => false, - 'graph_combined' => false, - 'zoom' => 1, - 'server_id' => null, - 'stacked' => 0, - ); -*/ +/** + * Functions tu create graphs. + * + * @param array $params Details builds graphs. For example: + * 'agent_module_id' => $agent_module_id, + * 'period' => $period, + * 'show_events' => false, + * 'width' => $width, + * 'height' => $height, + * 'title' => '', + * 'unit_name' => null, + * 'show_alerts' => false, + * 'date' => 0, + * 'unit' => '', + * 'baseline' => 0, + * 'return_data' => 0, + * 'show_title' => true, + * 'only_image' => false, + * 'homeurl' => $config['homeurl'], + * 'ttl' => 1, + * 'adapt_key' => '', + * 'compare' => false, + * 'show_unknown' => false, + * 'menu' => true, + * 'backgroundColor' => 'white', + * 'percentil' => null, + * 'dashboard' => false, + * 'vconsole' => false, + * 'type_graph' => 'area', + * 'fullscale' => false, + * 'id_widget_dashboard' => false, + * 'force_interval' => '', + * 'time_interval' => 300, + * 'array_data_create' => 0, + * 'show_legend' => true, + * 'show_overview' => true, + * 'return_img_base_64' => false, + * 'image_treshold' => false, + * 'graph_combined' => false, + * 'zoom' => 1, + * 'server_id' => null, + * 'stacked' => 0. + * + * @return string html Content graphs. + */ function grafico_modulo_sparse($params) { global $config; - /* - XXXXXXXXXXXX Documnetar - *Set all variable - */ - if (!isset($params) || !is_array($params)) { return false; } @@ -694,11 +744,10 @@ function grafico_modulo_sparse($params) } if (!isset($params['zoom'])) { - $params['zoom'] = $config['zoom_graph'] ? $config['zoom_graph'] : 1; + $params['zoom'] = ($config['zoom_graph']) ? $config['zoom_graph'] : 1; } if (!isset($params['type_mode_graph'])) { - // $config['type_mode_graph'] $params['type_mode_graph'] = $config['type_mode_graph']; } @@ -716,10 +765,11 @@ function grafico_modulo_sparse($params) $params['stacked'] = 0; } - // XXXX Configurable - $params['grid_color'] = '#C1C1C1'; + // TODO: Configurable. + $params['grid_color'] = '#C1C1C1'; $params['legend_color'] = '#636363'; - $params['font'] = $config['fontpath']; + + $params['font'] = $config['fontpath']; $params['font_size'] = $config['font_size']; $params['short_data'] = $config['short_module_graph_data']; @@ -730,8 +780,8 @@ function grafico_modulo_sparse($params) global $graphic_type; global $array_events_alerts; - $array_data = []; - $legend = []; + $array_data = []; + $legend = []; $array_events_alerts = []; $date_array = []; @@ -746,26 +796,36 @@ function grafico_modulo_sparse($params) ); $data_module_graph = []; - $data_module_graph['history_db'] = db_search_in_history_db($date_array['start_date']); - $data_module_graph['agent_name'] = modules_get_agentmodule_agent_name($agent_module_id); - $data_module_graph['agent_alias'] = modules_get_agentmodule_agent_alias($agent_module_id); - $data_module_graph['agent_id'] = $module_data['id_agente']; - $data_module_graph['module_name'] = $module_data['nombre']; + $data_module_graph['history_db'] = db_search_in_history_db( + $date_array['start_date'] + ); + $data_module_graph['agent_name'] = modules_get_agentmodule_agent_name( + $agent_module_id + ); + $data_module_graph['agent_alias'] = modules_get_agentmodule_agent_alias( + $agent_module_id + ); + $data_module_graph['agent_id'] = $module_data['id_agente']; + $data_module_graph['module_name'] = $module_data['nombre']; $data_module_graph['id_module_type'] = $module_data['id_tipo_modulo']; - $data_module_graph['module_type'] = modules_get_moduletype_name($data_module_graph['id_module_type']); - $data_module_graph['uncompressed'] = is_module_uncompressed($data_module_graph['module_type']); - $data_module_graph['w_min'] = $module_data['min_warning']; - $data_module_graph['w_max'] = $module_data['max_warning']; - $data_module_graph['w_inv'] = $module_data['warning_inverse']; - $data_module_graph['c_min'] = $module_data['min_critical']; - $data_module_graph['c_max'] = $module_data['max_critical']; - $data_module_graph['c_inv'] = $module_data['critical_inverse']; - $data_module_graph['unit'] = $module_data['unit']; + $data_module_graph['module_type'] = modules_get_moduletype_name( + $data_module_graph['id_module_type'] + ); + $data_module_graph['uncompressed'] = is_module_uncompressed( + $data_module_graph['module_type'] + ); + $data_module_graph['w_min'] = $module_data['min_warning']; + $data_module_graph['w_max'] = $module_data['max_warning']; + $data_module_graph['w_inv'] = $module_data['warning_inverse']; + $data_module_graph['c_min'] = $module_data['min_critical']; + $data_module_graph['c_max'] = $module_data['max_critical']; + $data_module_graph['c_inv'] = $module_data['critical_inverse']; + $data_module_graph['unit'] = $module_data['unit']; } else { $data_module_graph = false; } - // format of the graph + // Format of the graph. if (empty($params['unit'])) { $params['unit'] = $module_data['unit']; if (modules_is_unit_macro($params['unit'])) { @@ -775,7 +835,12 @@ function grafico_modulo_sparse($params) if (!$params['array_data_create']) { if ($params['baseline']) { - $array_data = get_baseline_data($agent_module_id, $date_array, $data_module_graph, $params); + $array_data = get_baseline_data( + $agent_module_id, + $date_array, + $data_module_graph, + $params + ); } else { if ($params['compare'] !== false) { $series_suffix = 2; @@ -801,10 +866,14 @@ function grafico_modulo_sparse($params) switch ($params['compare']) { case 'separated': case 'overlapped': - // Store the chart calculated + // Store the chart calculated. $array_data_prev = $array_data; $legend_prev = $legend; break; + + default: + // Not defined. + break; } } @@ -857,7 +926,7 @@ function grafico_modulo_sparse($params) $data_module_graph['series_suffix'] = $series_suffix; - // Check available data + // Check available data. if ($params['compare'] === 'separated') { if (!empty($array_data)) { $return = area_graph( @@ -931,67 +1000,41 @@ function grafico_modulo_sparse($params) /** - * Produces a combined/user defined graph + * Functions tu create graphs. * - * @param array List of source modules - * @param array List of weighs for each module - * @param int Period (in seconds) - * @param int Width, in pixels - * @param int Height, in pixels - * @param string Title for graph - * @param string Unit name, for render in legend - * @param int Show events in graph (set to 1) - * @param int Show alerts in graph (set to 1) - * @param int Pure mode (without titles) (set to 1) - * @param int Date to start of getting info. - * @param mixed If is a projection graph this parameter will be module data with prediction data (the projection) - * or false in other case. - * @param array List of names for the items. Should have the same size as the module list. - * @param array List of units for the items. Should have the same size as the module list. - * @param bool Show the last value of the item on the list. - * @param bool Show the max value of the item on the list. - * @param bool Show the min value of the item on the list. - * @param bool Show the average value of the item on the list. + * @param array $module_list Array modules. + * @param array $params Details builds graphs. For example: + * 'period' => $period, + * 'show_events' => false, + * 'width' => $width, + * 'height' => $height, + * 'title' => '', + * 'unit_name' => null, + * 'show_alerts' => false, + * 'date' => 0, + * 'unit' => '', + * 'only_image' => false, + * 'homeurl' => '', + * 'ttl' => 1, + * 'percentil' => null, + * 'dashboard' => false, + * 'vconsole' => false, + * 'fullscale' => false, + * 'id_widget_dashboard' => false. + * @param array $params_combined Details builds graphs. For example: + * 'weight_list' => array(), + * 'stacked' => 0, + * 'projection' => false, + * 'labels' => array(), + * 'from_interface' => false, + * 'summatory' => 0, + * 'average' => 0, + * 'modules_series' => 0, + * 'id_graph' => 0, + * 'return' => 1. * - * @return Mixed + * @return string html Content graphs. */ - - -/* - $params =array( - 'period' => $period, - 'show_events' => false, - 'width' => $width, - 'height' => $height, - 'title' => '', - 'unit_name' => null, - 'show_alerts' => false, - 'date' => 0, - 'unit' => '', - 'only_image' => false, - 'homeurl' => '', - 'ttl' => 1, - 'percentil' => null, - 'dashboard' => false, - 'vconsole' => false, - 'fullscale' => false, - 'id_widget_dashboard' => false, - ); - - $params_combined = array( - 'weight_list' => array(), - 'stacked' => 0, - 'projection' => false, - 'labels' => array(), - 'from_interface' => false, - 'summatory' => 0, - 'average' => 0, - 'modules_series' => 0, - 'id_graph' => 0, - 'return' => 1 - ); -*/ - function graphic_combined_module( $module_list, $params, @@ -1171,18 +1214,24 @@ function graphic_combined_module( $params_combined['graph_combined'] = true; if ($params['only_image']) { - return generator_chart_to_pdf('combined', $params, $params_combined, $module_list); + return generator_chart_to_pdf( + 'combined', + $params, + $params_combined, + $module_list + ); } if (!isset($params['zoom'])) { $params['zoom'] = 1; } - // XXXX Configurable + // TODO: Configurable. $params['grid_color'] = '#C1C1C1'; $params['legend_color'] = '#636363'; - $params['font'] = $config['fontpath']; - $params['font_size'] = $config['font_size']; + + $params['font'] = $config['fontpath']; + $params['font_size'] = $config['font_size']; $params['short_data'] = $config['short_module_graph_data']; @@ -1228,8 +1277,10 @@ function graphic_combined_module( array_push($modules, $source['id_agent_module']); array_push($weights, $source['weight']); if ($source['label'] != '' || $params_combined['labels']) { - $item['type'] = 'custom_graph'; - $item['id_agent'] = agents_get_module_id($source['id_agent_module']); + $item['type'] = 'custom_graph'; + $item['id_agent'] = agents_get_module_id( + $source['id_agent_module'] + ); $item['id_agent_module'] = $source['id_agent_module']; $labels[$source['id_agent_module']] = ($source['label'] != '') ? reporting_label_macro($item, $source['label']) : reporting_label_macro($item, $params_combined['labels']); } @@ -1281,13 +1332,13 @@ function graphic_combined_module( } } - $width = $params['width']; - $height = $params['height']; - $homeurl = $params['homeurl']; - $ttl = $params['ttl']; + $width = $params['width']; + $height = $params['height']; + $homeurl = $params['homeurl']; + $ttl = $params['ttl']; $background_color = $params['backgroundColor']; - $datelimit = $date_array['start_date']; - $fixed_font_size = $config['font_size']; + $datelimit = $date_array['start_date']; + $fixed_font_size = $config['font_size']; if ($config['fixed_graph'] == false) { $water_mark = [ @@ -1344,22 +1395,32 @@ function graphic_combined_module( ); $data_module_graph = []; - $data_module_graph['history_db'] = db_search_in_history_db($date_array['start_date']); - $data_module_graph['agent_name'] = modules_get_agentmodule_agent_name($agent_module_id); - $data_module_graph['agent_alias'] = modules_get_agentmodule_agent_alias($agent_module_id); - $data_module_graph['agent_id'] = $module_data['id_agente']; - $data_module_graph['module_name'] = $module_data['nombre']; + $data_module_graph['history_db'] = db_search_in_history_db( + $date_array['start_date'] + ); + $data_module_graph['agent_name'] = modules_get_agentmodule_agent_name( + $agent_module_id + ); + $data_module_graph['agent_alias'] = modules_get_agentmodule_agent_alias( + $agent_module_id + ); + $data_module_graph['agent_id'] = $module_data['id_agente']; + $data_module_graph['module_name'] = $module_data['nombre']; $data_module_graph['id_module_type'] = $module_data['id_tipo_modulo']; - $data_module_graph['module_type'] = modules_get_moduletype_name($data_module_graph['id_module_type']); - $data_module_graph['uncompressed'] = is_module_uncompressed($data_module_graph['module_type']); - $data_module_graph['w_min'] = $module_data['min_warning']; - $data_module_graph['w_max'] = $module_data['max_warning']; - $data_module_graph['w_inv'] = $module_data['warning_inverse']; - $data_module_graph['c_min'] = $module_data['min_critical']; - $data_module_graph['c_max'] = $module_data['max_critical']; - $data_module_graph['c_inv'] = $module_data['critical_inverse']; - $data_module_graph['module_id'] = $agent_module_id; - $data_module_graph['unit'] = $module_data['unit']; + $data_module_graph['module_type'] = modules_get_moduletype_name( + $data_module_graph['id_module_type'] + ); + $data_module_graph['uncompressed'] = is_module_uncompressed( + $data_module_graph['module_type'] + ); + $data_module_graph['w_min'] = $module_data['min_warning']; + $data_module_graph['w_max'] = $module_data['max_warning']; + $data_module_graph['w_inv'] = $module_data['warning_inverse']; + $data_module_graph['c_min'] = $module_data['min_critical']; + $data_module_graph['c_max'] = $module_data['max_critical']; + $data_module_graph['c_inv'] = $module_data['critical_inverse']; + $data_module_graph['module_id'] = $agent_module_id; + $data_module_graph['unit'] = $module_data['unit']; // Stract data. $array_data_module = grafico_modulo_sparse_data( @@ -1400,10 +1461,11 @@ function graphic_combined_module( // Work around for fixed the agents name with huge size chars. $fixed_font_size = $config['font_size']; - // $array_events_alerts[$series_suffix] = $events; $i++; - if (is_metaconsole() && $params_combined['type_report'] == 'automatic_graph') { + if (is_metaconsole() + && $params_combined['type_report'] == 'automatic_graph' + ) { metaconsole_restore_db(); } } @@ -1418,7 +1480,7 @@ function graphic_combined_module( } if ($params_combined['projection']) { - // If projection doesn't have data then don't draw graph + // If projection doesn't have data then don't draw graph. if ($output_projection != null) { $date_array_projection = max($output_projection); $date_array['final_date'] = ($date_array_projection[0] / 1000); @@ -1426,9 +1488,13 @@ function graphic_combined_module( } } - // summatory and average series - if ($params_combined['stacked'] == CUSTOM_GRAPH_AREA || $params_combined['stacked'] == CUSTOM_GRAPH_LINE) { - if ($params_combined['summatory'] || $params_combined['average']) { + // Summatory and average series. + if ($params_combined['stacked'] == CUSTOM_GRAPH_AREA + || $params_combined['stacked'] == CUSTOM_GRAPH_LINE + ) { + if ($params_combined['summatory'] + || $params_combined['average'] + ) { $array_data = combined_graph_summatory_average( $array_data, $params_combined['average'], @@ -1471,9 +1537,19 @@ function graphic_combined_module( $do_it_critical_inverse = true; foreach ($module_list as $index => $id_module) { - // Get module warning_min and critical_min - $warning_min = db_get_value('min_warning', 'tagente_modulo', 'id_agente_modulo', $id_module); - $critical_min = db_get_value('min_critical', 'tagente_modulo', 'id_agente_modulo', $id_module); + // Get module warning_min and critical_min. + $warning_min = db_get_value( + 'min_warning', + 'tagente_modulo', + 'id_agente_modulo', + $id_module + ); + $critical_min = db_get_value( + 'min_critical', + 'tagente_modulo', + 'id_agente_modulo', + $id_module + ); if ($index == 0) { $compare_warning = $warning_min; @@ -1494,8 +1570,18 @@ function graphic_combined_module( if ($do_it_warning_min || $do_it_critical_min) { foreach ($module_list as $index => $id_module) { - $warning_max = db_get_value('max_warning', 'tagente_modulo', 'id_agente_modulo', $id_module); - $critical_max = db_get_value('max_critical', 'tagente_modulo', 'id_agente_modulo', $id_module); + $warning_max = db_get_value( + 'max_warning', + 'tagente_modulo', + 'id_agente_modulo', + $id_module + ); + $critical_max = db_get_value( + 'max_critical', + 'tagente_modulo', + 'id_agente_modulo', + $id_module + ); if ($index == 0) { $yellow_up = $warning_max; @@ -1517,8 +1603,18 @@ function graphic_combined_module( if ($do_it_warning_min || $do_it_critical_min) { foreach ($module_list as $index => $id_module) { - $warning_inverse = db_get_value('warning_inverse', 'tagente_modulo', 'id_agente_modulo', $id_module); - $critical_inverse = db_get_value('critical_inverse', 'tagente_modulo', 'id_agente_modulo', $id_module); + $warning_inverse = db_get_value( + 'warning_inverse', + 'tagente_modulo', + 'id_agente_modulo', + $id_module + ); + $critical_inverse = db_get_value( + 'critical_inverse', + 'tagente_modulo', + 'id_agente_modulo', + $id_module + ); if ($index == 0) { $yellow_inverse = $warning_inverse; @@ -1538,18 +1634,24 @@ function graphic_combined_module( } } - if ($do_it_warning_min && $do_it_warning_max && $do_it_warning_inverse) { + if ($do_it_warning_min + && $do_it_warning_max + && $do_it_warning_inverse + ) { $yellow_threshold = $compare_warning; $threshold_data['yellow_threshold'] = $compare_warning; - $threshold_data['yellow_up'] = $yellow_up; - $threshold_data['yellow_inverse'] = (bool) $yellow_inverse; + $threshold_data['yellow_up'] = $yellow_up; + $threshold_data['yellow_inverse'] = (bool) $yellow_inverse; } - if ($do_it_critical_min && $do_it_critical_max && $do_it_critical_inverse) { + if ($do_it_critical_min + && $do_it_critical_max + && $do_it_critical_inverse + ) { $red_threshold = $compare_critical; $threshold_data['red_threshold'] = $compare_critical; - $threshold_data['red_up'] = $red_up; - $threshold_data['red_inverse'] = (bool) $red_inverse; + $threshold_data['red_up'] = $red_up; + $threshold_data['red_inverse'] = (bool) $red_inverse; } $params['threshold_data'] = $threshold_data; @@ -1596,9 +1698,12 @@ function graphic_combined_module( foreach ($module_list as $module_item) { $automatic_custom_graph_meta = false; if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from the report + // template in metaconsole. if (is_array($module_list[$i])) { - $server = metaconsole_get_connection_by_id($module_item['server']); + $server = metaconsole_get_connection_by_id( + $module_item['server'] + ); metaconsole_connect($server); $automatic_custom_graph_meta = true; } @@ -1635,16 +1740,27 @@ function graphic_combined_module( $value = false; } - if (!empty($params_combined['labels']) && isset($params_combined['labels'][$module])) { + if (!empty($params_combined['labels']) + && isset($params_combined['labels'][$module]) + ) { $label = io_safe_input($params_combined['labels'][$module]); } else { - $alias = db_get_value('alias', 'tagente', 'id_agente', $temp[$module]['id_agente']); + $alias = db_get_value( + 'alias', + 'tagente', + 'id_agente', + $temp[$module]['id_agente'] + ); $label = $alias.': '.$temp[$module]['nombre']; } $temp[$module]['label'] = $label; $temp[$module]['value'] = $value; - $temp_max = reporting_get_agentmodule_data_max($module, $params['period'], $params['date']); + $temp_max = reporting_get_agentmodule_data_max( + $module, + $params['period'], + $params['date'] + ); if ($temp_max < 0) { $temp_max = 0; } @@ -1655,7 +1771,11 @@ function graphic_combined_module( $temp[$module]['max'] = ($temp_max === false) ? 0 : $temp_max; } - $temp_min = reporting_get_agentmodule_data_min($module, $params['period'], $params['date']); + $temp_min = reporting_get_agentmodule_data_min( + $module, + $params['period'], + $params['date'] + ); if ($temp_min < 0) { $temp_min = 0; } @@ -1663,7 +1783,8 @@ function graphic_combined_module( $temp[$module]['min'] = ($temp_min === false) ? 0 : $temp_min; if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from the + // report template in metaconsole. if (is_array($module_list[0])) { metaconsole_restore_db(); } @@ -1688,7 +1809,12 @@ function graphic_combined_module( $color, $module_name_list, $long_index, - ui_get_full_url('images/image_problem_area_small.png', false, false, false), + ui_get_full_url( + 'images/image_problem_area_small.png', + false, + false, + false + ), '', '', $water_mark, @@ -1699,7 +1825,6 @@ function graphic_combined_module( $homeurl, $background_color ); - break; case CUSTOM_GRAPH_GAUGE: @@ -1708,9 +1833,12 @@ function graphic_combined_module( foreach ($module_list as $module_item) { $automatic_custom_graph_meta = false; if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from + // the report template in metaconsole. if (is_array($module_list[$i])) { - $server = metaconsole_get_connection_by_id($module_item['server']); + $server = metaconsole_get_connection_by_id( + $module_item['server'] + ); metaconsole_connect($server); $automatic_custom_graph_meta = true; } @@ -1747,7 +1875,14 @@ function graphic_combined_module( $temp[$module]['label'] = ($params_combined['labels'][$module] != '') ? $params_combined['labels'][$module] : $temp[$module]['nombre']; $temp[$module]['value'] = $value; - $temp[$module]['label'] = ui_print_truncate_text($temp[$module]['label'], 'module_small', false, true, false, '..'); + $temp[$module]['label'] = ui_print_truncate_text( + $temp[$module]['label'], + 'module_small', + false, + true, + false, + '..' + ); if ($temp[$module]['unit'] == '%') { $temp[$module]['min'] = 0; @@ -1755,7 +1890,11 @@ function graphic_combined_module( } else { $min = $temp[$module]['min']; if ($temp[$module]['max'] == 0) { - $max = reporting_get_agentmodule_data_max($module, $params['period'], $params['date']); + $max = reporting_get_agentmodule_data_max( + $module, + $params['period'], + $params['date'] + ); } else { $max = $temp[$module]['max']; } @@ -1767,7 +1906,8 @@ function graphic_combined_module( $temp[$module]['gauge'] = uniqid('gauge_'); if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from the report + // template in metaconsole. if (is_array($module_list[0])) { metaconsole_restore_db(); } @@ -1794,13 +1934,17 @@ function graphic_combined_module( $height, $color, $module_name_list, - ui_get_full_url('images/image_problem_area_small.png', false, false, false), + ui_get_full_url( + 'images/image_problem_area_small.png', + false, + false, + false + ), $config['fontpath'], $fixed_font_size, '', $homeurl ); - break; case CUSTOM_GRAPH_HBARS: @@ -1809,9 +1953,12 @@ function graphic_combined_module( foreach ($module_list as $module_item) { $automatic_custom_graph_meta = false; if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from the report + // template in metaconsole. if (is_array($module_list[$i])) { - $server = metaconsole_get_connection_by_id($module_item['server']); + $server = metaconsole_get_connection_by_id( + $module_item['server'] + ); metaconsole_connect($server); $automatic_custom_graph_meta = true; } @@ -1840,17 +1987,25 @@ function graphic_combined_module( modules_get_agentmodule_agent_name($module) ); - if (!empty($params_combined['labels']) && isset($params_combined['labels'][$module])) { + if (!empty($params_combined['labels']) + && isset($params_combined['labels'][$module]) + ) { $label = $params_combined['labels'][$module]; } else { - $alias = db_get_value('alias', 'tagente', 'id_agente', $module_data['id_agente']); + $alias = db_get_value( + 'alias', + 'tagente', + 'id_agente', + $module_data['id_agente'] + ); $label = $alias.' - '.$module_data['nombre']; } $temp[$label]['g'] = round($temp_data, 4); if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from the report + // template in metaconsole. if (is_array($module_list[0])) { metaconsole_restore_db(); } @@ -1874,7 +2029,12 @@ function graphic_combined_module( $color, $module_name_list, $long_index, - ui_get_full_url('images/image_problem_area_small.png', false, false, false), + ui_get_full_url( + 'images/image_problem_area_small.png', + false, + false, + false + ), '', '', $water_mark, @@ -1896,7 +2056,12 @@ function graphic_combined_module( $color, $module_name_list, $long_index, - ui_get_full_url('images/image_problem_area_small.png', false, false, false), + ui_get_full_url( + 'images/image_problem_area_small.png', + false, + false, + false + ), '', '', $water_mark, @@ -1918,9 +2083,12 @@ function graphic_combined_module( foreach ($module_list as $module_item) { $automatic_custom_graph_meta = false; if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from the report + // template in metaconsole. if (is_array($module_list[$i])) { - $server = metaconsole_get_connection_by_id($module_item['server']); + $server = metaconsole_get_connection_by_id( + $module_item['server'] + ); metaconsole_connect($server); $automatic_custom_graph_meta = true; } @@ -1959,10 +2127,19 @@ function graphic_combined_module( $total_modules += $value; - if (!empty($params_combined['labels']) && isset($params_combined['labels'][$module])) { - $label = io_safe_output($params_combined['labels'][$module]); + if (!empty($params_combined['labels']) + && isset($params_combined['labels'][$module]) + ) { + $label = io_safe_output( + $params_combined['labels'][$module] + ); } else { - $alias = db_get_value('alias', 'tagente', 'id_agente', $data_module['id_agente']); + $alias = db_get_value( + 'alias', + 'tagente', + 'id_agente', + $data_module['id_agente'] + ); $label = io_safe_output($alias.': '.$data_module['nombre']); } @@ -1971,7 +2148,8 @@ function graphic_combined_module( 'unit' => $data_module['unit'], ]; if ($config['metaconsole']) { - // Automatic custom graph from the report template in metaconsole + // Automatic custom graph from the report + // template in metaconsole. if (is_array($module_list[0])) { metaconsole_restore_db(); } @@ -2004,7 +2182,6 @@ function graphic_combined_module( false, $background_color ); - break; } @@ -2016,8 +2193,24 @@ function graphic_combined_module( } -function combined_graph_summatory_average($array_data, $average=false, $summatory=false, $modules_series=false, $baseline=false) -{ +/** + * Function for convert data summatory. + * + * @param array $array_data Data array. + * @param boolean $average Average. + * @param boolean $summatory Summatory. + * @param boolean $modules_series Series module. + * @param boolean $baseline Baseline data. + * + * @return array Data. + */ +function combined_graph_summatory_average( + $array_data, + $average=false, + $summatory=false, + $modules_series=false, + $baseline=false +) { if (isset($array_data) && is_array($array_data)) { foreach ($array_data as $key => $value) { if (strpos($key, 'sum') !== false) { @@ -2035,10 +2228,13 @@ function combined_graph_summatory_average($array_data, $average=false, $summator $data_array_pop = []; $count = 0; - while (count($data_array_reverse['sum0']) > 0) { + $count_data_array_reverse = count($data_array_reverse['sum0']); + while ($count_data_array_reverse > 0) { foreach ($data_array_reverse as $key_reverse => $value_reverse) { if (is_array($value_reverse) && count($value_reverse) > 0) { - $data_array_pop[$key_reverse] = array_pop($data_array_reverse[$key_reverse]); + $data_array_pop[$key_reverse] = array_pop( + $data_array_reverse[$key_reverse] + ); } } @@ -2092,12 +2288,18 @@ function combined_graph_summatory_average($array_data, $average=false, $summator $count++; } - if ($summatory && isset($array_sum_reverse) && is_array($array_sum_reverse) && count($array_sum_reverse) > 0) { + if ($summatory && isset($array_sum_reverse) + && is_array($array_sum_reverse) + && count($array_sum_reverse) > 0 + ) { $array_data['summatory']['data'] = $array_sum_reverse; $array_data['summatory']['color'] = 'purple'; } - if ($average && isset($array_avg_reverse) && is_array($array_avg_reverse) && count($array_avg_reverse) > 0) { + if ($average && isset($array_avg_reverse) + && is_array($array_avg_reverse) + && count($array_avg_reverse) > 0 + ) { if ($baseline) { $array_data['baseline']['data'] = $array_avg_reverse; $array_data['baseline']['color'] = 'green'; @@ -2118,19 +2320,28 @@ function combined_graph_summatory_average($array_data, $average=false, $summator /** * Print a graph with access data of agents * - * @param integer id_agent Agent ID - * @param integer width pie graph width - * @param integer height pie graph height - * @param integer period time period - * @param bool return or echo the result flag + * @param integer $id_agent Agent ID. + * @param integer $width Pie graph width. + * @param integer $height Pie graph height. + * @param integer $period Time period. + * @param boolean $return Return. + * @param boolean $tree View tree. + * + * @return string Return or echo the result flag. */ -function graphic_agentaccess($id_agent, $width, $height, $period=0, $return=false, $tree=false) -{ +function graphic_agentaccess( + $id_agent, + $width, + $height, + $period=0, + $return=false, + $tree=false +) { global $config; global $graphic_type; - $date = get_system_time(); - $datelimit = ($date - $period); + $date = get_system_time(); + $datelimit = ($date - $period); $data_array = []; $data = db_get_all_rows_sql( @@ -2160,7 +2371,12 @@ function graphic_agentaccess($id_agent, $width, $height, $period=0, $return=fals if ($config['fixed_graph'] == false) { $water_mark = [ 'file' => $config['homedir'].'/images/logo_vertical_water.png', - 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + 'url' => ui_get_full_url( + 'images/logo_vertical_water.png', + false, + false, + false + ), ]; } @@ -3704,7 +3920,14 @@ function graph_graphic_moduleevents($id_agent, $id_module, $width, $height, $per } -// Prints an error image +/** + * Function for retun image no data. + * + * @param integer $width Width. + * @param integer $height Height. + * + * @return string Image. + */ function fs_error_image($width=300, $height=110) { global $config; @@ -3712,15 +3935,29 @@ function fs_error_image($width=300, $height=110) } +/** + * Function for uncompressed data module for cherts. + * + * @param integer $agent_module_id Id modulo. + * @param array $date_array Date start, finish, period. + * @param integer $show_unknown Show Unknown. + * @param integer $show_percentil Show Percentil. + * @param integer $series_suffix Series. + * @param boolean $compare Type compare. + * @param boolean $data_slice Size slice. + * @param string $type_mode_graph Type. + * + * @return array Return array data uncompresess. + */ function fullscale_data( $agent_module_id, $date_array, $show_unknown=0, $show_percentil=0, - $series_suffix, + $series_suffix=0, $compare=false, $data_slice=false, - $type_mode_graph + $type_mode_graph='' ) { global $config; $data_uncompress = db_uncompress_module_data( @@ -3732,218 +3969,234 @@ function fullscale_data( $data = []; $previous_data = 0; - // normal + // Normal. $min_value_total = PHP_INT_MAX; - $max_value_total = -PHP_INT_MAX; - // max + $max_value_total = (-PHP_INT_MAX); + // Max. $max_value_min = PHP_INT_MAX; - $max_value_max = -PHP_INT_MAX; - // min + $max_value_max = (-PHP_INT_MAX); + // Min. $min_value_min = PHP_INT_MAX; - $min_value_max = -PHP_INT_MAX; - // avg + $min_value_max = (-PHP_INT_MAX); + // Avg. $avg_value_min = PHP_INT_MAX; - $avg_value_max = -PHP_INT_MAX; + $avg_value_max = (-PHP_INT_MAX); $flag_unknown = 0; $array_percentil = []; if ($data_slice) { - foreach ($data_uncompress as $k) { - $sum_data = 0; - $count_data = 0; - $min_value = PHP_INT_MAX; - $max_value = -PHP_INT_MAX; - $flag_virtual_data = 0; - foreach ($k['data'] as $v) { - if (isset($v['type']) && $v['type'] == 1) { - // skip unnecesary virtual data - continue; - $flag_virtual_data = 1; - } + if (isset($data_uncompress) === true + && is_array($data_uncompress) === true + ) { + foreach ($data_uncompress as $k) { + $sum_data = 0; + $count_data = 0; + $min_value = PHP_INT_MAX; + $max_value = (-PHP_INT_MAX); + $flag_virtual_data = 0; + foreach ($k['data'] as $v) { + if (isset($v['type']) && $v['type'] == 1) { + // Skip unnecesary virtual data. + continue; + $flag_virtual_data = 1; + } - if ($compare) { - // * 1000 need js utimestam mlsecond - $real_date = (($v['utimestamp'] + $date_array['period']) * 1000); - } else { - $real_date = ($v['utimestamp'] * 1000); - } + if ($compare) { + // Data * 1000 need js utimestam mlsecond. + $real_date = (($v['utimestamp'] + $date_array['period']) * 1000); + } else { + $real_date = ($v['utimestamp'] * 1000); + } - if ($v['datos'] === null) { - // Unknown - if ($show_unknown) { - if (!$compare) { - if ($flag_unknown) { - $data['unknown'.$series_suffix]['data'][] = [ - $real_date, - 1, - ]; - } else { - $data['unknown'.$series_suffix]['data'][] = [ - ($real_date - 1), - 0, - ]; - $data['unknown'.$series_suffix]['data'][] = [ - $real_date, - 1, - ]; - $flag_unknown = 1; + if ($v['datos'] === null) { + // Unknown. + if ($show_unknown) { + if (!$compare) { + if ($flag_unknown) { + $data['unknown'.$series_suffix]['data'][] = [ + $real_date, + 1, + ]; + } else { + $data['unknown'.$series_suffix]['data'][] = [ + ($real_date - 1), + 0, + ]; + $data['unknown'.$series_suffix]['data'][] = [ + $real_date, + 1, + ]; + $flag_unknown = 1; + } + } + } + + $v['datos'] = $previous_data; + } else { + // Normal. + $previous_data = $v['datos']; + if ($show_unknown) { + if (!$compare) { + if ($flag_unknown) { + $data['unknown'.$series_suffix]['data'][] = [ + $real_date, + 0, + ]; + $flag_unknown = 0; + } } } } - $v['datos'] = $previous_data; - } else { - // normal - $previous_data = $v['datos']; - if ($show_unknown) { - if (!$compare) { - if ($flag_unknown) { - $data['unknown'.$series_suffix]['data'][] = [ - $real_date, - 0, - ]; - $flag_unknown = 0; - } + if (isset($v['datos']) && $v['datos']) { + // Max. + if ($v['datos'] >= $max_value) { + $max_value = $v['datos']; + } + + // Min. + if ($v['datos'] <= $min_value) { + $min_value = $v['datos']; + } + + // Avg sum. + $sum_data += $v['datos']; + } + + // Avg count. + $count_data++; + + if ($show_percentil && !$compare) { + $array_percentil[] = $v['datos']; + } + + $last_data = $v['datos']; + } + + if (!$flag_virtual_data) { + if ($compare) { + // Data * 1000 need js utimestam mlsecond. + $real_date = (($k['data'][0]['utimestamp'] + $date_array['period']) * 1000); + } else { + $real_date = ($k['data'][0]['utimestamp'] * 1000); + } + + $data['sum'.$series_suffix]['data'][] = [ + $real_date, + ($sum_data / $count_data), + ]; + if ($type_mode_graph && !$params['baseline']) { + if ($min_value != PHP_INT_MAX) { + $data['min'.$series_suffix]['data'][] = [ + $real_date, + $min_value, + ]; + } + + if ($max_value != (-PHP_INT_MAX)) { + $data['max'.$series_suffix]['data'][] = [ + $real_date, + $max_value, + ]; + } + } else { + if ($min_value != PHP_INT_MAX) { + $data['sum'.$series_suffix]['slice_data'][$real_date]['min'] = $min_value; + } + + $data['sum'.$series_suffix]['slice_data'][$real_date]['avg'] = ($sum_data / $count_data); + + if ($max_value != (-PHP_INT_MAX)) { + $data['sum'.$series_suffix]['slice_data'][$real_date]['max'] = $max_value; } } - } - if (isset($v['datos']) && $v['datos']) { - // max - if ($v['datos'] >= $max_value) { - $max_value = $v['datos']; + // Max total. + if ($max_value >= $max_value_total + && $max_value != (-PHP_INT_MAX) + ) { + $max_value_total = $max_value; } - // min - if ($v['datos'] <= $min_value) { - $min_value = $v['datos']; + // Min total. + if ($min_value <= $min_value_total + && $min_value != PHP_INT_MAX + ) { + $min_value_total = $min_value; } - // avg sum - $sum_data += $v['datos']; - } + // Avg sum total. + $sum_data_total += ($sum_data / $count_data); - // avg count - $count_data++; + // Avg count total. + $count_data_total++; - if ($show_percentil && !$compare) { - $array_percentil[] = $v['datos']; - } + if ($type_mode_graph && !$params['baseline']) { + // MIN. + // max min. + if ($min_value >= $min_value_max + && $min_value != PHP_INT_MAX + ) { + $min_value_max = $min_value; + } - $last_data = $v['datos']; - } + // Min min. + if ($min_value <= $min_value_min + && $min_value != PHP_INT_MAX + ) { + $min_value_min = $min_value; + } - if (!$flag_virtual_data) { - if ($compare) { - // * 1000 need js utimestam mlsecond - $real_date = (($k['data'][0]['utimestamp'] + $date_array['period']) * 1000); - } else { - $real_date = ($k['data'][0]['utimestamp'] * 1000); - } + // Avg sum min. + if ($min_value != PHP_INT_MAX) { + $sum_data_min += $min_value; + } - $data['sum'.$series_suffix]['data'][] = [ - $real_date, - ($sum_data / $count_data), - ]; - if ($type_mode_graph && !$params['baseline']) { - if ($min_value != PHP_INT_MAX) { - $data['min'.$series_suffix]['data'][] = [ - $real_date, - $min_value, - ]; + // MAX. + // Max max. + if ($max_value >= $max_value_max + && $max_value != (-PHP_INT_MAX) + ) { + $max_value_max = $max_value; + } + + // Min max. + if ($max_value <= $max_value_min + && $max_value != (-PHP_INT_MAX) + ) { + $max_value_min = $max_value; + } + + // Avg Sum max. + if ($max_value != (-PHP_INT_MAX)) { + $sum_data_max += $max_value; + } + + // AVG. + // Max max. + if (($sum_data / $count_data) >= $avg_value_max) { + $avg_value_max = ($sum_data / $count_data); + } + + // Min max. + if (($sum_data / $count_data) <= $avg_value_min) { + $avg_value_min = ($sum_data / $count_data); + } + + // Avg sum max. + $sum_data_avg += ($sum_data / $count_data); } - - if ($max_value != -PHP_INT_MAX) { - $data['max'.$series_suffix]['data'][] = [ - $real_date, - $max_value, - ]; - } - } else { - if ($min_value != PHP_INT_MAX) { - $data['sum'.$series_suffix]['slice_data'][$real_date]['min'] = $min_value; - } - - $data['sum'.$series_suffix]['slice_data'][$real_date]['avg'] = ($sum_data / $count_data); - - if ($max_value != -PHP_INT_MAX) { - $data['sum'.$series_suffix]['slice_data'][$real_date]['max'] = $max_value; - } - } - - // max_total - if ($max_value >= $max_value_total && $max_value != -PHP_INT_MAX) { - $max_value_total = $max_value; - } - - // min_total - if ($min_value <= $min_value_total && $min_value != PHP_INT_MAX) { - $min_value_total = $min_value; - } - - // avg sum_total - $sum_data_total += ($sum_data / $count_data); - - // avg count_total - $count_data_total++; - - if ($type_mode_graph && !$params['baseline']) { - /* - MIN*/ - // max_min - if ($min_value >= $min_value_max && $min_value != PHP_INT_MAX) { - $min_value_max = $min_value; - } - - // min_min - if ($min_value <= $min_value_min && $min_value != PHP_INT_MAX) { - $min_value_min = $min_value; - } - - // avg sum_min - if ($min_value != PHP_INT_MAX) { - $sum_data_min += $min_value; - } - - /* - MAX*/ - // max_max - if ($max_value >= $max_value_max && $max_value != -PHP_INT_MAX) { - $max_value_max = $max_value; - } - - // min_max - if ($max_value <= $max_value_min && $max_value != -PHP_INT_MAX) { - $max_value_min = $max_value; - } - - // avg sum_max - if ($max_value != -PHP_INT_MAX) { - $sum_data_max += $max_value; - } - - /* - AVG*/ - // max_max - if (($sum_data / $count_data) >= $avg_value_max) { - $avg_value_max = ($sum_data / $count_data); - } - - // min_max - if (($sum_data / $count_data) <= $avg_value_min) { - $avg_value_min = ($sum_data / $count_data); - } - - // avg sum_max - $sum_data_avg += ($sum_data / $count_data); } } } $data['sum'.$series_suffix]['min'] = $min_value_total; $data['sum'.$series_suffix]['max'] = $max_value_total; - $data['sum'.$series_suffix]['avg'] = ($sum_data_total / $count_data_total); + $data['sum'.$series_suffix]['avg'] = 0; + if (isset($count_data_total) === true) { + $data['sum'.$series_suffix]['avg'] = ($sum_data_total / $count_data_total); + } if ($type_mode_graph && !$params['baseline']) { $data['min'.$series_suffix]['min'] = $min_value_min; @@ -3966,19 +4219,19 @@ function fullscale_data( foreach ($data_uncompress as $k) { foreach ($k['data'] as $v) { if (isset($v['type']) && $v['type'] == 1) { - // skip unnecesary virtual data + // Skip unnecesary virtual data. continue; } if ($compare) { - // * 1000 need js utimestam mlsecond + // Data * 1000 need js utimestam mlsecond. $real_date = (($v['utimestamp'] + $date_array['period']) * 1000); } else { $real_date = ($v['utimestamp'] * 1000); } if ($v['datos'] === null) { - // Unknown + // Unknown. if ($show_unknown) { if (!$compare) { if ($flag_unknown) { @@ -4005,7 +4258,7 @@ function fullscale_data( $previous_data, ]; } else { - // normal + // Normal. $previous_data = $v['datos']; $data['sum'.$series_suffix]['data'][] = [ $real_date, @@ -4025,21 +4278,21 @@ function fullscale_data( } if (isset($v['datos']) && $v['datos']) { - // max + // Max. if ((float) $v['datos'] >= $max_value_max) { $max_value_max = $v['datos']; } - // min + // Min. if ((float) $v['datos'] <= $min_value_min) { $min_value_min = $v['datos']; } - // avg sum + // Avg sum. $sum_data += $v['datos']; } - // avg count + // Avg count. $count_data++; if ($show_percentil && !$compare) { @@ -4052,7 +4305,7 @@ function fullscale_data( $data['sum'.$series_suffix]['min'] = $min_value_min; $data['sum'.$series_suffix]['max'] = $max_value_max; - $data['sum'.$series_suffix]['avg'] = $count_data == 0 ? 0 : ($sum_data / $count_data); + $data['sum'.$series_suffix]['avg'] = ($count_data == 0) ? 0 : ($sum_data / $count_data); } if ($show_percentil && !$compare) { @@ -4078,7 +4331,7 @@ function fullscale_data( } } - // Add missed last data + // Add missed last data. if ($compare) { $data['sum'.$series_suffix]['data'][] = [ (($date_array['final_date'] + $date_array['period']) * 1000), @@ -4101,7 +4354,11 @@ function fullscale_data( ]; } else { $data['sum'.$series_suffix]['slice_data'][($date_array['final_date'] * 1000)]['min'] = $min_value; - $data['sum'.$series_suffix]['slice_data'][($date_array['final_date'] * 1000)]['avg'] = ($sum_data / $count_data); + $data['sum'.$series_suffix]['slice_data'][($date_array['final_date'] * 1000)]['avg'] = 0; + if (isset($count_data) === true) { + $data['sum'.$series_suffix]['slice_data'][($date_array['final_date'] * 1000)]['avg'] = ($sum_data / $count_data); + } + $data['sum'.$series_suffix]['slice_data'][($date_array['final_date'] * 1000)]['max'] = $max_value; } } @@ -4124,7 +4381,7 @@ function graph_netflow_aggregate_area($data, $period, $width, $height, $ttl=1, $ return; } - // Calculate source indexes + // Calculate source indexes. foreach ($data['sources'] as $key => $value) { $i = 0; foreach ($data['data'] as $k => $v) { @@ -4143,7 +4400,12 @@ function graph_netflow_aggregate_area($data, $period, $width, $height, $ttl=1, $ if ($config['fixed_graph'] == false) { $water_mark = [ 'file' => $config['homedir'].'/images/logo_vertical_water.png', - 'url' => ui_get_full_url('images/logo_vertical_water.png', false, false, false), + 'url' => ui_get_full_url( + 'images/logo_vertical_water.png', + false, + false, + false + ), ]; $water_mark = $config['homedir'].'/images/logo_vertical_water.png'; @@ -4949,8 +5211,22 @@ function graph_monitor_wheel($width=550, $height=600, $filter=false) } -function get_baseline_data($agent_module_id, $date_array, $data_module_graph, $params) -{ +/** + * Function that on a date requests 3 times that period and takes an average. + * + * @param integer $agent_module_id ID module. + * @param array $date_array Date array start finish period. + * @param array $data_module_graph Data module. + * @param array $params Params. + * + * @return array Data baseline graph. + */ +function get_baseline_data( + $agent_module_id, + $date_array, + $data_module_graph, + $params +) { $period = $date_array['period']; $date = $date_array['final_date']; $array_data = []; @@ -4989,8 +5265,18 @@ function get_baseline_data($agent_module_id, $date_array, $data_module_graph, $p } $result['avg'] = (($array_data[0]['sum0']['avg'] + $array_data[1]['sum1']['avg'] + $array_data[2]['sum2']['avg'] + $array_data[3]['sum3']['avg']) / 4); - $result['max'] = max($array_data[0]['sum0']['max'], $array_data[1]['sum1']['max'], $array_data[2]['sum2']['max'], $array_data[3]['sum3']['max']); - $result['min'] = min($array_data[0]['sum0']['min'], $array_data[1]['sum1']['min'], $array_data[2]['sum2']['min'], $array_data[3]['sum3']['min']); + $result['max'] = max( + $array_data[0]['sum0']['max'], + $array_data[1]['sum1']['max'], + $array_data[2]['sum2']['max'], + $array_data[3]['sum3']['max'] + ); + $result['min'] = min( + $array_data[0]['sum0']['min'], + $array_data[1]['sum1']['min'], + $array_data[2]['sum2']['min'], + $array_data[3]['sum3']['min'] + ); $result['agent_module_id'] = $array_data[0]['sum0']['agent_module_id']; $result['id_module_type'] = $array_data[0]['sum0']['id_module_type']; diff --git a/pandora_console/include/functions_messages.php b/pandora_console/include/functions_messages.php index 35066129bc..1bc54c9c89 100644 --- a/pandora_console/include/functions_messages.php +++ b/pandora_console/include/functions_messages.php @@ -442,14 +442,15 @@ function messages_get_count_sent(string $user='') /** * Get message overview in array * - * @param string $order How to order them valid: - * (status (default), subject, timestamp, sender). - * @param string $order_dir Direction of order - * (ASC = Ascending, DESC = Descending). - * @param boolean $incl_read Include read messages in return. - * @param boolean $incl_source_info Include source info. - * @param integer $limit Maximum number of result in the query. - * @param array $other_filter Add a filter on main query. + * @param string $order How to order them valid: + * (status (default), subject, timestamp, sender). + * @param string $order_dir Direction of order + * (ASC = Ascending, DESC = Descending). + * @param boolean $incl_read Include read messages in return. + * @param boolean $incl_source_info Include source info. + * @param integer $limit Maximum number of result in the query. + * @param array $other_filter Add a filter on main query. + * @param string $join_other_filter How to join filter on main query. * * @return integer The number of messages this user has */ @@ -459,7 +460,8 @@ function messages_get_overview( bool $incl_read=true, bool $incl_source_info=false, int $limit=0, - array $other_filter=[] + array $other_filter=[], + string $join_other_filter='AND' ) { global $config; @@ -529,7 +531,11 @@ function messages_get_overview( $config['id_user'], $config['id_user'], $read, - db_format_array_where_clause_sql($other_filter, 'AND', ' AND '), + db_format_array_where_clause_sql( + $other_filter, + $join_other_filter, + ' AND ' + ), $order, ($limit !== 0) ? ' LIMIT '.$limit : '' ); diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index a498ef54d3..66efd3d4a7 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -972,13 +972,32 @@ function notifications_print_dropdown() */ function notifications_print_dropdown_element($message_info) { + $action = ''; + + switch ($message_info['description']) { + case 'Official communication': + $action = 'show_modal(this.id);'; + $target = ''; + $body_preview = __('Click here to get more information'); + break; + + default: + $action = ''; + $target = '_blank'; + $body_preview = strip_tags( + io_safe_output($message_info['mensaje']), + '
    '
    +            );
    +        break;
    +    }
    +
         return sprintf(
             "
                 %s
                 
    @@ -990,10 +1009,12 @@ function notifications_print_dropdown_element($message_info)

    ", + $action.';click_on_notification_toast(event)', $message_info['id_mensaje'], messages_get_url($message_info['id_mensaje']), + $target, html_print_image('images/'.$message_info['icon'], true), io_safe_output($message_info['subject']), - strip_tags(io_safe_output($message_info['mensaje']), '
    ')
    +        $body_preview
         );
     }
    diff --git a/pandora_console/include/functions_reporting.php b/pandora_console/include/functions_reporting.php
    index a877361766..735e6f295f 100755
    --- a/pandora_console/include/functions_reporting.php
    +++ b/pandora_console/include/functions_reporting.php
    @@ -1914,6 +1914,11 @@ function reporting_event_report_module(
         $return['title'] = $content['name'];
         $return['subtitle'] = agents_get_alias($content['id_agent']).' - '.io_safe_output(modules_get_agentmodule_name($content['id_agent_module']));
     
    +    $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    if ($return['label'] != '') {
    +        $return['label'] = reporting_label_macro($content, $return['label']);
    +    }
    +
         if (is_metaconsole()) {
             metaconsole_restore_db();
         }
    @@ -1921,7 +1926,6 @@ function reporting_event_report_module(
         $return['description'] = $content['description'];
         $return['show_extended_events'] = $content['show_extended_events'];
         $return['date'] = reporting_get_date_text($report, $content);
    -    $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
     
         $event_filter = $content['style'];
         $return['show_summary_group'] = $event_filter['show_summary_group'];
    @@ -2741,6 +2745,17 @@ function reporting_group_report($report, $content)
     }
     
     
    +/**
    + * Create data report event agent.
    + *
    + * @param array   $report             Data report.
    + * @param array   $content            Content report.
    + * @param string  $type               Type report.
    + * @param integer $force_width_chart  Force width.
    + * @param integer $force_height_chart Force height.
    + *
    + * @return array Data.
    + */
     function reporting_event_report_agent(
         $report,
         $content,
    @@ -2761,26 +2776,26 @@ function reporting_event_report_agent(
             $history = true;
         }
     
    -    $return['title']              = $content['name'];
    -    $return['subtitle']           = agents_get_alias($content['id_agent']);
    -    $return['description']        = $content['description'];
    -    $return['date']               = reporting_get_date_text($report, $content);
    -    $return['label']              = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    $return['title'] = $content['name'];
    +    $return['subtitle'] = agents_get_alias($content['id_agent']);
    +    $return['description'] = $content['description'];
    +    $return['date'] = reporting_get_date_text($report, $content);
    +
         $return['show_summary_group'] = $content['style']['show_summary_group'];
         $return['show_extended_events'] = $content['show_extended_events'];
     
         $style = $content['style'];
     
    -    // filter
    -    $show_summary_group         = $style['show_summary_group'];
    -    $filter_event_severity      = json_decode($style['filter_event_severity'], true);
    -    $filter_event_type          = json_decode($style['filter_event_type'], true);
    -    $filter_event_status        = json_decode($style['filter_event_status'], true);
    +    // Filter.
    +    $show_summary_group = $style['show_summary_group'];
    +    $filter_event_severity = json_decode($style['filter_event_severity'], true);
    +    $filter_event_type = json_decode($style['filter_event_type'], true);
    +    $filter_event_status = json_decode($style['filter_event_status'], true);
         $filter_event_filter_search = $style['event_filter_search'];
     
    -    // graph
    -    $event_graph_by_user_validator        = $style['event_graph_by_user_validator'];
    -    $event_graph_by_criticity             = $style['event_graph_by_criticity'];
    +    // Graph.
    +    $event_graph_by_user_validator = $style['event_graph_by_user_validator'];
    +    $event_graph_by_criticity = $style['event_graph_by_criticity'];
         $event_graph_validated_vs_unvalidated = $style['event_graph_validated_vs_unvalidated'];
     
         $return['data'] = reporting_get_agents_detailed_event(
    @@ -2825,6 +2840,13 @@ function reporting_event_report_agent(
             $metaconsole_dbtable = false;
         }
     
    +    $label = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    if ($label != '') {
    +        $label = reporting_label_macro($content, $label);
    +    }
    +
    +    $return['label'] = $label;
    +
         if ($event_graph_by_user_validator) {
             $data_graph = events_get_count_events_validated_by_user(
                 ['id_agent' => $content['id_agent']],
    @@ -2908,7 +2930,7 @@ function reporting_event_report_agent(
             metaconsole_restore_db();
         }
     
    -    // total_events
    +    // Total events.
         if ($return['data'] != '') {
             $return['total_events'] = count($return['data']);
         } else {
    @@ -2941,7 +2963,11 @@ function reporting_historical_data($report, $content)
         $return['subtitle'] = $agent_name.' - '.$module_name;
         $return['description'] = $content['description'];
         $return['date'] = reporting_get_date_text($report, $content);
    +
         $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    if ($return['label'] != '') {
    +        $return['label'] = reporting_label_macro($content, $return['label']);
    +    }
     
         $return['keys'] = [
             __('Date'),
    @@ -3017,7 +3043,6 @@ function reporting_database_serialized($report, $content)
         $return['subtitle'] = $agent_name.' - '.$module_name;
         $return['description'] = $content['description'];
         $return['date'] = reporting_get_date_text($report, $content);
    -    $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
     
         $keys = [];
         if (isset($content['header_definition']) && ($content['header_definition'] != '')) {
    @@ -3043,6 +3068,11 @@ function reporting_database_serialized($report, $content)
             metaconsole_connect($server);
         }
     
    +    $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    if ($return['label'] != '') {
    +        $return['label'] = reporting_label_macro($content, $return['label']);
    +    }
    +
         $datelimit = ($report['datetime'] - $content['period']);
         $search_in_history_db = db_search_in_history_db($datelimit);
     
    @@ -3589,7 +3619,12 @@ function reporting_alert_report_agent($report, $content)
         $return['subtitle'] = $agent_name;
         $return['description'] = $content['description'];
         $return['date'] = reporting_get_date_text($report, $content);
    +
         $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    if ($return['label'] != '') {
    +        $return['label'] = reporting_label_macro($content, $return['label']);
    +    }
    +
         $module_list = agents_get_modules($content['id_agent']);
     
         $data = [];
    @@ -3721,6 +3756,9 @@ function reporting_alert_report_module($report, $content)
         $return['description'] = $content['description'];
         $return['date'] = reporting_get_date_text($report, $content);
         $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    if ($return['label'] != '') {
    +        $return['label'] = reporting_label_macro($content, $return['label']);
    +    }
     
         $data_row = [];
     
    @@ -3923,7 +3961,6 @@ function reporting_monitor_report($report, $content)
         $return['subtitle'] = $agent_name.' - '.$module_name;
         $return['description'] = $content['description'];
         $return['date'] = reporting_get_date_text($report, $content);
    -    $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
     
         if ($config['metaconsole']) {
             $id_meta = metaconsole_get_id_server($content['server_name']);
    @@ -3932,6 +3969,11 @@ function reporting_monitor_report($report, $content)
             metaconsole_connect($server);
         }
     
    +    $return['label'] = (isset($content['style']['label'])) ? $content['style']['label'] : '';
    +    if ($return['label'] != '') {
    +        $return['label'] = reporting_label_macro($content, $return['label']);
    +    }
    +
         $module_name = io_safe_output(
             modules_get_agentmodule_name($content['id_agent_module'])
         );
    @@ -5515,6 +5557,10 @@ function reporting_advanced_sla(
                     $max_value = 0;
                     $min_value = 0;
                     $inverse_interval = 1;
    +            } else if ($agentmodule_info['id_tipo_modulo'] == '100') {
    +                $max_value = 0.9;
    +                $min_value = 0;
    +                $inverse_interval = 1;
                 }
             }
         }
    @@ -7331,6 +7377,7 @@ function reporting_simple_graph(
             $report,
             $content
         );
    +
         $label = (isset($content['style']['label'])) ? $content['style']['label'] : '';
         if ($label != '') {
             $label = reporting_label_macro($content, $label);
    @@ -7342,7 +7389,7 @@ function reporting_simple_graph(
     
         $return['chart'] = '';
     
    -    // Get chart
    +    // Get chart.
         reporting_set_conf_charts($width, $height, $only_image, $type, $content, $ttl);
     
         if (!empty($force_width_chart)) {
    diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php
    index eac317863b..ce7d182e53 100755
    --- a/pandora_console/include/functions_ui.php
    +++ b/pandora_console/include/functions_ui.php
    @@ -1266,11 +1266,11 @@ function ui_print_alert_template_example($id_alert_template, $return=false, $pri
      *
      * @return string The help tip
      */
    -function ui_print_help_icon($help_id, $return=false, $home_url='', $image='images/help_green.png', $is_relative=false)
    +function ui_print_help_icon($help_id, $return=false, $home_url='', $image='images/help_green.png', $is_relative=false, $id='')
     {
         global $config;
     
    -    // Do not display the help icon if help is disabled
    +    // Do not display the help icon if help is disabled.
         if ($config['disable_help']) {
             return '';
         }
    @@ -1283,13 +1283,16 @@ function ui_print_help_icon($help_id, $return=false, $home_url='', $image='image
             $home_url = '../../'.$home_url;
         }
     
    +    $url = get_help_info($help_id);
    +
         $output = html_print_image(
             $image,
             true,
             [
                 'class'   => 'img_help',
                 'title'   => __('Help'),
    -            'onclick' => "open_help ('".$help_id."','".$home_url."','".$config['id_user']."')",
    +            'onclick' => "open_help ('".$url."')",
    +            'id'      => $id,
             ],
             false,
             $is_relative && is_metaconsole()
    diff --git a/pandora_console/include/functions_update_manager.php b/pandora_console/include/functions_update_manager.php
    index 6912aa05ff..fb499e45e7 100755
    --- a/pandora_console/include/functions_update_manager.php
    +++ b/pandora_console/include/functions_update_manager.php
    @@ -1,7 +1,6 @@
      $email],
    +            ['id_user' => $config['id_user']]
    +        );
    +    }
    +
    +    // Update the alert action Mail to XXX/Administrator
    +    // if it is set to default.
    +    $mail_check = 'yourmail@domain.es';
    +    $mail_alert = alerts_get_alert_action_field1(1);
    +    if ($mail_check === $mail_alert && $email !== false) {
    +        alerts_update_alert_action(
    +            1,
    +            [
    +                'field1'          => $email,
    +                'field1_recovery' => $email,
    +            ]
    +        );
    +    }
    +
    +    config_update_value('initial_wizard', 1);
    +}
    +
    +
    +/**
    + * Generates base code to print main configuration modal.
    + *
    + * Asks for timezone, mail.
    + *
    + * @param boolean $return   Print output or not.
    + * @param boolean $launch   Process JS modal.
    + * @param string  $callback Call to JS function at end.
    + *
    + * @return string HTML.
    + */
    +function config_wiz_modal(
    +    $return=false,
    +    $launch=true,
    +    $callback=false
    +) {
    +    global $config;
    +
    +    $email = db_get_value('email', 'tusuario', 'id_user', $config['id_user']);
    +    // Avoid to show default email.
    +    if ($email == 'admin@example.com') {
    +        $email = '';
    +    }
    +
    +    $output = '';
    +
    +    // Prints first step pandora registration.
    +    $output .= '';
    +
    +    $output .= '
    '; + + // Verification modal. + $output .= ''; + + ob_start(); + ?> + + + + true, + 'message' => '', + ]; + + // Pandora register update. + $um_message = update_manager_register_instance(); + $ui_feedback['message'] .= $um_message['message'].'

    '; + $ui_feedback['status'] = $um_message['success'] && $ui_feedback['status']; + + if ($ui_feedback['status']) { + // Store next identification reminder. + config_update_value( + 'identification_reminder_timestamp', + $next_check + ); + } + + return $ui_feedback; +} + + +/** + * Shows a modal to register current console in UpdateManager. + * + * @param boolean $return Return or show html. + * @param boolean $launch Execute wizard. + * @param string $callback Call function when done. + * + * @return string HTML code. + */ +function registration_wiz_modal( + $return=false, + $launch=true, + $callback=false +) { + global $config; + $output = ''; + + $product_name = get_product_name(); + + $output .= ''; + + // Verification modal. + $output .= ''; + + // Results modal. + $output .= ''; + + ob_start(); + ?> + + + 1], + ['id_user' => $config['id_user']] + ); + $ui_feedback['status'] = $um_message['success']; + } else { + $ui_feedback['status'] = false; + } + + return $ui_feedback; +} + + +/** + * Show a modal allowing the user register into newsletter. + * + * @param boolean $return Print content o return it. + * @param boolean $launch Launch directly on load or not. + * @param string $callback Call function when done. + * + * @return string HTML code. + */ +function newsletter_wiz_modal( + $return=false, + $launch=true, + $callback=false +) { + global $config; + + $output = ''; + + $product_name = get_product_name(); + $email = db_get_value( + 'email', + 'tusuario', + 'id_user', + $config['id_user'] + ); + + // Avoid to show default email. + if ($email == 'admin@example.com') { + $email = ''; + } + + $output .= ''; + + // Verification modal. + $output .= ''; + + // Results modal. + $output .= ''; + + ob_start(); + ?> + + + $license, @@ -49,11 +978,18 @@ function update_manager_get_config_values() 'limit_count' => $limit_count, 'build' => $build_version, 'version' => $pandora_version, + 'puid' => $config['pandora_uid'], ]; } -// Function to remove dir and files inside +/** + * Function to remove dir and files inside. + * + * @param string $dir Path to dir. + * + * @return void + */ function rrmdir($dir) { if (is_dir($dir)) { @@ -77,6 +1013,11 @@ function rrmdir($dir) } +/** + * Install updates step2. + * + * @return void + */ function update_manager_install_package_step2() { global $config; @@ -90,9 +1031,9 @@ function update_manager_install_package_step2() $path = sys_get_temp_dir().'/pandora_oum/'.$package; - // All files extracted + // All files extracted. $files_total = $path.'/files.txt'; - // Files copied + // Files copied. $files_copied = $path.'/files.copied.txt'; $return = []; @@ -101,93 +1042,109 @@ function update_manager_install_package_step2() } if (file_exists($path)) { - if ($files_h = fopen($files_total, 'r')) { - while ($line = stream_get_line($files_h, 65535, "\n")) { - $line = trim($line); - - // Tries to move the old file to the directory backup inside the extracted package - if (file_exists($config['homedir'].'/'.$line)) { - rename($config['homedir'].'/'.$line, $path.'/backup/'.$line); - } - - // Tries to move the new file to the Integria directory - $dirname = dirname($line); - if (!file_exists($config['homedir'].'/'.$dirname)) { - $dir_array = explode('/', $dirname); - $temp_dir = ''; - foreach ($dir_array as $dir) { - $temp_dir .= '/'.$dir; - if (!file_exists($config['homedir'].$temp_dir)) { - mkdir($config['homedir'].$temp_dir); - } - } - } - - if (is_dir($path.'/'.$line)) { - if (!file_exists($config['homedir'].'/'.$line)) { - mkdir($config['homedir'].'/'.$line); - file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX)); - } - } else { - // Copy the new file - if (rename($path.'/'.$line, $config['homedir'].'/'.$line)) { - // Append the moved file to the copied files txt - if (!file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX))) { - // If the copy process fail, this code tries to restore the files backed up before - if ($files_copied_h = fopen($files_copied, 'r')) { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line_c)) { - $backup_status = __('Some of your files might not be recovered.'); - } - } - - if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line)) { - $backup_status = __('Some of your files might not be recovered.'); - } - - fclose($files_copied_h); - } else { - $backup_status = __('Some of your old files might not be recovered.'); - } - - fclose($files_h); - $return['status'] = 'error'; - $return['message'] = __("Line '$line' not copied to the progress file.").' '.$backup_status; - echo json_encode($return); - return; - } - } else { - // If the copy process fail, this code tries to restore the files backed up before - if ($files_copied_h = fopen($files_copied, 'r')) { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line)) { - $backup_status = __('Some of your old files might not be recovered.'); - } - } - - fclose($files_copied_h); - } else { - $backup_status = __('Some of your files might not be recovered.'); - } - - fclose($files_h); - $return['status'] = 'error'; - $return['message'] = __("File '$line' not copied.").' '.$backup_status; - echo json_encode($return); - return; - } - } - } - - fclose($files_h); - } else { + $files_h = fopen($files_total, 'r'); + if ($files_h === false) { $return['status'] = 'error'; $return['message'] = __('An error ocurred while reading a file.'); echo json_encode($return); return; } + + while ($line = stream_get_line($files_h, 65535, "\n")) { + $line = trim($line); + + // Tries to move the old file to the directory backup + // inside the extracted package. + if (file_exists($config['homedir'].'/'.$line)) { + rename($config['homedir'].'/'.$line, $path.'/backup/'.$line); + } + + // Tries to move the new file to the Integria directory. + $dirname = dirname($line); + if (!file_exists($config['homedir'].'/'.$dirname)) { + $dir_array = explode('/', $dirname); + $temp_dir = ''; + foreach ($dir_array as $dir) { + $temp_dir .= '/'.$dir; + if (!file_exists($config['homedir'].$temp_dir)) { + mkdir($config['homedir'].$temp_dir); + } + } + } + + if (is_dir($path.'/'.$line)) { + if (!file_exists($config['homedir'].'/'.$line)) { + mkdir($config['homedir'].'/'.$line); + file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX)); + } + } else { + // Copy the new file. + if (rename($path.'/'.$line, $config['homedir'].'/'.$line)) { + // Append the moved file to the copied files txt. + if (!file_put_contents($files_copied, $line."\n", (FILE_APPEND | LOCK_EX))) { + // If the copy process fail, this code tries to + // restore the files backed up before. + $files_copied_h = fopen($files_copied, 'r'); + if ($files_copied_h === false) { + $backup_status = __('Some of your old files might not be recovered.'); + } else { + while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { + $line_c = trim($line_c); + if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line_c)) { + $backup_status = __('Some of your files might not be recovered.'); + } + } + + if (!rename($path.'/backup/'.$line, $config['homedir'].'/'.$line)) { + $backup_status = __('Some of your files might not be recovered.'); + } + + fclose($files_copied_h); + } + + fclose($files_h); + $return['status'] = 'error'; + $return['message'] = __( + 'Line "%s" not copied to the progress file.', + $line + ).' '.$backup_status; + echo json_encode($return); + return; + } + } else { + // If the copy process fail, this code tries to restore + // the files backed up before. + $files_copied_h = fopen($files_copied, 'r'); + if ($files_copied_h === false) { + $backup_status = __('Some of your files might not be recovered.'); + } else { + while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { + $line_c = trim($line_c); + if (!rename( + $path.'/backup/'.$line, + $config['homedir'].'/'.$line + ) + ) { + $backup_status = __('Some of your old files might not be recovered.'); + } + } + + fclose($files_copied_h); + } + + fclose($files_h); + $return['status'] = 'error'; + $return['message'] = __( + 'Line "%s" not copied to the progress file.', + $line + ).' '.$backup_status; + echo json_encode($return); + return; + } + } + } + + fclose($files_h); } else { $return['status'] = 'error'; $return['message'] = __('The package does not exist'); @@ -197,20 +1154,28 @@ function update_manager_install_package_step2() update_manager_enterprise_set_version($version); $product_name = get_product_name(); - db_pandora_audit("Update $product_name", "Update version: $version of $product_name by ".$config['id_user']); + + // Generate audit entry. + db_pandora_audit( + 'Update '.$product_name, + 'Update version: '.$version.' of '.$product_name.' by '.$config['id_user'] + ); $return['status'] = 'success'; $return['message'] = __('The package is installed.'); echo json_encode($return); - return; } +/** + * Launch update manager client. + * + * @return void + */ function update_manager_main() { global $config; - ?> '; - // Parent layer + // Parent layer. $return .= '
    '; return $return; diff --git a/pandora_console/include/help/clippy/modules_not_learning_mode.php b/pandora_console/include/help/clippy/modules_not_learning_mode.php index 85dc5c1182..ff26b065f6 100755 --- a/pandora_console/include/help/clippy/modules_not_learning_mode.php +++ b/pandora_console/include/help/clippy/modules_not_learning_mode.php @@ -1,20 +1,30 @@ true, 'position' => 'left', - 'intro' => ''.''.''.''.'
    '.__('Please note that you have your agent setup to do not add new modules coming from the data XML.').'
    '.__('That means if you have a local plugin or add manually new modules to the configuration file, you won\'t have it in your agent, unless you first create manually in the interface (with the exact name and type as coming in the XML file).').'
    '.__('You should use the "normal" mode (non learn) only when you don\'t intend to add more modules to the agent.').ui_print_help_icon('module_definition', true, '', 'images/help.png').'
    ', + 'intro' => '
    '.__('Please note that you have your agent setup to do not add new modules coming from the data XML.').'
    '.__('That means if you have a local plugin or add manually new modules to the configuration file, you won\'t have it in your agent, unless you first create manually in the interface (with the exact name and type as coming in the XML file).').'
    '.__('You should use the "normal" mode (non learn) only when you don\'t intend to add more modules to the agent.').'
    ', ]; $return_tours['tours']['modules_not_learning_mode']['conf'] = []; $return_tours['tours']['modules_not_learning_mode']['conf']['autostart'] = false; diff --git a/pandora_console/include/javascript/functions_pandora_networkmap.js b/pandora_console/include/javascript/functions_pandora_networkmap.js index 5c5f5026e5..c2335903d7 100644 --- a/pandora_console/include/javascript/functions_pandora_networkmap.js +++ b/pandora_console/include/javascript/functions_pandora_networkmap.js @@ -1284,7 +1284,7 @@ function hide_labels_function() { $("#hide_labels_" + networkmap_id + " > a").attr("title", "Show Labels"); $("#hide_labels_" + networkmap_id + " > a > img").attr( "src", - "images/icono_pintar.png" + window.location.origin + "/pandora_console/images/icono_pintar.png" ); d3.selectAll(".node_text").style("display", "none"); @@ -1297,7 +1297,7 @@ function show_labels_function() { $("#hide_labels_" + networkmap_id + " > a").attr("title", "Hide Labels"); $("#hide_labels_" + networkmap_id + " > a > img").attr( "src", - "images/icono_borrar.png" + window.location.origin + "/pandora_console/images//icono_borrar.png" ); d3.selectAll(".node_text").style("display", ""); diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index b7dd0dc48e..d5413e3c09 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -33,9 +33,21 @@ function winopeng_var(url, wid, width, height) { status = wid; } -function open_help(help_id, home_url, id_user) { +function open_help(url) { + if (!navigator.onLine) { + alert( + "The help system could not be started. Please, check your network connection." + ); + return; + } + if (url == "") { + alert( + "The help system is currently under maintenance. Sorry for the inconvenience." + ); + return; + } open( - home_url + "general/pandora_help.php?id=" + help_id + "&id_user=" + id_user, + url, "pandorahelp", "width=650,height=500,status=0,toolbar=0,menubar=0,scrollbars=1,location=0" ); diff --git a/pandora_console/include/javascript/pandora_taskList.js b/pandora_console/include/javascript/pandora_taskList.js index f151c9003a..75d95df026 100644 --- a/pandora_console/include/javascript/pandora_taskList.js +++ b/pandora_console/include/javascript/pandora_taskList.js @@ -19,10 +19,13 @@ function progress_task_list(id, title) { .empty() .dialog({ title: title, - draggable: true, + autoOpen: false, modal: false, - width: 600, - height: 420, + resizable: false, + draggable: false, + closeOnEscape: true, + width: 800, + height: 600, close: function() { if (xhr != null) xhr.abort(); if (timeoutRef != null) clearTimeout(timeoutRef); diff --git a/pandora_console/include/javascript/pandora_visual_console.js b/pandora_console/include/javascript/pandora_visual_console.js index 1df990db10..b78270f3dc 100755 --- a/pandora_console/include/javascript/pandora_visual_console.js +++ b/pandora_console/include/javascript/pandora_visual_console.js @@ -1,5 +1,5 @@ // TODO: Add Artica ST header. -/* globals jQuery, VisualConsole */ +/* globals jQuery, VisualConsole, AsyncTaskManager */ /* * ********************* @@ -28,63 +28,89 @@ function createVisualConsole( updateInterval, onUpdate ) { - var visualConsole = null; - var linkedVCRequest = null; - var updateVCRequest = null; - if (container == null || props == null || items == null) return null; if (baseUrl == null) baseUrl = ""; - // Code which will be executed between intervals. - var intervalRef = null; - var stopInterval = function() { - if (intervalRef !== null) window.clearInterval(intervalRef); - }; - var startInterval = function() { - if (updateInterval == null || updateInterval <= 0) return; - stopInterval(); + var visualConsole = null; + var asyncTaskManager = new AsyncTaskManager(); - intervalRef = window.setInterval(function() { - if (updateVCRequest !== null) updateVCRequest.abort(); - updateVCRequest = loadVisualConsoleData( - baseUrl, - visualConsole.props.id, - function(error, data) { - if (error) { - console.log( - "[ERROR]", - "[VISUAL-CONSOLE-CLIENT]", - "[API]", - error.message - ); - return; + function updateVisualConsole(visualConsoleId, updateInterval, tts) { + if (tts == null) tts = 0; // Time to start. + + asyncTaskManager.add( + "visual-console", + function(done) { + var abortable = loadVisualConsoleData( + baseUrl, + visualConsoleId, + function(error, data) { + if (error) { + console.log( + "[ERROR]", + "[VISUAL-CONSOLE-CLIENT]", + "[API]", + error.message + ); + done(); + return; + } + + // Replace Visual Console. + if (data != null && data.props != null && data.items != null) { + try { + var props = + typeof data.props === "string" + ? JSON.parse(data.props) + : data.props; + var items = + typeof data.items === "string" + ? JSON.parse(data.items) + : data.items; + + var prevProps = visualConsole.props; + // Update the data structure. + visualConsole.props = props; + // Update the items. + visualConsole.updateElements(items); + // Emit the VC update event. + if (onUpdate) onUpdate(prevProps, visualConsole.props); + } catch (ignored) {} // eslint-disable-line no-empty + + done(); + } } + ); - // Replace Visual Console. - if (data != null && data.props != null && data.items != null) { - try { - var props = - typeof data.props === "string" - ? JSON.parse(data.props) - : data.props; - var items = - typeof data.items === "string" - ? JSON.parse(data.items) - : data.items; - - var prevProps = visualConsole.props; - // Update the data structure. - visualConsole.props = props; - // Update the items. - visualConsole.updateElements(items); - // Emit the VC update event. - if (onUpdate) onUpdate(prevProps, visualConsole.props); - } catch (ignored) {} // eslint-disable-line no-empty + return { + cancel: function() { + abortable.abort(); } + }; + }, + updateInterval + ); + + asyncTaskManager.add("visual-console-start", function(done) { + var ref = setTimeout(function() { + asyncTaskManager.init("visual-console"); + done(); + }, tts); + + return { + cancel: function() { + clearTimeout(ref); } - ); - }, updateInterval); - }; + }; + }); + + if (tts > 0) { + // Wait to start the fetch interval. + asyncTaskManager.init("visual-console-start"); + } else { + // Start the fetch interval immediately. + asyncTaskManager.init("visual-console"); + } + } // Initialize the Visual Console. try { @@ -102,64 +128,35 @@ function createVisualConsole( ) { // Stop the current link behavior. e.nativeEvent.preventDefault(); - // Fetch and update the old VC with the new. - if (linkedVCRequest !== null) linkedVCRequest.abort(); - linkedVCRequest = loadVisualConsoleData( - baseUrl, - e.data.linkedLayoutId, - function(error, data) { - if (error) { - console.log( - "[ERROR]", - "[VISUAL-CONSOLE-CLIENT]", - "[API]", - error.message - ); - return; - } - - // Replace Visual Console. - if (data != null && data.props != null && data.items != null) { - // Cancel the old VC updates. - stopInterval(); - - try { - var props = - typeof data.props === "string" - ? JSON.parse(data.props) - : data.props; - var items = - typeof data.items === "string" - ? JSON.parse(data.items) - : data.items; - - if (updateVCRequest !== null) updateVCRequest.abort(); - // Save the old props. - var prevProps = visualConsole.props; - // Update the data structure. - visualConsole.props = props; - // Update the items. - visualConsole.updateElements(items); - // Emit the VC update event. - if (onUpdate) onUpdate(prevProps, visualConsole.props); - } catch (ignored) {} // eslint-disable-line no-empty - - // Restart the updates. - startInterval(); - } - } - ); + updateVisualConsole(e.data.linkedLayoutId, updateInterval); } }); - // Start an interval to update the Visual Console. - startInterval(); + if (updateInterval != null && updateInterval > 0) { + // Start an interval to update the Visual Console. + updateVisualConsole(props.id, updateInterval, updateInterval); + } } catch (error) { console.log("[ERROR]", "[VISUAL-CONSOLE-CLIENT]", error.message); } - return visualConsole; + return { + visualConsole: visualConsole, + changeUpdateInterval: function(updateInterval) { + if (updateInterval != null && updateInterval > 0) { + updateVisualConsole( + visualConsole.props.id, + updateInterval, + updateInterval + ); + } else { + // Update interval disabled. Cancel possible pending tasks. + asyncTaskManager.cancel("visual-console"); + asyncTaskManager.cancel("visual-console-start"); + } + } + }; } /** diff --git a/pandora_console/include/styles/discovery.css b/pandora_console/include/styles/discovery.css index 28d4456a55..6df04ae736 100644 --- a/pandora_console/include/styles/discovery.css +++ b/pandora_console/include/styles/discovery.css @@ -230,8 +230,8 @@ li > input[type="password"], height: 100px; max-height: 100px; max-width: 100%; - -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */ - -moz-box-sizing: border-box; /* Firefox, other Gecko */ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; box-sizing: border-box; resize: none; } diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index ca2cdb51e7..f5bd560d69 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -70,13 +70,13 @@ float: right; } .ui-dialog .ui-dialog-buttonpane button { - margin: 0.5em 1em 0.5em 0 !important; - cursor: pointer !important; - background: white !important; - background-color: white !important; - border: 1px solid #82b92e !important; - height: 30px !important; - width: 90px !important; + margin: 0.5em 1em 0.5em 0; + cursor: pointer; + background: white; + background-color: white; + border: 1px solid #82b92e; + height: 30px; + width: 90px; } .ui-widget-header .ui-icon { background-image: url(../images/ui-icons_444444_256x240.png) !important; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 816b9a7ae9..99e91c98fe 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -4586,14 +4586,14 @@ div#dialog_messages table th:last-child { } .notification-item:hover { border: #ccc solid 1px; + text-decoration: none; } .notification-item > * { padding-left: 15px; pointer-events: none; } - -.notification-item:hover { - text-decoration: none; +.notification-item > img { + width: 75px; } .notification-info { diff --git a/pandora_console/include/styles/register.css b/pandora_console/include/styles/register.css new file mode 100644 index 0000000000..d2589a3f01 --- /dev/null +++ b/pandora_console/include/styles/register.css @@ -0,0 +1,57 @@ +input[type="submit"].submit-cancel, +button.submit-cancel { + color: #fb4444 !important; + border: 1px solid #fb4444 !important; + background: #fff !important; + padding: 5px; + font-size: 1.3em; + margin: 0.5em 1em 0.5em 0 !important; + cursor: pointer !important; + text-align: center !important; + height: 30px !important; + width: 90px !important; +} + +input[type="submit"].submit-cancel:hover, +button.submit-cancel:hover { + color: #fff !important; + background: #fb4444 !important; +} + +input[type="submit"].submit-next, +button.submit-next, +input[type="button"].submit-next { + color: #82b92e !important; + border: 1px solid #82b92e !important; + background: #fff !important; + padding: 5px; + font-size: 1.3em; + margin: 0.5em 1em 0.5em 0 !important; + cursor: pointer !important; + text-align: center !important; + height: 30px !important; +} + +input[type="submit"].submit-next:hover, +button.submit-next:hover, +input[type="button"].submit-next:hover { + color: #fff !important; + background: #82b92e !important; +} + +div.submit_buttons_container { + position: absolute; + margin: 10px auto 0px; + bottom: 0px; + width: 90%; + position: relative; + clear: both; + height: 4em; +} + +.license_text { + width: 95%; + overflow-y: auto; + text-align: justify; + margin: 1em auto; +} diff --git a/pandora_console/include/visual-console-client/vc.main.css b/pandora_console/include/visual-console-client/vc.main.css index 24d65c7fdc..20f5a1da7c 100644 --- a/pandora_console/include/visual-console-client/vc.main.css +++ b/pandora_console/include/visual-console-client/vc.main.css @@ -13,16 +13,16 @@ display: flex; -webkit-box-orient: initial; -webkit-box-direction: initial; - -ms-flex-direction: initial; - flex-direction: initial; + -ms-flex-direction: initial; + flex-direction: initial; justify-items: center; -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + -ms-flex-align: center; + align-items: center; -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; } @font-face { @@ -38,17 +38,17 @@ display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; + -ms-flex-pack: center; + justify-content: center; justify-items: center; -ms-flex-line-pack: center; - align-content: center; + align-content: center; -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; + -ms-flex-align: center; + align-items: center; } .visual-console-item .digital-clock > span { @@ -78,17 +78,18 @@ .visual-console-item .analogic-clock .hour-hand { -webkit-animation: rotate-hour 43200s infinite linear; - animation: rotate-hour 43200s infinite linear; + animation: rotate-hour 43200s infinite linear; } .visual-console-item .analogic-clock .minute-hand { -webkit-animation: rotate-minute 3600s infinite linear; - animation: rotate-minute 3600s infinite linear; + animation: rotate-minute 3600s infinite linear; } .visual-console-item .analogic-clock .second-hand { -webkit-animation: rotate-second 60s infinite linear; - animation: rotate-second 60s infinite linear; + animation: rotate-second 60s infinite linear; } -/*# sourceMappingURL=vc.main.css.map*/ + +/*# sourceMappingURL=vc.main.css.map*/ \ No newline at end of file diff --git a/pandora_console/include/visual-console-client/vc.main.css.map b/pandora_console/include/visual-console-client/vc.main.css.map index d629149079..2b723c93b4 100644 --- a/pandora_console/include/visual-console-client/vc.main.css.map +++ b/pandora_console/include/visual-console-client/vc.main.css.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///main.css","webpack:///styles.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,4BAA4B;EAC5B,wBAAwB;AAC1B;;AAEA;EACE,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,2BAAuB;EAAvB,8BAAuB;MAAvB,2BAAuB;UAAvB,uBAAuB;EACvB,qBAAqB;EACrB,yBAAmB;MAAnB,sBAAmB;UAAnB,mBAAmB;EACnB,yBAAiB;KAAjB,sBAAiB;MAAjB,qBAAiB;UAAjB,iBAAiB;AACnB;;ACdA;EACE,wBAAwB;EACxB,0BAA2B;AAC7B;;AAEA,kBAAkB;;AAElB;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;MAAtB,0BAAsB;UAAtB,sBAAsB;EACtB,wBAAuB;MAAvB,qBAAuB;UAAvB,uBAAuB;EACvB,qBAAqB;EACrB,0BAAqB;MAArB,qBAAqB;EACrB,yBAAmB;MAAnB,sBAAmB;UAAnB,mBAAmB;AACrB;;AAEA;EACE,6DAA6D;EAC7D,eAAe;;EAEf,0BAA0B;EAC1B,mCAAmC;EACnC,kCAAkC;EAClC,kCAAkC;EAClC,wCAAwC;AAC1C;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA,iBAAiB;;AAEjB;EACE,kBAAkB;AACpB;;AAEA;EACE,qDAA6C;UAA7C,6CAA6C;AAC/C;;AAEA;EACE,sDAA8C;UAA9C,8CAA8C;AAChD;;AAEA;EACE,oDAA4C;UAA5C,4CAA4C;AAC9C","file":"vc.main.css","sourcesContent":["#visual-console-container {\n margin: 0px auto;\n position: relative;\n background-repeat: no-repeat;\n background-size: contain;\n}\n\n.visual-console-item {\n position: absolute;\n display: flex;\n flex-direction: initial;\n justify-items: center;\n align-items: center;\n user-select: text;\n}\n","@font-face {\n font-family: Alarm Clock;\n src: url(./alarm-clock.ttf);\n}\n\n/* Digital clock */\n\n.visual-console-item .digital-clock {\n display: flex;\n flex-direction: column;\n justify-content: center;\n justify-items: center;\n align-content: center;\n align-items: center;\n}\n\n.visual-console-item .digital-clock > span {\n font-family: \"Alarm Clock\", \"Courier New\", Courier, monospace;\n font-size: 50px;\n\n /* To improve legibility */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n text-shadow: rgba(0, 0, 0, 0.01) 0 0 1px;\n}\n\n.visual-console-item .digital-clock > span.date {\n font-size: 25px;\n}\n\n.visual-console-item .digital-clock > span.timezone {\n font-size: 25px;\n}\n\n/* Analog clock */\n\n.visual-console-item .analogic-clock {\n text-align: center;\n}\n\n.visual-console-item .analogic-clock .hour-hand {\n animation: rotate-hour 43200s infinite linear;\n}\n\n.visual-console-item .analogic-clock .minute-hand {\n animation: rotate-minute 3600s infinite linear;\n}\n\n.visual-console-item .analogic-clock .second-hand {\n animation: rotate-second 60s infinite linear;\n}\n"],"sourceRoot":""} +{"version":3,"sources":["webpack:///main.css","webpack:///styles.css"],"names":[],"mappings":"AAAA;EACE,gBAAgB;EAChB,kBAAkB;EAClB,4BAA4B;EAC5B,0BAA0B;EAC1B,2BAA2B;AAC7B;;AAEA;EACE,kBAAkB;EAClB,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,2BAAuB;EAAvB,8BAAuB;MAAvB,2BAAuB;UAAvB,uBAAuB;EACvB,qBAAqB;EACrB,yBAAmB;MAAnB,sBAAmB;UAAnB,mBAAmB;EACnB,yBAAiB;KAAjB,sBAAiB;MAAjB,qBAAiB;UAAjB,iBAAiB;AACnB;;ACfA;EACE,wBAAwB;EACxB,0BAA2B;AAC7B;;AAEA,kBAAkB;;AAElB;EACE,oBAAa;EAAb,oBAAa;EAAb,aAAa;EACb,4BAAsB;EAAtB,6BAAsB;MAAtB,0BAAsB;UAAtB,sBAAsB;EACtB,wBAAuB;MAAvB,qBAAuB;UAAvB,uBAAuB;EACvB,qBAAqB;EACrB,0BAAqB;MAArB,qBAAqB;EACrB,yBAAmB;MAAnB,sBAAmB;UAAnB,mBAAmB;AACrB;;AAEA;EACE,6DAA6D;EAC7D,eAAe;;EAEf,0BAA0B;EAC1B,mCAAmC;EACnC,kCAAkC;EAClC,kCAAkC;EAClC,wCAAwC;AAC1C;;AAEA;EACE,eAAe;AACjB;;AAEA;EACE,eAAe;AACjB;;AAEA,iBAAiB;;AAEjB;EACE,kBAAkB;AACpB;;AAEA;EACE,qDAA6C;UAA7C,6CAA6C;AAC/C;;AAEA;EACE,sDAA8C;UAA9C,8CAA8C;AAChD;;AAEA;EACE,oDAA4C;UAA5C,4CAA4C;AAC9C","file":"vc.main.css","sourcesContent":["#visual-console-container {\n margin: 0px auto;\n position: relative;\n background-repeat: no-repeat;\n background-size: 100% 100%;\n background-position: center;\n}\n\n.visual-console-item {\n position: absolute;\n display: flex;\n flex-direction: initial;\n justify-items: center;\n align-items: center;\n user-select: text;\n}\n","@font-face {\n font-family: Alarm Clock;\n src: url(./alarm-clock.ttf);\n}\n\n/* Digital clock */\n\n.visual-console-item .digital-clock {\n display: flex;\n flex-direction: column;\n justify-content: center;\n justify-items: center;\n align-content: center;\n align-items: center;\n}\n\n.visual-console-item .digital-clock > span {\n font-family: \"Alarm Clock\", \"Courier New\", Courier, monospace;\n font-size: 50px;\n\n /* To improve legibility */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n text-rendering: optimizeLegibility;\n text-shadow: rgba(0, 0, 0, 0.01) 0 0 1px;\n}\n\n.visual-console-item .digital-clock > span.date {\n font-size: 25px;\n}\n\n.visual-console-item .digital-clock > span.timezone {\n font-size: 25px;\n}\n\n/* Analog clock */\n\n.visual-console-item .analogic-clock {\n text-align: center;\n}\n\n.visual-console-item .analogic-clock .hour-hand {\n animation: rotate-hour 43200s infinite linear;\n}\n\n.visual-console-item .analogic-clock .minute-hand {\n animation: rotate-minute 3600s infinite linear;\n}\n\n.visual-console-item .analogic-clock .second-hand {\n animation: rotate-second 60s infinite linear;\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/pandora_console/include/visual-console-client/vc.main.min.js b/pandora_console/include/visual-console-client/vc.main.min.js index 56ebf5c0bf..9f2f23a09a 100644 --- a/pandora_console/include/visual-console-client/vc.main.min.js +++ b/pandora_console/include/visual-console-client/vc.main.min.js @@ -1,2 +1,2 @@ -!function(t){var e={};function n(i){if(e[i])return e[i].exports;var r=e[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=t,n.c=e,n.d=function(t,e,i){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var r in t)n.d(i,r,function(e){return t[e]}.bind(null,r));return i},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=9)}([function(t,e,n){"use strict";n.d(e,"i",function(){return r}),n.d(e,"h",function(){return s}),n.d(e,"n",function(){return o}),n.d(e,"f",function(){return a}),n.d(e,"g",function(){return c}),n.d(e,"j",function(){return u}),n.d(e,"m",function(){return h}),n.d(e,"e",function(){return p}),n.d(e,"d",function(){return _}),n.d(e,"k",function(){return f}),n.d(e,"a",function(){return d}),n.d(e,"b",function(){return y}),n.d(e,"c",function(){return m}),n.d(e,"l",function(){return b});var i=function(){return(i=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&!isNaN(parseInt(t))?parseInt(t):e}function s(t,e){return"number"==typeof t?t:"string"==typeof t&&t.length>0&&!isNaN(parseFloat(t))?parseFloat(t):e}function o(t){return null==t||0===t.length}function a(t,e){return"string"==typeof t&&t.length>0?t:e}function c(t){return"boolean"==typeof t?t:"number"==typeof t?t>0:"string"==typeof t&&("1"===t||"true"===t)}function l(t,e,n){void 0===n&&(n=" "),"number"==typeof t&&(t=""+t),"number"==typeof n&&(n=""+n);var i=e-t.length;if(0===i)return t;if(i<0)return t.substr(Math.abs(i));if(i===n.length)return""+n+t;if(i0){var n=document.createElement("table"),i=document.createElement("tr"),r=document.createElement("tr"),s=document.createElement("tr"),o=document.createElement("td");switch(o.innerHTML=e,i.append(o),n.append(r,i,s),n.style.textAlign="center",this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}t.append(n)}return t},t.prototype.getLabelWithMacrosReplaced=function(){var t=this.props;return Object(i.l)([{macro:"_date_",value:Object(i.b)(new Date)},{macro:"_time_",value:Object(i.c)(new Date)},{macro:"_agent_",value:null!=t.agentAlias?t.agentAlias:""},{macro:"_agentdescription_",value:null!=t.agentDescription?t.agentDescription:""},{macro:"_address_",value:null!=t.agentAddress?t.agentAddress:""},{macro:"_module_",value:null!=t.moduleName?t.moduleName:""},{macro:"_moduledescription_",value:null!=t.moduleDescription?t.moduleDescription:""}],this.props.label||"")},t.prototype.updateDomElement=function(t){t.innerHTML=this.createDomElement().innerHTML},Object.defineProperty(t.prototype,"props",{get:function(){return s({},this.itemProps)},set:function(t){var e=this.props;this.itemProps=t,this.shouldBeUpdated(e,t)&&this.render(e)},enumerable:!0,configurable:!0}),t.prototype.shouldBeUpdated=function(t,e){return t!==e},t.prototype.render=function(t){void 0===t&&(t=null),this.updateDomElement(this.childElementRef),t&&!this.positionChanged(t,this.props)||this.moveElement(this.props.x,this.props.y),t&&!this.sizeChanged(t,this.props)||this.resizeElement(this.props.width,this.props.height);var e=this.labelElementRef.innerHTML,n=this.createLabelDomElement().innerHTML;if(e!==n&&(this.labelElementRef.innerHTML=n),t&&t.labelPosition===this.props.labelPosition||this.changeLabelPosition(this.props.labelPosition),t&&(t.isLinkEnabled!==this.props.isLinkEnabled||this.props.isLinkEnabled&&t.link!==this.props.link)){var i=this.createContainerDomElement();i.innerHTML=this.elementRef.innerHTML,null!==this.elementRef.parentNode&&this.elementRef.parentNode.replaceChild(i,this.elementRef),this.elementRef=i}},t.prototype.remove=function(){this.removeEventManager.emit({data:this.props}),this.disposables.forEach(function(t){try{t.dispose()}catch(t){}}),this.elementRef.remove()},t.prototype.positionChanged=function(t,e){return t.x!==e.x||t.y!==e.y},t.prototype.changeLabelPosition=function(t){switch(t){case"up":this.elementRef.style.flexDirection="column-reverse";break;case"left":this.elementRef.style.flexDirection="row-reverse";break;case"right":this.elementRef.style.flexDirection="row";break;case"down":default:this.elementRef.style.flexDirection="column"}var e=this.labelElementRef.getElementsByTagName("table"),n=e.length>0?e.item(0):null;if(n)switch(this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}},t.prototype.moveElement=function(t,e){this.elementRef.style.left=t+"px",this.elementRef.style.top=e+"px"},t.prototype.move=function(t,e){this.moveElement(t,e),this.itemProps=s({},this.props,{x:t,y:e})},t.prototype.sizeChanged=function(t,e){return t.width!==e.width||t.height!==e.height},t.prototype.resizeElement=function(t,e){this.childElementRef.style.width=t>0?t+"px":null,this.childElementRef.style.height=e>0?e+"px":null},t.prototype.resize=function(t,e){this.resizeElement(t,e),this.itemProps=s({},this.props,{width:t,height:e})},t.prototype.onClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.onRemove=function(t){var e=this.removeEventManager.on(t);return this.disposables.push(e),e},t}();e.a=c},function(t,e,n){"use strict";var i=function(){return function(){var t=this;this.listeners=[],this.listenersOncer=[],this.on=function(e){return t.listeners.push(e),{dispose:function(){return t.off(e)}}},this.once=function(e){t.listenersOncer.push(e)},this.off=function(e){var n=t.listeners.indexOf(e);n>-1&&t.listeners.splice(n,1)},this.emit=function(e){t.listeners.forEach(function(t){return t(e)}),t.listenersOncer.forEach(function(t){return t(e)}),t.listenersOncer=[]},this.pipe=function(e){return t.on(function(t){return e.emit(t)})}}}();e.a=i},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"b",function(){return eventsHistoryPropsDecoder});var _lib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_Item__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(1),__extends=(extendStatics=function(t,e){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}extendStatics(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),extendStatics,__assign=function(){return(__assign=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var m=document.createElementNS(t,"text");m.setAttribute("text-anchor","middle"),m.setAttribute("font-size","8"),m.setAttribute("transform","translate(30 50) rotate(90)"),m.setAttribute("fill",i),m.textContent=y,f.append(m)}var b=document.createElementNS(t,"g");b.setAttribute("class","marks");var v=document.createElementNS(t,"g");v.setAttribute("class","mark"),v.setAttribute("transform","translate(50 50)");var x=document.createElementNS(t,"line");x.setAttribute("x1","36"),x.setAttribute("y1","0"),x.setAttribute("x2","46"),x.setAttribute("y2","0"),x.setAttribute("stroke",i),x.setAttribute("stroke-width","5");var g=document.createElementNS(t,"line");g.setAttribute("x1","36"),g.setAttribute("y1","0"),g.setAttribute("x2","46"),g.setAttribute("y2","0"),g.setAttribute("stroke",e),g.setAttribute("stroke-width","1"),v.append(x,g),b.append(v);for(var E=1;E<60;E++){var O=document.createElementNS(t,"line");O.setAttribute("y1","0"),O.setAttribute("y2","0"),O.setAttribute("stroke",i),O.setAttribute("transform","translate(50 50) rotate("+6*E+")"),E%5==0?(O.setAttribute("x1","38"),O.setAttribute("x2","46"),O.setAttribute("stroke-width",E%15==0?"2":"1")):(O.setAttribute("x1","42"),O.setAttribute("x2","46"),O.setAttribute("stroke-width","0.5")),b.append(O)}var w=document.createElementNS(t,"g");w.setAttribute("class","hour-hand"),w.setAttribute("transform","translate(50 50)");var T=document.createElementNS(t,"line");T.setAttribute("class","hour-hand-a"),T.setAttribute("x1","0"),T.setAttribute("y1","0"),T.setAttribute("x2","30"),T.setAttribute("y2","0"),T.setAttribute("stroke",o),T.setAttribute("stroke-width","4"),T.setAttribute("stroke-linecap","round");var A=document.createElementNS(t,"line");A.setAttribute("class","hour-hand-b"),A.setAttribute("x1","0"),A.setAttribute("y1","0"),A.setAttribute("x2","29.9"),A.setAttribute("y2","0"),A.setAttribute("stroke",s),A.setAttribute("stroke-width","3.1"),A.setAttribute("stroke-linecap","round"),w.append(T,A);var k=document.createElementNS(t,"g");k.setAttribute("class","minute-hand"),k.setAttribute("transform","translate(50 50)");var P=document.createElementNS(t,"line");P.setAttribute("class","minute-hand-a"),P.setAttribute("x1","0"),P.setAttribute("y1","0"),P.setAttribute("x2","40"),P.setAttribute("y2","0"),P.setAttribute("stroke",o),P.setAttribute("stroke-width","2"),P.setAttribute("stroke-linecap","round");var j=document.createElementNS(t,"line");j.setAttribute("class","minute-hand-b"),j.setAttribute("x1","0"),j.setAttribute("y1","0"),j.setAttribute("x2","39.9"),j.setAttribute("y2","0"),j.setAttribute("stroke",s),j.setAttribute("stroke-width","1.5"),j.setAttribute("stroke-linecap","round");var M=document.createElementNS(t,"circle");M.setAttribute("r","3"),M.setAttribute("fill",s),k.append(P,j,M);var S=document.createElementNS(t,"g");S.setAttribute("class","second-hand"),S.setAttribute("transform","translate(50 50)");var I=document.createElementNS(t,"line");I.setAttribute("x1","0"),I.setAttribute("y1","0"),I.setAttribute("x2","46"),I.setAttribute("y2","0"),I.setAttribute("stroke",a),I.setAttribute("stroke-width","1"),I.setAttribute("stroke-linecap","round");var N=document.createElementNS(t,"circle");N.setAttribute("r","2"),N.setAttribute("fill",a),S.append(I,N);var D=document.createElementNS(t,"circle");D.setAttribute("cx","50"),D.setAttribute("cy","50"),D.setAttribute("r","0.3"),D.setAttribute("fill",s);var L=this.getOriginDate(),R=L.getSeconds(),C=L.getMinutes(),B=6*R,z=6*C+R/60*6,W=30*L.getHours()+C/60*30;if(w.setAttribute("transform","translate(50 50) rotate("+W+")"),k.setAttribute("transform","translate(50 50) rotate("+z+")"),S.setAttribute("transform","translate(50 50) rotate("+B+")"),_.append(f,b,w,k,S,D),_.setAttribute("transform","rotate(-90)"),p.innerHTML="\n \n ",p.append(_),"datetime"===this.props.clockFormat){var H=document.createElement("span");H.className="date",H.textContent=Object(r.b)(L,"default"),H.style.fontSize=h+"px",this.props.color&&(H.style.color=this.props.color),p.append(H)}return p},e.prototype.createDigitalClock=function(){var t=document.createElement("div");t.className="digital-clock";var e=this.getElementSize().width,n=6/this.props.clockTimezone.length,i=20*e/100,s=10*e/100,o=Math.min(20*n*e/100,e/100*10),a=this.getOriginDate();if("datetime"===this.props.clockFormat){var c=document.createElement("span");c.className="date",c.textContent=Object(r.b)(a,"default"),c.style.fontSize=s+"px",this.props.color&&(c.style.color=this.props.color),t.append(c)}var l=document.createElement("span");l.className="time",l.textContent=Object(r.c)(a),l.style.fontSize=i+"px",this.props.color&&(l.style.color=this.props.color),t.append(l);var u=this.getHumanTimezone();if(u.length>0){var h=document.createElement("span");h.className="timezone",h.textContent=u,h.style.fontSize=o+"px",this.props.color&&(h.style.color=this.props.color),t.append(h)}return t},e.prototype.getOriginDate=function(t){void 0===t&&(t=null);var e=t||new Date,n=1e3*this.props.clockTimezoneOffset,i=60*e.getTimezoneOffset()*1e3,r=e.getTime()+n+i;return new Date(r)},e.prototype.getHumanTimezone=function(t){void 0===t&&(t=this.props.clockTimezone);var e=t.split("/")[1];return(void 0===e?"":e).replace("_"," ")},e.prototype.getElementSize=function(t,e){switch(void 0===t&&(t=this.props.width),void 0===e&&(e=this.props.height),this.props.clockType){case"analogic":var n=100;return t>0&&e>0?n=Math.min(t,e):t>0?n=t:e>0&&(n=e),{width:n,height:n};case"digital":return t>0&&e>0?e=t/20?e=t/2:e>0?t=2*e:(t=100,e=50),{width:t,height:e};default:throw new Error("invalid clock type.")}},e.TICK_INTERVAL=1e3,e}(s.a),M=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),S=function(){return(S=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){t.style.borderStyle="solid";var e=Math.min(this.props.width,this.props.height)/2,n=Math.min(this.props.borderWidth,e);t.style.borderWidth=n+"px",this.props.borderColor&&(t.style.borderColor=this.props.borderColor)}return t},e}(s.a),D=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),L=function(){return(L=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&(n=Object(r.l)([{macro:/\(?_VALUE_\)?/i,value:n}],i)),t.innerHTML=n}return t},e.prototype.createLabelDomElement=function(){var t=document.createElement("div");return t.className="visual-console-item-label",t},e}(s.a),X=n(3),Z=Math.PI,Q=2*Z,J=Q-1e-6;function $(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function tt(){return new $}$.prototype=tt.prototype={constructor:$,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,n,i){this._+="Q"+ +t+","+ +e+","+(this._x1=+n)+","+(this._y1=+i)},bezierCurveTo:function(t,e,n,i,r,s){this._+="C"+ +t+","+ +e+","+ +n+","+ +i+","+(this._x1=+r)+","+(this._y1=+s)},arcTo:function(t,e,n,i,r){t=+t,e=+e,n=+n,i=+i,r=+r;var s=this._x1,o=this._y1,a=n-t,c=i-e,l=s-t,u=o-e,h=l*l+u*u;if(r<0)throw new Error("negative radius: "+r);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(h>1e-6)if(Math.abs(u*a-c*l)>1e-6&&r){var p=n-s,_=i-o,f=a*a+c*c,d=p*p+_*_,y=Math.sqrt(f),m=Math.sqrt(h),b=r*Math.tan((Z-Math.acos((f+h-d)/(2*y*m)))/2),v=b/m,x=b/y;Math.abs(v-1)>1e-6&&(this._+="L"+(t+v*l)+","+(e+v*u)),this._+="A"+r+","+r+",0,0,"+ +(u*p>l*_)+","+(this._x1=t+x*a)+","+(this._y1=e+x*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e);else;},arc:function(t,e,n,i,r,s){t=+t,e=+e;var o=(n=+n)*Math.cos(i),a=n*Math.sin(i),c=t+o,l=e+a,u=1^s,h=s?i-r:r-i;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+l:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-l)>1e-6)&&(this._+="L"+c+","+l),n&&(h<0&&(h=h%Q+Q),h>J?this._+="A"+n+","+n+",0,1,"+u+","+(t-o)+","+(e-a)+"A"+n+","+n+",0,1,"+u+","+(this._x1=c)+","+(this._y1=l):h>1e-6&&(this._+="A"+n+","+n+",0,"+ +(h>=Z)+","+u+","+(this._x1=t+n*Math.cos(r))+","+(this._y1=e+n*Math.sin(r))))},rect:function(t,e,n,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +i+"h"+-n+"Z"},toString:function(){return this._}};var et=tt,nt=function(t){return function(){return t}},it=Math.abs,rt=Math.atan2,st=Math.cos,ot=Math.max,at=Math.min,ct=Math.sin,lt=Math.sqrt,ut=1e-12,ht=Math.PI,pt=ht/2,_t=2*ht;function ft(t){return t>=1?pt:t<=-1?-pt:Math.asin(t)}function dt(t){return t.innerRadius}function yt(t){return t.outerRadius}function mt(t){return t.startAngle}function bt(t){return t.endAngle}function vt(t){return t&&t.padAngle}function xt(t,e,n,i,r,s,o){var a=t-n,c=e-i,l=(o?s:-s)/lt(a*a+c*c),u=l*c,h=-l*a,p=t+u,_=e+h,f=n+u,d=i+h,y=(p+f)/2,m=(_+d)/2,b=f-p,v=d-_,x=b*b+v*v,g=r-s,E=p*d-f*_,O=(v<0?-1:1)*lt(ot(0,g*g*x-E*E)),w=(E*v-b*O)/x,T=(-E*b-v*O)/x,A=(E*v+b*O)/x,k=(-E*b+v*O)/x,P=w-y,j=T-m,M=A-y,S=k-m;return P*P+j*j>M*M+S*S&&(w=A,T=k),{cx:w,cy:T,x01:-u,y01:-h,x11:w*(r/g-1),y11:T*(r/g-1)}}var gt=function(){var t=dt,e=yt,n=nt(0),i=null,r=mt,s=bt,o=vt,a=null;function c(){var c,l,u,h=+t.apply(this,arguments),p=+e.apply(this,arguments),_=r.apply(this,arguments)-pt,f=s.apply(this,arguments)-pt,d=it(f-_),y=f>_;if(a||(a=c=et()),put)if(d>_t-ut)a.moveTo(p*st(_),p*ct(_)),a.arc(0,0,p,_,f,!y),h>ut&&(a.moveTo(h*st(f),h*ct(f)),a.arc(0,0,h,f,_,y));else{var m,b,v=_,x=f,g=_,E=f,O=d,w=d,T=o.apply(this,arguments)/2,A=T>ut&&(i?+i.apply(this,arguments):lt(h*h+p*p)),k=at(it(p-h)/2,+n.apply(this,arguments)),P=k,j=k;if(A>ut){var M=ft(A/h*ct(T)),S=ft(A/p*ct(T));(O-=2*M)>ut?(g+=M*=y?1:-1,E-=M):(O=0,g=E=(_+f)/2),(w-=2*S)>ut?(v+=S*=y?1:-1,x-=S):(w=0,v=x=(_+f)/2)}var I=p*st(v),N=p*ct(v),D=h*st(E),L=h*ct(E);if(k>ut){var R,C=p*st(x),B=p*ct(x),z=h*st(g),W=h*ct(g);if(d1?0:u<-1?ht:Math.acos(u))/2),V=lt(R[0]*R[0]+R[1]*R[1]);P=at(k,(h-V)/(q-1)),j=at(k,(p-V)/(q+1))}}w>ut?j>ut?(m=xt(z,W,I,N,p,j,y),b=xt(C,B,D,L,p,j,y),a.moveTo(m.cx+m.x01,m.cy+m.y01),jut&&O>ut?P>ut?(m=xt(D,L,C,B,h,-P,y),b=xt(I,N,z,W,h,-P,y),a.lineTo(m.cx+m.x01,m.cy+m.y01),P0)for(var i,r=t[0],s=e[0],o=t[n]-r,a=e[n]-s,c=-1;++c<=n;)i=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(r+i*o),this._beta*e[c]+(1-this._beta)*(s+i*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};(function t(e){function n(t){return 1===e?new jt(t):new It(t,e)}return n.beta=function(e){return t(+e)},n})(.85);function Nt(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Dt(t,e){this._context=t,this._k=(1-e)/6}Dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Nt(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Nt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Dt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Lt(t,e){this._context=t,this._k=(1-e)/6}Lt.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Nt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Lt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Rt(t,e){this._context=t,this._k=(1-e)/6}Rt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Nt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Rt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Ct(t,e,n){var i=t._x1,r=t._y1,s=t._x2,o=t._y2;if(t._l01_a>ut){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,r=(r*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>ut){var l=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,u=3*t._l23_a*(t._l23_a+t._l12_a);s=(s*l+t._x1*t._l23_2a-e*t._l12_2a)/u,o=(o*l+t._y1*t._l23_2a-n*t._l12_2a)/u}t._context.bezierCurveTo(i,r,s,o,t._x2,t._y2)}function Bt(t,e){this._context=t,this._alpha=e}Bt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Bt(t,e):new Dt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function zt(t,e){this._context=t,this._alpha=e}zt.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new zt(t,e):new Lt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Wt(t,e){this._context=t,this._alpha=e}Wt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Wt(t,e):new Rt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Ht(t){this._context=t}Ht.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};function Ut(t){return t<0?-1:1}function Kt(t,e,n){var i=t._x1-t._x0,r=e-t._x1,s=(t._y1-t._y0)/(i||r<0&&-0),o=(n-t._y1)/(r||i<0&&-0),a=(s*r+o*i)/(i+r);return(Ut(s)+Ut(o))*Math.min(Math.abs(s),Math.abs(o),.5*Math.abs(a))||0}function Gt(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function qt(t,e,n){var i=t._x0,r=t._y0,s=t._x1,o=t._y1,a=(s-i)/3;t._context.bezierCurveTo(i+a,r+a*e,s-a,o-a*n,s,o)}function Vt(t){this._context=t}function Ft(t){this._context=new Yt(t)}function Yt(t){this._context=t}function Xt(t){this._context=t}function Zt(t){var e,n,i=t.length-1,r=new Array(i),s=new Array(i),o=new Array(i);for(r[0]=0,s[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)r[e]=(o[e]-r[e+1])/s[e];for(s[i-1]=(t[i]+r[i-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var Jt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),$t=function(){return($t=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var p=document.createElementNS(ie,"tspan");p.setAttribute("x","0"),p.setAttribute("dy","1em"),p.textContent=""+t,p.style.fontSize="8pt";var _=document.createElementNS(ie,"tspan");_.setAttribute("x","0"),_.setAttribute("dy","1em"),_.textContent=""+this.props.unit,_.style.fontSize="8pt",h.append(p,_),h.setAttribute("transform","translate(50 33)")}else h.textContent=""+t,h.style.fontSize="8pt",h.setAttribute("transform","translate(50 50)");else h.textContent=n+"%",h.setAttribute("transform","translate(50 50)");r.append(h)}return i.append(r),i},e.prototype.getProgress=function(){var t=this.props.minValue||0,e=this.props.maxValue||100,n=this.props.value||100;return n<=t?0:n>=e?100:(n-t)/(e-t)*100},e}(s.a),se=n(2),oe=n(4),ae=n(5),ce=n(6),le=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),ue=function(){return(ue=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&!isNaN(parseInt(t))?parseInt(t):e}function s(t,e){return"number"==typeof t?t:"string"==typeof t&&t.length>0&&!isNaN(parseFloat(t))?parseFloat(t):e}function o(t){return null==t||0===t.length}function a(t,e){return"string"==typeof t&&t.length>0?t:e}function c(t){return"boolean"==typeof t?t:"number"==typeof t?t>0:"string"==typeof t&&("1"===t||"true"===t)}function l(t,e,n){void 0===n&&(n=" "),"number"==typeof t&&(t=""+t),"number"==typeof n&&(n=""+n);var i=e-t.length;if(0===i)return t;if(i<0)return t.substr(Math.abs(i));if(i===n.length)return""+n+t;if(i0){var n=document.createElement("table"),i=document.createElement("tr"),r=document.createElement("tr"),s=document.createElement("tr"),o=document.createElement("td");switch(o.innerHTML=e,i.append(o),n.append(r,i,s),n.style.textAlign="center",this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}t.append(n)}return t},t.prototype.getLabelWithMacrosReplaced=function(){var t=this.props;return Object(i.l)([{macro:"_date_",value:Object(i.b)(new Date)},{macro:"_time_",value:Object(i.c)(new Date)},{macro:"_agent_",value:null!=t.agentAlias?t.agentAlias:""},{macro:"_agentdescription_",value:null!=t.agentDescription?t.agentDescription:""},{macro:"_address_",value:null!=t.agentAddress?t.agentAddress:""},{macro:"_module_",value:null!=t.moduleName?t.moduleName:""},{macro:"_moduledescription_",value:null!=t.moduleDescription?t.moduleDescription:""}],this.props.label||"")},t.prototype.updateDomElement=function(t){t.innerHTML=this.createDomElement().innerHTML},Object.defineProperty(t.prototype,"props",{get:function(){return s({},this.itemProps)},set:function(t){var e=this.props;this.itemProps=t,this.shouldBeUpdated(e,t)&&this.render(e)},enumerable:!0,configurable:!0}),t.prototype.shouldBeUpdated=function(t,e){return t!==e},t.prototype.render=function(t){void 0===t&&(t=null),this.updateDomElement(this.childElementRef),t&&!this.positionChanged(t,this.props)||this.moveElement(this.props.x,this.props.y),t&&!this.sizeChanged(t,this.props)||this.resizeElement(this.props.width,this.props.height);var e=this.labelElementRef.innerHTML,n=this.createLabelDomElement().innerHTML;if(e!==n&&(this.labelElementRef.innerHTML=n),t&&t.labelPosition===this.props.labelPosition||this.changeLabelPosition(this.props.labelPosition),t&&(t.isLinkEnabled!==this.props.isLinkEnabled||this.props.isLinkEnabled&&t.link!==this.props.link)){var i=this.createContainerDomElement();i.innerHTML=this.elementRef.innerHTML;for(var r=this.elementRef.attributes,s=0;s0?e.item(0):null;if(n)switch(this.props.labelPosition){case"up":case"down":this.props.width>0&&(n.style.width=this.props.width+"px",n.style.height=null);break;case"left":case"right":this.props.height>0&&(n.style.width=null,n.style.height=this.props.height+"px")}},t.prototype.moveElement=function(t,e){this.elementRef.style.left=t+"px",this.elementRef.style.top=e+"px"},t.prototype.move=function(t,e){this.moveElement(t,e),this.itemProps=s({},this.props,{x:t,y:e})},t.prototype.sizeChanged=function(t,e){return t.width!==e.width||t.height!==e.height},t.prototype.resizeElement=function(t,e){this.childElementRef.style.width=t>0?t+"px":null,this.childElementRef.style.height=e>0?e+"px":null},t.prototype.resize=function(t,e){this.resizeElement(t,e),this.itemProps=s({},this.props,{width:t,height:e})},t.prototype.onClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.onRemove=function(t){var e=this.removeEventManager.on(t);return this.disposables.push(e),e},t}();e.a=c},function(t,e,n){"use strict";var i=function(){return function(){var t=this;this.listeners=[],this.listenersOncer=[],this.on=function(e){return t.listeners.push(e),{dispose:function(){return t.off(e)}}},this.once=function(e){t.listenersOncer.push(e)},this.off=function(e){var n=t.listeners.indexOf(e);n>-1&&t.listeners.splice(n,1)},this.emit=function(e){t.listeners.forEach(function(t){return t(e)}),t.listenersOncer.forEach(function(t){return t(e)}),t.listenersOncer=[]},this.pipe=function(e){return t.on(function(t){return e.emit(t)})}}}();e.a=i},function(module,__webpack_exports__,__webpack_require__){"use strict";__webpack_require__.d(__webpack_exports__,"b",function(){return eventsHistoryPropsDecoder});var _lib__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(0),_Item__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(1),__extends=(extendStatics=function(t,e){return(extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}extendStatics(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),extendStatics,__assign=function(){return(__assign=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var m=document.createElementNS(t,"text");m.setAttribute("text-anchor","middle"),m.setAttribute("font-size","8"),m.setAttribute("transform","translate(30 50) rotate(90)"),m.setAttribute("fill",i),m.textContent=y,f.append(m)}var b=document.createElementNS(t,"g");b.setAttribute("class","marks");var v=document.createElementNS(t,"g");v.setAttribute("class","mark"),v.setAttribute("transform","translate(50 50)");var g=document.createElementNS(t,"line");g.setAttribute("x1","36"),g.setAttribute("y1","0"),g.setAttribute("x2","46"),g.setAttribute("y2","0"),g.setAttribute("stroke",i),g.setAttribute("stroke-width","5");var x=document.createElementNS(t,"line");x.setAttribute("x1","36"),x.setAttribute("y1","0"),x.setAttribute("x2","46"),x.setAttribute("y2","0"),x.setAttribute("stroke",e),x.setAttribute("stroke-width","1"),v.append(g,x),b.append(v);for(var E=1;E<60;E++){var O=document.createElementNS(t,"line");O.setAttribute("y1","0"),O.setAttribute("y2","0"),O.setAttribute("stroke",i),O.setAttribute("transform","translate(50 50) rotate("+6*E+")"),E%5==0?(O.setAttribute("x1","38"),O.setAttribute("x2","46"),O.setAttribute("stroke-width",E%15==0?"2":"1")):(O.setAttribute("x1","42"),O.setAttribute("x2","46"),O.setAttribute("stroke-width","0.5")),b.append(O)}var w=document.createElementNS(t,"g");w.setAttribute("class","hour-hand"),w.setAttribute("transform","translate(50 50)");var T=document.createElementNS(t,"line");T.setAttribute("class","hour-hand-a"),T.setAttribute("x1","0"),T.setAttribute("y1","0"),T.setAttribute("x2","30"),T.setAttribute("y2","0"),T.setAttribute("stroke",o),T.setAttribute("stroke-width","4"),T.setAttribute("stroke-linecap","round");var A=document.createElementNS(t,"line");A.setAttribute("class","hour-hand-b"),A.setAttribute("x1","0"),A.setAttribute("y1","0"),A.setAttribute("x2","29.9"),A.setAttribute("y2","0"),A.setAttribute("stroke",s),A.setAttribute("stroke-width","3.1"),A.setAttribute("stroke-linecap","round"),w.append(T,A);var k=document.createElementNS(t,"g");k.setAttribute("class","minute-hand"),k.setAttribute("transform","translate(50 50)");var P=document.createElementNS(t,"line");P.setAttribute("class","minute-hand-a"),P.setAttribute("x1","0"),P.setAttribute("y1","0"),P.setAttribute("x2","40"),P.setAttribute("y2","0"),P.setAttribute("stroke",o),P.setAttribute("stroke-width","2"),P.setAttribute("stroke-linecap","round");var M=document.createElementNS(t,"line");M.setAttribute("class","minute-hand-b"),M.setAttribute("x1","0"),M.setAttribute("y1","0"),M.setAttribute("x2","39.9"),M.setAttribute("y2","0"),M.setAttribute("stroke",s),M.setAttribute("stroke-width","1.5"),M.setAttribute("stroke-linecap","round");var j=document.createElementNS(t,"circle");j.setAttribute("r","3"),j.setAttribute("fill",s),k.append(P,M,j);var S=document.createElementNS(t,"g");S.setAttribute("class","second-hand"),S.setAttribute("transform","translate(50 50)");var I=document.createElementNS(t,"line");I.setAttribute("x1","0"),I.setAttribute("y1","0"),I.setAttribute("x2","46"),I.setAttribute("y2","0"),I.setAttribute("stroke",a),I.setAttribute("stroke-width","1"),I.setAttribute("stroke-linecap","round");var N=document.createElementNS(t,"circle");N.setAttribute("r","2"),N.setAttribute("fill",a),S.append(I,N);var D=document.createElementNS(t,"circle");D.setAttribute("cx","50"),D.setAttribute("cy","50"),D.setAttribute("r","0.3"),D.setAttribute("fill",s);var L=this.getOriginDate(),R=L.getSeconds(),C=L.getMinutes(),B=6*R,z=6*C+R/60*6,W=30*L.getHours()+C/60*30;if(w.setAttribute("transform","translate(50 50) rotate("+W+")"),k.setAttribute("transform","translate(50 50) rotate("+z+")"),S.setAttribute("transform","translate(50 50) rotate("+B+")"),_.append(f,b,w,k,S,D),_.setAttribute("transform","rotate(-90)"),p.innerHTML="\n \n ",p.append(_),"datetime"===this.props.clockFormat){var H=document.createElement("span");H.className="date",H.textContent=Object(r.b)(L,"default"),H.style.fontSize=h+"px",this.props.color&&(H.style.color=this.props.color),p.append(H)}return p},e.prototype.createDigitalClock=function(){var t=document.createElement("div");t.className="digital-clock";var e=this.getElementSize().width,n=6/this.props.clockTimezone.length,i=20*e/100,s=10*e/100,o=Math.min(20*n*e/100,e/100*10),a=this.getOriginDate();if("datetime"===this.props.clockFormat){var c=document.createElement("span");c.className="date",c.textContent=Object(r.b)(a,"default"),c.style.fontSize=s+"px",this.props.color&&(c.style.color=this.props.color),t.append(c)}var l=document.createElement("span");l.className="time",l.textContent=Object(r.c)(a),l.style.fontSize=i+"px",this.props.color&&(l.style.color=this.props.color),t.append(l);var u=this.getHumanTimezone();if(u.length>0){var h=document.createElement("span");h.className="timezone",h.textContent=u,h.style.fontSize=o+"px",this.props.color&&(h.style.color=this.props.color),t.append(h)}return t},e.prototype.getOriginDate=function(t){void 0===t&&(t=null);var e=t||new Date,n=1e3*this.props.clockTimezoneOffset,i=60*e.getTimezoneOffset()*1e3,r=e.getTime()+n+i;return new Date(r)},e.prototype.getHumanTimezone=function(t){void 0===t&&(t=this.props.clockTimezone);var e=t.split("/")[1];return(void 0===e?"":e).replace("_"," ")},e.prototype.getElementSize=function(t,e){switch(void 0===t&&(t=this.props.width),void 0===e&&(e=this.props.height),this.props.clockType){case"analogic":var n=100;return t>0&&e>0?n=Math.min(t,e):t>0?n=t:e>0&&(n=e),{width:n,height:n};case"digital":return t>0&&e>0?e=t/20?e=t/2:e>0?t=2*e:(t=100,e=50),{width:t,height:e};default:throw new Error("invalid clock type.")}},e.TICK_INTERVAL=1e3,e}(s.a),j=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),S=function(){return(S=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){t.style.borderStyle="solid";var e=Math.min(this.props.width,this.props.height)/2,n=Math.min(this.props.borderWidth,e);t.style.borderWidth=n+"px",this.props.borderColor&&(t.style.borderColor=this.props.borderColor)}return t},e}(s.a),D=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),L=function(){return(L=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&(n=Object(r.l)([{macro:/\(?_VALUE_\)?/i,value:n}],i)),t.innerHTML=n}return t},e.prototype.createLabelDomElement=function(){var t=document.createElement("div");return t.className="visual-console-item-label",t},e}(s.a),X=n(3),Z=Math.PI,Q=2*Z,J=Q-1e-6;function $(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function tt(){return new $}$.prototype=tt.prototype={constructor:$,moveTo:function(t,e){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,e){this._+="L"+(this._x1=+t)+","+(this._y1=+e)},quadraticCurveTo:function(t,e,n,i){this._+="Q"+ +t+","+ +e+","+(this._x1=+n)+","+(this._y1=+i)},bezierCurveTo:function(t,e,n,i,r,s){this._+="C"+ +t+","+ +e+","+ +n+","+ +i+","+(this._x1=+r)+","+(this._y1=+s)},arcTo:function(t,e,n,i,r){t=+t,e=+e,n=+n,i=+i,r=+r;var s=this._x1,o=this._y1,a=n-t,c=i-e,l=s-t,u=o-e,h=l*l+u*u;if(r<0)throw new Error("negative radius: "+r);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=e);else if(h>1e-6)if(Math.abs(u*a-c*l)>1e-6&&r){var p=n-s,_=i-o,f=a*a+c*c,d=p*p+_*_,y=Math.sqrt(f),m=Math.sqrt(h),b=r*Math.tan((Z-Math.acos((f+h-d)/(2*y*m)))/2),v=b/m,g=b/y;Math.abs(v-1)>1e-6&&(this._+="L"+(t+v*l)+","+(e+v*u)),this._+="A"+r+","+r+",0,0,"+ +(u*p>l*_)+","+(this._x1=t+g*a)+","+(this._y1=e+g*c)}else this._+="L"+(this._x1=t)+","+(this._y1=e);else;},arc:function(t,e,n,i,r,s){t=+t,e=+e;var o=(n=+n)*Math.cos(i),a=n*Math.sin(i),c=t+o,l=e+a,u=1^s,h=s?i-r:r-i;if(n<0)throw new Error("negative radius: "+n);null===this._x1?this._+="M"+c+","+l:(Math.abs(this._x1-c)>1e-6||Math.abs(this._y1-l)>1e-6)&&(this._+="L"+c+","+l),n&&(h<0&&(h=h%Q+Q),h>J?this._+="A"+n+","+n+",0,1,"+u+","+(t-o)+","+(e-a)+"A"+n+","+n+",0,1,"+u+","+(this._x1=c)+","+(this._y1=l):h>1e-6&&(this._+="A"+n+","+n+",0,"+ +(h>=Z)+","+u+","+(this._x1=t+n*Math.cos(r))+","+(this._y1=e+n*Math.sin(r))))},rect:function(t,e,n,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+e)+"h"+ +n+"v"+ +i+"h"+-n+"Z"},toString:function(){return this._}};var et=tt,nt=function(t){return function(){return t}},it=Math.abs,rt=Math.atan2,st=Math.cos,ot=Math.max,at=Math.min,ct=Math.sin,lt=Math.sqrt,ut=1e-12,ht=Math.PI,pt=ht/2,_t=2*ht;function ft(t){return t>=1?pt:t<=-1?-pt:Math.asin(t)}function dt(t){return t.innerRadius}function yt(t){return t.outerRadius}function mt(t){return t.startAngle}function bt(t){return t.endAngle}function vt(t){return t&&t.padAngle}function gt(t,e,n,i,r,s,o){var a=t-n,c=e-i,l=(o?s:-s)/lt(a*a+c*c),u=l*c,h=-l*a,p=t+u,_=e+h,f=n+u,d=i+h,y=(p+f)/2,m=(_+d)/2,b=f-p,v=d-_,g=b*b+v*v,x=r-s,E=p*d-f*_,O=(v<0?-1:1)*lt(ot(0,x*x*g-E*E)),w=(E*v-b*O)/g,T=(-E*b-v*O)/g,A=(E*v+b*O)/g,k=(-E*b+v*O)/g,P=w-y,M=T-m,j=A-y,S=k-m;return P*P+M*M>j*j+S*S&&(w=A,T=k),{cx:w,cy:T,x01:-u,y01:-h,x11:w*(r/x-1),y11:T*(r/x-1)}}var xt=function(){var t=dt,e=yt,n=nt(0),i=null,r=mt,s=bt,o=vt,a=null;function c(){var c,l,u,h=+t.apply(this,arguments),p=+e.apply(this,arguments),_=r.apply(this,arguments)-pt,f=s.apply(this,arguments)-pt,d=it(f-_),y=f>_;if(a||(a=c=et()),put)if(d>_t-ut)a.moveTo(p*st(_),p*ct(_)),a.arc(0,0,p,_,f,!y),h>ut&&(a.moveTo(h*st(f),h*ct(f)),a.arc(0,0,h,f,_,y));else{var m,b,v=_,g=f,x=_,E=f,O=d,w=d,T=o.apply(this,arguments)/2,A=T>ut&&(i?+i.apply(this,arguments):lt(h*h+p*p)),k=at(it(p-h)/2,+n.apply(this,arguments)),P=k,M=k;if(A>ut){var j=ft(A/h*ct(T)),S=ft(A/p*ct(T));(O-=2*j)>ut?(x+=j*=y?1:-1,E-=j):(O=0,x=E=(_+f)/2),(w-=2*S)>ut?(v+=S*=y?1:-1,g-=S):(w=0,v=g=(_+f)/2)}var I=p*st(v),N=p*ct(v),D=h*st(E),L=h*ct(E);if(k>ut){var R,C=p*st(g),B=p*ct(g),z=h*st(x),W=h*ct(x);if(d1?0:u<-1?ht:Math.acos(u))/2),V=lt(R[0]*R[0]+R[1]*R[1]);P=at(k,(h-V)/(q-1)),M=at(k,(p-V)/(q+1))}}w>ut?M>ut?(m=gt(z,W,I,N,p,M,y),b=gt(C,B,D,L,p,M,y),a.moveTo(m.cx+m.x01,m.cy+m.y01),Mut&&O>ut?P>ut?(m=gt(D,L,C,B,h,-P,y),b=gt(I,N,z,W,h,-P,y),a.lineTo(m.cx+m.x01,m.cy+m.y01),P0)for(var i,r=t[0],s=e[0],o=t[n]-r,a=e[n]-s,c=-1;++c<=n;)i=c/n,this._basis.point(this._beta*t[c]+(1-this._beta)*(r+i*o),this._beta*e[c]+(1-this._beta)*(s+i*a));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};(function t(e){function n(t){return 1===e?new Mt(t):new It(t,e)}return n.beta=function(e){return t(+e)},n})(.85);function Nt(t,e,n){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-n),t._x2,t._y2)}function Dt(t,e){this._context=t,this._k=(1-e)/6}Dt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Nt(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Nt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Dt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Lt(t,e){this._context=t,this._k=(1-e)/6}Lt.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Nt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Lt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Rt(t,e){this._context=t,this._k=(1-e)/6}Rt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Nt(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return new Rt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function Ct(t,e,n){var i=t._x1,r=t._y1,s=t._x2,o=t._y2;if(t._l01_a>ut){var a=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,c=3*t._l01_a*(t._l01_a+t._l12_a);i=(i*a-t._x0*t._l12_2a+t._x2*t._l01_2a)/c,r=(r*a-t._y0*t._l12_2a+t._y2*t._l01_2a)/c}if(t._l23_a>ut){var l=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,u=3*t._l23_a*(t._l23_a+t._l12_a);s=(s*l+t._x1*t._l23_2a-e*t._l12_2a)/u,o=(o*l+t._y1*t._l23_2a-n*t._l12_2a)/u}t._context.bezierCurveTo(i,r,s,o,t._x2,t._y2)}function Bt(t,e){this._context=t,this._alpha=e}Bt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Bt(t,e):new Dt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function zt(t,e){this._context=t,this._alpha=e}zt.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new zt(t,e):new Lt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Wt(t,e){this._context=t,this._alpha=e}Wt.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var n=this._x2-t,i=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(n*n+i*i,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Ct(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};(function t(e){function n(t){return e?new Wt(t,e):new Rt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Ht(t){this._context=t}Ht.prototype={areaStart:kt,areaEnd:kt,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(t,e){t=+t,e=+e,this._point?this._context.lineTo(t,e):(this._point=1,this._context.moveTo(t,e))}};function Ut(t){return t<0?-1:1}function Kt(t,e,n){var i=t._x1-t._x0,r=e-t._x1,s=(t._y1-t._y0)/(i||r<0&&-0),o=(n-t._y1)/(r||i<0&&-0),a=(s*r+o*i)/(i+r);return(Ut(s)+Ut(o))*Math.min(Math.abs(s),Math.abs(o),.5*Math.abs(a))||0}function Gt(t,e){var n=t._x1-t._x0;return n?(3*(t._y1-t._y0)/n-e)/2:e}function qt(t,e,n){var i=t._x0,r=t._y0,s=t._x1,o=t._y1,a=(s-i)/3;t._context.bezierCurveTo(i+a,r+a*e,s-a,o-a*n,s,o)}function Vt(t){this._context=t}function Ft(t){this._context=new Yt(t)}function Yt(t){this._context=t}function Xt(t){this._context=t}function Zt(t){var e,n,i=t.length-1,r=new Array(i),s=new Array(i),o=new Array(i);for(r[0]=0,s[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)r[e]=(o[e]-r[e+1])/s[e];for(s[i-1]=(t[i]+r[i-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var n=this._x*(1-this._t)+t*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,e)}}this._x=t,this._y=e}};var Jt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),$t=function(){return($t=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var p=document.createElementNS(ie,"tspan");p.setAttribute("x","0"),p.setAttribute("dy","1em"),p.textContent=""+t,p.style.fontSize="8pt";var _=document.createElementNS(ie,"tspan");_.setAttribute("x","0"),_.setAttribute("dy","1em"),_.textContent=""+this.props.unit,_.style.fontSize="8pt",h.append(p,_),h.setAttribute("transform","translate(50 33)")}else h.textContent=""+t,h.style.fontSize="8pt",h.setAttribute("transform","translate(50 50)");else h.textContent=n+"%",h.setAttribute("transform","translate(50 50)");r.append(h)}return i.append(r),i},e.prototype.getProgress=function(){var t=this.props.minValue||0,e=this.props.maxValue||100,n=null==this.props.value?0:this.props.value;return n<=t?0:n>=e?100:Math.trunc((n-t)/(e-t)*100)},e}(s.a),se=n(2),oe=n(4),ae=n(5),ce=n(6),le=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function i(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),ue=function(){return(ue=Object.assign||function(t){for(var e,n=1,i=arguments.length;ne.id?1:-1})).forEach(function(t){try{var e=fe(t);i.elementsById[e.props.id]=e,i.elementIds.push(e.props.id),e.onClick(i.handleElementClick),e.onRemove(i.handleElementRemove),i.containerRef.append(e.elementRef)}catch(t){console.log("Error creating a new element:",t.message)}}),this.buildRelations()}return Object.defineProperty(t.prototype,"elements",{get:function(){var t=this;return this.elementIds.map(function(e){return t.elementsById[e]}).filter(function(t){return null!=t})},enumerable:!0,configurable:!0}),t.prototype.updateElements=function(t){var e=this,n=t.map(function(t){return t.id||null}).filter(function(t){return null!=t});this.elementIds.filter(function(t){return n.indexOf(t)<0}).forEach(function(t){null!=e.elementsById[t]&&(e.elementsById[t].remove(),delete e.elementsById[t])}),this.elementIds=n,t.forEach(function(t){if(t.id)if(null==e.elementsById[t.id])try{var n=fe(t);e.elementsById[n.props.id]=n,n.onClick(e.handleElementClick),n.onRemove(e.handleElementRemove),e.containerRef.append(n.elementRef)}catch(t){console.log("Error creating a new element:",t.message)}else try{e.elementsById[t.id].props=function(t){var e=Object(r.i)(t.type,null);if(null==e)throw new TypeError("missing item type.");switch(e){case 0:return l(t);case 1:return Object(ce.b)(t);case 2:case 6:case 7:case 8:return F(t);case 3:case 9:case 15:case 16:return ne(t);case 4:return H(t);case 5:return _(t);case 10:return he(t);case 11:return E(t);case 12:return I(t);case 13:return R(t);case 14:return Object(X.b)(t);case 17:return Object(oe.b)(t);case 18:return Object(ae.a)(t);case 19:return P(t);case 20:return m(t);default:throw new TypeError("decoder not found")}}(t)}catch(t){console.log("Error updating an element:",t.message)}}),this.buildRelations()},Object.defineProperty(t.prototype,"props",{get:function(){return _e({},this._props)},set:function(t){var e=this.props;this._props=t,this.render(e)},enumerable:!0,configurable:!0}),t.prototype.render=function(t){void 0===t&&(t=null),t?(t.backgroundURL!==this.props.backgroundURL&&(this.containerRef.style.backgroundImage=null!==this.props.backgroundURL?"url("+this.props.backgroundURL+")":null),t.backgroundColor!==this.props.backgroundColor&&(this.containerRef.style.backgroundColor=this.props.backgroundColor),this.sizeChanged(t,this.props)&&this.resizeElement(this.props.width,this.props.height)):(this.containerRef.style.backgroundImage=null!==this.props.backgroundURL?"url("+this.props.backgroundURL+")":null,this.containerRef.style.backgroundColor=this.props.backgroundColor,this.resizeElement(this.props.width,this.props.height))},t.prototype.sizeChanged=function(t,e){return t.width!==e.width||t.height!==e.height},t.prototype.resizeElement=function(t,e){this.containerRef.style.width=t+"px",this.containerRef.style.height=e+"px"},t.prototype.resize=function(t,e){this.props=_e({},this.props,{width:t,height:e})},t.prototype.remove=function(){this.disposables.forEach(function(t){return t.dispose()}),this.elements.forEach(function(t){return t.remove()}),this.elementsById={},this.elementIds=[],this.clearRelations(),this.containerRef.innerHTML=""},t.prototype.buildRelations=function(){var t=this;this.clearRelations(),this.elements.forEach(function(e){if(null!==e.props.parentId){var n=t.elementsById[e.props.parentId],i=t.elementsById[e.props.id];n&&i&&t.addRelationLine(n,i)}})},t.prototype.clearRelations=function(t){if(null!=t)for(var e in this.relations){var n=e.split("|"),i=Number.parseInt(n[0]),r=Number.parseInt(n[1]);t!==i&&t!==r||(this.relations[e].remove(),delete this.relations[e])}else for(var e in this.relations)this.relations[e].remove(),delete this.relations[e]},t.prototype.getRelationLine=function(t,e){var n=t+"|"+e;return this.relations[n]||null},t.prototype.addRelationLine=function(t,e){var n=t.props.id+"|"+e.props.id;null!=this.relations[n]&&this.relations[n].remove();var i=t.props.x+t.elementRef.clientWidth/2,r=t.props.y+(t.elementRef.clientHeight-t.labelElementRef.clientHeight)/2,s=e.props.x+e.elementRef.clientWidth/2,o=e.props.y+(e.elementRef.clientHeight-e.labelElementRef.clientHeight)/2,a=new B(R({id:0,type:13,startX:i,startY:r,endX:s,endY:o,width:0,height:0,lineWidth:this.props.relationLineWidth,color:"#CCCCCC"}));return this.relations[n]=a,a.elementRef.style.zIndex="0",this.containerRef.append(a.elementRef),a},t.prototype.onClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t}(),ye=function(){function t(t){this.cancellable={cancel:function(){}},this._status="waiting",this.statusChangeEventManager=new se.a,this.disposables=[],this.taskInitiator=t}return Object.defineProperty(t.prototype,"status",{get:function(){return this._status},set:function(t){this._status=t,this.statusChangeEventManager.emit(t)},enumerable:!0,configurable:!0}),t.prototype.init=function(){var t=this;this.cancellable=this.taskInitiator(function(){t.status="finished"}),this.status="started"},t.prototype.cancel=function(){this.cancellable.cancel(),this.status="cancelled"},t.prototype.onStatusChange=function(t){var e=this.statusChangeEventManager.on(t);return this.disposables.push(e),e},t}();var me=function(){function t(){this.tasks={}}return t.prototype.add=function(t,e,n){void 0===n&&(n=0),this.tasks[t]&&"started"===this.tasks[t].status&&this.tasks[t].cancel();var i=n>0?function(t,e){return new ye(function(){var n=null;return t.onStatusChange(function(i){"finished"===i&&(n=window.setTimeout(function(){t.init()},e))}),t.init(),{cancel:function(){n&&clearTimeout(n),t.cancel()}}})}(new ye(e),n):new ye(e);return this.tasks[t]=i,this.tasks[t]},t.prototype.init=function(t){!this.tasks[t]||"waiting"!==this.tasks[t].status&&"cancelled"!==this.tasks[t].status&&"finished"!==this.tasks[t].status||this.tasks[t].init()},t.prototype.cancel=function(t){this.tasks[t]&&"started"===this.tasks[t].status&&this.tasks[t].cancel()},t}();window.VisualConsole=de,window.AsyncTaskManager=me}]); +//# sourceMappingURL=vc.main.min.js.map \ No newline at end of file diff --git a/pandora_console/include/visual-console-client/vc.main.min.js.map b/pandora_console/include/visual-console-client/vc.main.min.js.map index ed8885a314..518b003c07 100644 --- a/pandora_console/include/visual-console-client/vc.main.min.js.map +++ b/pandora_console/include/visual-console-client/vc.main.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib.ts","webpack:///./src/Item.ts","webpack:///./src/TypedEvent.ts","webpack:///./src/items/EventsHistory.ts","webpack:///./src/items/DonutGraph.ts","webpack:///./src/items/BarsGraph.ts","webpack:///./src/items/ModuleGraph.ts","webpack:///./src/items/StaticGraph.ts","webpack:///./src/items/Icon.ts","webpack:///./src/items/ColorCloud.ts","webpack:///./src/items/Group.ts","webpack:///./src/items/Clock/index.ts","webpack:///./src/items/Box.ts","webpack:///./src/items/Line.ts","webpack:///./src/items/Label.ts","webpack:///./src/items/SimpleValue.ts","webpack:///./node_modules/d3-path/src/path.js","webpack:///./node_modules/d3-shape/src/constant.js","webpack:///./node_modules/d3-shape/src/math.js","webpack:///./node_modules/d3-shape/src/arc.js","webpack:///./node_modules/d3-shape/src/curve/linear.js","webpack:///./node_modules/d3-shape/src/curve/radial.js","webpack:///./node_modules/d3-shape/src/array.js","webpack:///./node_modules/d3-shape/src/symbol/diamond.js","webpack:///./node_modules/d3-shape/src/symbol/circle.js","webpack:///./node_modules/d3-shape/src/symbol/star.js","webpack:///./node_modules/d3-shape/src/noop.js","webpack:///./node_modules/d3-shape/src/symbol/triangle.js","webpack:///./node_modules/d3-shape/src/symbol/wye.js","webpack:///./node_modules/d3-shape/src/curve/basis.js","webpack:///./node_modules/d3-shape/src/curve/basisClosed.js","webpack:///./node_modules/d3-shape/src/curve/basisOpen.js","webpack:///./node_modules/d3-shape/src/curve/bundle.js","webpack:///./node_modules/d3-shape/src/curve/cardinal.js","webpack:///./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack:///./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack:///./node_modules/d3-shape/src/curve/catmullRom.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack:///./node_modules/d3-shape/src/curve/linearClosed.js","webpack:///./node_modules/d3-shape/src/curve/monotone.js","webpack:///./node_modules/d3-shape/src/curve/natural.js","webpack:///./node_modules/d3-shape/src/curve/step.js","webpack:///./node_modules/d3-shape/src/order/descending.js","webpack:///./src/items/Percentile.ts","webpack:///./src/items/Service.ts","webpack:///./src/VisualConsole.ts","webpack:///./src/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","parseIntOr","defaultValue","length","isNaN","parseInt","parseFloatOr","parseFloat","stringIsEmpty","notEmptyStringOr","parseBoolean","leftPad","pad","diffLength","substr","Math","abs","substring","repeatTimes","floor","restLength","newPad","positionPropsDecoder","data","x","y","sizePropsDecoder","width","height","TypeError","modulePropsDecoder","__assign","moduleName","moduleDescription","agentProps","agentId","agent","agentName","agentAlias","agentDescription","agentAddress","metaconsoleId","agentPropsDecoder","linkedVCPropsDecoder","id","linkedLayoutId","linkedLayoutAgentId","linkedLayoutStatusProps","linkedLayoutStatusType","weight","linkedLayoutStatusTypeWeight","warningThreshold","linkedLayoutStatusTypeWarningThreshold","criticalThreshold","linkedLayoutStatusTypeCriticalThreshold","linkedLayoutBaseProps","prefixedCssRules","ruleName","ruleValue","rule","decodeBase64","input","decodeURIComponent","escape","window","atob","humanDate","date","locale","Intl","DateTimeFormat","day","month","year","format","getDate","getMonth","getFullYear","humanTime","getHours","getMinutes","getSeconds","replaceMacros","macros","text","reduce","acc","_a","macro","replace","parseLabelPosition","labelPosition","itemBasePropsDecoder","type","label","_lib__WEBPACK_IMPORTED_MODULE_0__","isLinkEnabled","link","isOnTop","parentId","aclGroupId","VisualConsoleItem","props","this","clickEventManager","_TypedEvent__WEBPACK_IMPORTED_MODULE_1__","removeEventManager","disposables","itemProps","elementRef","createContainerDomElement","labelElementRef","createLabelDomElement","childElementRef","createDomElement","append","resizeElement","changeLabelPosition","box","_this","document","createElement","href","className","style","zIndex","left","top","onclick","e","emit","nativeEvent","element","getLabelWithMacrosReplaced","table","row","emptyRow1","emptyRow2","cell","innerHTML","textAlign","Date","updateDomElement","newProps","prevProps","shouldBeUpdated","render","positionChanged","moveElement","sizeChanged","oldLabelHtml","newLabelHtml","container","parentNode","replaceChild","remove","forEach","disposable","dispose","ignored","prevPosition","newPosition","position","flexDirection","tables","getElementsByTagName","item","move","prevSize","newSize","resize","onClick","listener","on","push","onRemove","__webpack_exports__","TypedEvent","listeners","listenersOncer","off","once","callbackIndex","indexOf","splice","event","pipe","te","eventsHistoryPropsDecoder","html","encodedHtml","_Item__WEBPACK_IMPORTED_MODULE_1__","maxTime","EventsHistory","_super","__extends","scripts","src","setTimeout","eval","trim","aux","donutGraphPropsDecoder","DonutGraph","barsGraphPropsDecoder","BarsGraph","moduleGraphPropsDecoder","ModuleGraph","legendP","margin","overviewGraphs","getElementsByClassName","parseShowLastValueTooltip","showLastValueTooltip","staticGraphPropsDecoder","imageSrc","Item","statusImageSrc","lib","lastValue","StaticGraph","imgSrc","background","backgroundSize","backgroundPosition","setAttribute","iconPropsDecoder","Icon_assign","Icon","Icon_extends","colorCloudPropsDecoder","color","ColorCloud_assign","ColorCloud_svgNS","ColorCloud","ColorCloud_extends","createSvgElement","gradientId","svg","createElementNS","defs","radialGradient","stop0","stop100","circle","groupPropsDecoder","groupId","showStatistics","extractHtml","Group_assign","Group","Group_extends","parseClockType","clockType","parseClockFormat","clockFormat","clockPropsDecoder","clockTimezone","Clock_assign","clockTimezoneOffset","showClockTimezone","items_Clock","Clock","intervalRef","startTick","createClock","TICK_INTERVAL","Clock_extends","stopTick","clearInterval","handler","interval","setInterval","getElementSize","newWidth","newHeight","createAnalogicClock","createDigitalClock","Error","svgNS","colors","dateFontSize","baseTimeFontSize","div","clockFace","clockFaceBackground","city","getHumanTimezone","timezoneComplication","textContent","marksGroup","mainMarkGroup","mark1a","mark1b","mark","hourHand","hourHandA","hourHandB","minuteHand","minuteHandA","minuteHandB","minuteHandPin","secondHand","secondHandBar","secondHandPin","pin","getOriginDate","seconds","minutes","secAngle","minuteAngle","hourAngle","join","dateElem","fontSize","tzFontSizeMultiplier","timeFontSize","tzFontSize","min","timeElem","tzElem","initialDate","targetTZOffset","localTZOffset","getTimezoneOffset","utimestamp","getTime","timezone","_b","split","diameter","boxPropsDecoder","Box_assign","borderWidth","borderColor","fillColor","Box","Box_extends","boxSizing","backgroundColor","borderStyle","maxBorderWidth","linePropsDecoder","Line_assign","startPosition","startX","startY","endPosition","endX","endY","lineWidth","Line","extractBoxSizeAndPosition","Line_extends","toString","line","labelPropsDecoder","Label_assign","Label","Label_extends","parseValueType","valueType","parseProcessValue","processValue","simpleValuePropsDecoder","SimpleValue_assign","period","SimpleValue","SimpleValue_extends","img","pi","PI","tau","tauEpsilon","Path","_x0","_y0","_x1","_y1","_","path","constructor","moveTo","closePath","lineTo","quadraticCurveTo","x1","y1","bezierCurveTo","x2","y2","arcTo","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","sqrt","l01","tan","acos","t01","t21","arc","a0","a1","ccw","dx","cos","dy","sin","cw","da","rect","w","h","src_path","constant","atan2","max","math_epsilon","math_pi","halfPi","math_tau","asin","arcInnerRadius","innerRadius","arcOuterRadius","outerRadius","arcStartAngle","startAngle","arcEndAngle","endAngle","arcPadAngle","padAngle","cornerTangents","r1","rc","lo","ox","oy","x11","y11","x10","y10","x00","y00","d2","D","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","cx","cy","src_arc","cornerRadius","padRadius","context","buffer","r0","apply","arguments","t0","t1","a01","a11","a00","a10","da0","da1","ap","rp","rc0","rc1","p0","p1","oc","x3","y3","x32","y32","intersect","ax","ay","bx","by","kc","lc","centroid","a","Linear","_context","areaStart","_line","areaEnd","NaN","lineStart","_point","lineEnd","point","linear","curveRadial","Radial","curve","_curve","radial","Array","slice","kr","noop","that","Basis","BasisClosed","_x2","_x3","_x4","_y2","_y3","_y4","BasisOpen","Bundle","beta","_basis","_beta","_x","_y","j","custom","bundle","cardinal_point","_k","Cardinal","tension","cardinal","CardinalClosed","_x5","_y5","CardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","b","_l23_2a","CatmullRom","alpha","_alpha","x23","y23","pow","catmullRom","CatmullRomClosed","CatmullRomOpen","LinearClosed","sign","slope3","h0","h1","s0","s1","slope2","monotone_point","MonotoneX","MonotoneY","ReflectContext","Natural","controlPoints","_t0","px","py","i0","i1","Step","_t","extractPercentileType","extractValueType","percentilePropsDecoder","Percentile_assign","percentileType","minValue","maxValue","labelColor","unit","Percentile_svgNS","Percentile","Percentile_extends","formatValue","progress","getProgress","NumberFormat","backgroundRect","progressRect","backgroundCircle","progressCircle","arcProps","servicePropsDecoder","encodedTitle","serviceId","Service_assign","Service","Service_extends","itemInstanceFrom","items_StaticGraph","items_SimpleValue","items_Percentile","items_Label","items_Icon","items_Service","items_Group","items_Box","items_Line","items_ColorCloud","VisualConsole","items","elementsById","elementIds","relations","handleElementClick","handleElementRemove","filter","clearRelations","containerRef","_props","backgroundURL","isFavorite","relationLineWidth","VisualConsole_assign","visualConsolePropsDecoder","sort","itemInstance","error","console","log","message","buildRelations","map","updateElements","itemIds","decodeProps","backgroundImage","elements","parent_1","child","addRelationLine","itemId","ids","Number","childId","getRelationLine","identifier","parent","clientWidth","clientHeight","src_VisualConsole"],"mappings":"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","file":"vc.main.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","import {\n UnknownObject,\n Position,\n Size,\n WithAgentProps,\n WithModuleProps,\n LinkedVisualConsoleProps,\n LinkedVisualConsolePropsStatus\n} from \"./types\";\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseIntOr(value: any, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.length > 0 && !isNaN(parseInt(value)))\n return parseInt(value);\n else return defaultValue;\n}\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseFloatOr(value: any, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (\n typeof value === \"string\" &&\n value.length > 0 &&\n !isNaN(parseFloat(value))\n )\n return parseFloat(value);\n else return defaultValue;\n}\n\n/**\n * Check if a string exists and it's not empty.\n * @param value Value to check.\n * @return The check result.\n */\nexport function stringIsEmpty(value?: string | null): boolean {\n return value == null || value.length === 0;\n}\n\n/**\n * Return a not empty string or a default value from a raw value.\n * @param value Raw value from which we will try to extract a non empty string.\n * @param defaultValue Default value to use if we cannot extract a non empty string.\n * @return A non empty string or the default value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function notEmptyStringOr(value: any, defaultValue: T): string | T {\n return typeof value === \"string\" && value.length > 0 ? value : defaultValue;\n}\n\n/**\n * Return a boolean from a raw value.\n * @param value Raw value from which we will try to extract the boolean.\n * @return A valid boolean value. false by default.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function parseBoolean(value: any): boolean {\n if (typeof value === \"boolean\") return value;\n else if (typeof value === \"number\") return value > 0;\n else if (typeof value === \"string\") return value === \"1\" || value === \"true\";\n else return false;\n}\n\n/**\n * Pad the current string with another string (multiple times, if needed)\n * until the resulting string reaches the given length.\n * The padding is applied from the start (left) of the current string.\n * @param value Text that needs to be padded.\n * @param length Length of the returned text.\n * @param pad Text to add.\n * @return Padded text.\n */\nexport function leftPad(\n value: string | number,\n length: number,\n pad: string | number = \" \"\n): string {\n if (typeof value === \"number\") value = `${value}`;\n if (typeof pad === \"number\") pad = `${pad}`;\n\n const diffLength = length - value.length;\n if (diffLength === 0) return value;\n if (diffLength < 0) return value.substr(Math.abs(diffLength));\n\n if (diffLength === pad.length) return `${pad}${value}`;\n if (diffLength < pad.length) return `${pad.substring(0, diffLength)}${value}`;\n\n const repeatTimes = Math.floor(diffLength / pad.length);\n const restLength = diffLength - pad.length * repeatTimes;\n\n let newPad = \"\";\n for (let i = 0; i < repeatTimes; i++) newPad += pad;\n\n if (restLength === 0) return `${newPad}${value}`;\n return `${newPad}${pad.substring(0, restLength)}${value}`;\n}\n\n/* Decoders */\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the position.\n */\nexport function positionPropsDecoder(data: UnknownObject): Position {\n return {\n x: parseIntOr(data.x, 0),\n y: parseIntOr(data.y, 0)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the size.\n * @throws Will throw a TypeError if the width and height are not valid numbers.\n */\nexport function sizePropsDecoder(data: UnknownObject): Size | never {\n if (\n data.width == null ||\n isNaN(parseInt(data.width)) ||\n data.height == null ||\n isNaN(parseInt(data.height))\n ) {\n throw new TypeError(\"invalid size.\");\n }\n\n return {\n width: parseInt(data.width),\n height: parseInt(data.height)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the agent properties.\n */\nexport function agentPropsDecoder(data: UnknownObject): WithAgentProps {\n const agentProps: WithAgentProps = {\n agentId: parseIntOr(data.agent, null),\n agentName: notEmptyStringOr(data.agentName, null),\n agentAlias: notEmptyStringOr(data.agentAlias, null),\n agentDescription: notEmptyStringOr(data.agentDescription, null),\n agentAddress: notEmptyStringOr(data.agentAddress, null)\n };\n\n return data.metaconsoleId != null\n ? {\n metaconsoleId: data.metaconsoleId,\n ...agentProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : agentProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the module and agent properties.\n */\nexport function modulePropsDecoder(data: UnknownObject): WithModuleProps {\n return {\n moduleId: parseIntOr(data.moduleId, null),\n moduleName: notEmptyStringOr(data.moduleName, null),\n moduleDescription: notEmptyStringOr(data.moduleDescription, null),\n ...agentPropsDecoder(data) // Object spread: http://es6-features.org/#SpreadOperator\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the linked visual console properties.\n * @throws Will throw a TypeError if the status calculation properties are invalid.\n */\nexport function linkedVCPropsDecoder(\n data: UnknownObject\n): LinkedVisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n metaconsoleId,\n linkedLayoutId: id,\n linkedLayoutAgentId: agentId\n } = data;\n\n let linkedLayoutStatusProps: LinkedVisualConsolePropsStatus = {\n linkedLayoutStatusType: \"default\"\n };\n switch (data.linkedLayoutStatusType) {\n case \"weight\": {\n const weight = parseIntOr(data.linkedLayoutStatusTypeWeight, null);\n if (weight == null)\n throw new TypeError(\"invalid status calculation properties.\");\n\n if (data.linkedLayoutStatusTypeWeight)\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"weight\",\n linkedLayoutStatusTypeWeight: weight\n };\n break;\n }\n case \"service\": {\n const warningThreshold = parseIntOr(\n data.linkedLayoutStatusTypeWarningThreshold,\n null\n );\n const criticalThreshold = parseIntOr(\n data.linkedLayoutStatusTypeCriticalThreshold,\n null\n );\n if (warningThreshold == null || criticalThreshold == null) {\n throw new TypeError(\"invalid status calculation properties.\");\n }\n\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"service\",\n linkedLayoutStatusTypeWarningThreshold: warningThreshold,\n linkedLayoutStatusTypeCriticalThreshold: criticalThreshold\n };\n break;\n }\n }\n\n const linkedLayoutBaseProps = {\n linkedLayoutId: parseIntOr(id, null),\n linkedLayoutAgentId: parseIntOr(agentId, null),\n ...linkedLayoutStatusProps // Object spread: http://es6-features.org/#SpreadOperator\n };\n\n return metaconsoleId != null\n ? {\n metaconsoleId,\n ...linkedLayoutBaseProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : linkedLayoutBaseProps;\n}\n\n/**\n * To get a CSS rule with the most used prefixes.\n * @param ruleName Name of the CSS rule.\n * @param ruleValue Value of the CSS rule.\n * @return An array of rules with the prefixes applied.\n */\nexport function prefixedCssRules(\n ruleName: string,\n ruleValue: string\n): string[] {\n const rule = `${ruleName}: ${ruleValue};`;\n return [\n `-webkit-${rule}`,\n `-moz-${rule}`,\n `-ms-${rule}`,\n `-o-${rule}`,\n `${rule}`\n ];\n}\n\n/**\n * Decode a base64 string.\n * @param input Data encoded using base64.\n * @return Decoded data.\n */\nexport function decodeBase64(input: string): string {\n return decodeURIComponent(escape(window.atob(input)));\n}\n\n/**\n * Generate a date representation with the format 'd/m/Y'.\n * @param initialDate Date to be used instead of a generated one.\n * @param locale Locale to use if localization is required and available.\n * @example 24/02/2020.\n * @return Date representation.\n */\nexport function humanDate(date: Date, locale: string | null = null): string {\n if (locale && Intl && Intl.DateTimeFormat) {\n // Format using the user locale.\n const options: Intl.DateTimeFormatOptions = {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\"\n };\n return Intl.DateTimeFormat(locale, options).format(date);\n } else {\n // Use getDate, getDay returns the week day.\n const day = leftPad(date.getDate(), 2, 0);\n // The getMonth function returns the month starting by 0.\n const month = leftPad(date.getMonth() + 1, 2, 0);\n const year = leftPad(date.getFullYear(), 4, 0);\n\n // Format: 'd/m/Y'.\n return `${day}/${month}/${year}`;\n }\n}\n\n/**\n * Generate a time representation with the format 'hh:mm:ss'.\n * @param initialDate Date to be used instead of a generated one.\n * @example 01:34:09.\n * @return Time representation.\n */\nexport function humanTime(date: Date): string {\n const hours = leftPad(date.getHours(), 2, 0);\n const minutes = leftPad(date.getMinutes(), 2, 0);\n const seconds = leftPad(date.getSeconds(), 2, 0);\n\n return `${hours}:${minutes}:${seconds}`;\n}\n\ninterface Macro {\n macro: string | RegExp;\n value: string;\n}\n/**\n * Replace the macros of a text.\n * @param macros List of macros and their replacements.\n * @param text Text in which we need to replace the macros.\n */\nexport function replaceMacros(macros: Macro[], text: string): string {\n return macros.reduce(\n (acc, { macro, value }) => acc.replace(macro, value),\n text\n );\n}\n","import { Position, Size, UnknownObject, WithModuleProps } from \"./types\";\nimport {\n sizePropsDecoder,\n positionPropsDecoder,\n parseIntOr,\n parseBoolean,\n notEmptyStringOr,\n replaceMacros,\n humanDate,\n humanTime\n} from \"./lib\";\nimport TypedEvent, { Listener, Disposable } from \"./TypedEvent\";\n\n// Enum: https://www.typescriptlang.org/docs/handbook/enums.html.\nexport const enum ItemType {\n STATIC_GRAPH = 0,\n MODULE_GRAPH = 1,\n SIMPLE_VALUE = 2,\n PERCENTILE_BAR = 3,\n LABEL = 4,\n ICON = 5,\n SIMPLE_VALUE_MAX = 6,\n SIMPLE_VALUE_MIN = 7,\n SIMPLE_VALUE_AVG = 8,\n PERCENTILE_BUBBLE = 9,\n SERVICE = 10,\n GROUP_ITEM = 11,\n BOX_ITEM = 12,\n LINE_ITEM = 13,\n AUTO_SLA_GRAPH = 14,\n CIRCULAR_PROGRESS_BAR = 15,\n CIRCULAR_INTERIOR_PROGRESS_BAR = 16,\n DONUT_GRAPH = 17,\n BARS_GRAPH = 18,\n CLOCK = 19,\n COLOR_CLOUD = 20\n}\n\n// Base item properties. This interface should be extended by the item implementations.\nexport interface ItemProps extends Position, Size {\n readonly id: number;\n readonly type: ItemType;\n label: string | null;\n labelPosition: \"up\" | \"right\" | \"down\" | \"left\";\n isLinkEnabled: boolean;\n link: string | null;\n isOnTop: boolean;\n parentId: number | null;\n aclGroupId: number | null;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemClickEvent {\n // data: Props;\n data: UnknownObject;\n nativeEvent: Event;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemRemoveEvent {\n // data: Props;\n data: UnknownObject;\n}\n\n/**\n * Extract a valid enum value from a raw label positi9on value.\n * @param labelPosition Raw value.\n */\nconst parseLabelPosition = (\n labelPosition: any // eslint-disable-line @typescript-eslint/no-explicit-any\n): ItemProps[\"labelPosition\"] => {\n switch (labelPosition) {\n case \"up\":\n case \"right\":\n case \"down\":\n case \"left\":\n return labelPosition;\n default:\n return \"down\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function itemBasePropsDecoder(data: UnknownObject): ItemProps | never {\n if (data.id == null || isNaN(parseInt(data.id))) {\n throw new TypeError(\"invalid id.\");\n }\n if (data.type == null || isNaN(parseInt(data.type))) {\n throw new TypeError(\"invalid type.\");\n }\n\n return {\n id: parseInt(data.id),\n type: parseInt(data.type),\n label: notEmptyStringOr(data.label, null),\n labelPosition: parseLabelPosition(data.labelPosition),\n isLinkEnabled: parseBoolean(data.isLinkEnabled),\n link: notEmptyStringOr(data.link, null),\n isOnTop: parseBoolean(data.isOnTop),\n parentId: parseIntOr(data.parentId, null),\n aclGroupId: parseIntOr(data.aclGroupId, null),\n ...sizePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...positionPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\n/**\n * Base class of the visual console items. Should be extended to use its capabilities.\n */\nabstract class VisualConsoleItem {\n // Properties of the item.\n private itemProps: Props;\n // Reference to the DOM element which will contain the item.\n public elementRef: HTMLElement;\n public readonly labelElementRef: HTMLElement;\n // Reference to the DOM element which will contain the view of the item which extends this class.\n protected readonly childElementRef: HTMLElement;\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent>();\n // Event manager for remove events.\n private readonly removeEventManager = new TypedEvent<\n ItemRemoveEvent\n >();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n /**\n * To create a new element which will be inside the item box.\n * @return Item.\n */\n protected abstract createDomElement(): HTMLElement;\n\n public constructor(props: Props) {\n this.itemProps = props;\n\n /*\n * Get a HTMLElement which represents the container box\n * of the Visual Console item. This element will manage\n * all the common things like click events, show a border\n * when hovered, etc.\n */\n this.elementRef = this.createContainerDomElement();\n this.labelElementRef = this.createLabelDomElement();\n\n /*\n * Get a HTMLElement which represents the custom view\n * of the Visual Console item. This element will be\n * different depending on the item implementation.\n */\n this.childElementRef = this.createDomElement();\n\n // Insert the elements into the container.\n this.elementRef.append(this.childElementRef, this.labelElementRef);\n\n // Resize element.\n this.resizeElement(props.width, props.height);\n // Set label position.\n this.changeLabelPosition(props.labelPosition);\n }\n\n /**\n * To create a new box for the visual console item.\n * @return Item box.\n */\n private createContainerDomElement(): HTMLElement {\n let box;\n if (this.props.isLinkEnabled) {\n box = document.createElement(\"a\");\n box as HTMLAnchorElement;\n if (this.props.link) box.href = this.props.link;\n } else {\n box = document.createElement(\"div\");\n box as HTMLDivElement;\n }\n\n box.className = \"visual-console-item\";\n box.style.zIndex = this.props.isOnTop ? \"2\" : \"1\";\n box.style.left = `${this.props.x}px`;\n box.style.top = `${this.props.y}px`;\n box.onclick = e =>\n this.clickEventManager.emit({ data: this.props, nativeEvent: e });\n\n return box;\n }\n\n /**\n * To create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Add the label if it exists.\n const label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n // Ugly table we need to use to replicate the legacy style.\n const table = document.createElement(\"table\");\n const row = document.createElement(\"tr\");\n const emptyRow1 = document.createElement(\"tr\");\n const emptyRow2 = document.createElement(\"tr\");\n const cell = document.createElement(\"td\");\n\n cell.innerHTML = label;\n row.append(cell);\n table.append(emptyRow1, row, emptyRow2);\n table.style.textAlign = \"center\";\n\n // Change the table size depending on its position.\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n\n // element.innerHTML = this.props.label;\n element.append(table);\n }\n\n return element;\n }\n\n /**\n * Return the label stored into the props with some macros replaced.\n */\n protected getLabelWithMacrosReplaced(): string {\n // We assert that the props may have some needed properties.\n const props = this.props as Partial;\n\n return replaceMacros(\n [\n {\n macro: \"_date_\",\n value: humanDate(new Date())\n },\n {\n macro: \"_time_\",\n value: humanTime(new Date())\n },\n {\n macro: \"_agent_\",\n value: props.agentAlias != null ? props.agentAlias : \"\"\n },\n {\n macro: \"_agentdescription_\",\n value: props.agentDescription != null ? props.agentDescription : \"\"\n },\n {\n macro: \"_address_\",\n value: props.agentAddress != null ? props.agentAddress : \"\"\n },\n {\n macro: \"_module_\",\n value: props.moduleName != null ? props.moduleName : \"\"\n },\n {\n macro: \"_moduledescription_\",\n value: props.moduleDescription != null ? props.moduleDescription : \"\"\n }\n ],\n this.props.label || \"\"\n );\n }\n\n /**\n * To update the content element.\n * @return Item.\n */\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.createDomElement().innerHTML;\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): Props {\n return { ...this.itemProps }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: Props) {\n const prevProps = this.props;\n // Update the internal props.\n this.itemProps = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n if (this.shouldBeUpdated(prevProps, newProps)) this.render(prevProps);\n }\n\n /**\n * To compare the previous and the new props and returns a boolean value\n * in case the difference is meaningfull enough to perform DOM changes.\n *\n * Here, the only comparision is done by reference.\n *\n * Override this function to perform a different comparision depending on the item needs.\n *\n * @param prevProps\n * @param newProps\n * @return Whether the difference is meaningful enough to perform DOM changes or not.\n */\n protected shouldBeUpdated(prevProps: Props, newProps: Props): boolean {\n return prevProps !== newProps;\n }\n\n /**\n * To recreate or update the HTMLElement which represents the item into the DOM.\n * @param prevProps If exists it will be used to only perform DOM updates instead of a full replace.\n */\n public render(prevProps: Props | null = null): void {\n this.updateDomElement(this.childElementRef);\n\n // Move box.\n if (!prevProps || this.positionChanged(prevProps, this.props)) {\n this.moveElement(this.props.x, this.props.y);\n }\n // Resize box.\n if (!prevProps || this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n // Change label.\n const oldLabelHtml = this.labelElementRef.innerHTML;\n const newLabelHtml = this.createLabelDomElement().innerHTML;\n if (oldLabelHtml !== newLabelHtml) {\n this.labelElementRef.innerHTML = newLabelHtml;\n }\n // Change label position.\n if (!prevProps || prevProps.labelPosition !== this.props.labelPosition) {\n this.changeLabelPosition(this.props.labelPosition);\n }\n // Change link.\n if (\n prevProps &&\n (prevProps.isLinkEnabled !== this.props.isLinkEnabled ||\n (this.props.isLinkEnabled && prevProps.link !== this.props.link))\n ) {\n const container = this.createContainerDomElement();\n container.innerHTML = this.elementRef.innerHTML;\n\n if (this.elementRef.parentNode !== null) {\n this.elementRef.parentNode.replaceChild(container, this.elementRef);\n }\n\n // Changed the reference to the main element. It's ugly, but needed.\n this.elementRef = container;\n }\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n // Call the remove event.\n this.removeEventManager.emit({ data: this.props });\n // Event listeners.\n this.disposables.forEach(disposable => {\n try {\n disposable.dispose();\n } catch (ignored) {} // eslint-disable-line no-empty\n });\n // VisualConsoleItem DOM element.\n this.elementRef.remove();\n }\n\n /**\n * Compare the previous and the new position and return\n * a boolean value in case the position changed.\n * @param prevPosition\n * @param newPosition\n * @return Whether the position changed or not.\n */\n protected positionChanged(\n prevPosition: Position,\n newPosition: Position\n ): boolean {\n return prevPosition.x !== newPosition.x || prevPosition.y !== newPosition.y;\n }\n\n /**\n * Move the label around the item content.\n * @param position Label position.\n */\n protected changeLabelPosition(position: Props[\"labelPosition\"]): void {\n switch (position) {\n case \"up\":\n this.elementRef.style.flexDirection = \"column-reverse\";\n break;\n case \"left\":\n this.elementRef.style.flexDirection = \"row-reverse\";\n break;\n case \"right\":\n this.elementRef.style.flexDirection = \"row\";\n break;\n case \"down\":\n default:\n this.elementRef.style.flexDirection = \"column\";\n break;\n }\n\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n // Change the table size depending on its position.\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n }\n }\n\n /**\n * Move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n protected moveElement(x: number, y: number): void {\n this.elementRef.style.left = `${x}px`;\n this.elementRef.style.top = `${y}px`;\n }\n\n /**\n * Update the position into the properties and move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n public move(x: number, y: number): void {\n this.moveElement(x, y);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n x,\n y\n };\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n protected sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n // The most valuable size is the content size.\n this.childElementRef.style.width = width > 0 ? `${width}px` : null;\n this.childElementRef.style.height = height > 0 ? `${height}px` : null;\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.resizeElement(width, height);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onClick(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the removal of the item.\n * @param listener Function which is going to be executed when a item is removed.\n */\n public onRemove(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.removeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\nexport default VisualConsoleItem;\n","export interface Listener {\n (event: T): void;\n}\n\nexport interface Disposable {\n dispose: () => void;\n}\n\n/** passes through events as they happen. You will not get events from before you start listening */\nexport default class TypedEvent {\n private listeners: Listener[] = [];\n private listenersOncer: Listener[] = [];\n\n public on = (listener: Listener): Disposable => {\n this.listeners.push(listener);\n return {\n dispose: () => this.off(listener)\n };\n };\n\n public once = (listener: Listener): void => {\n this.listenersOncer.push(listener);\n };\n\n public off = (listener: Listener): void => {\n const callbackIndex = this.listeners.indexOf(listener);\n if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);\n };\n\n public emit = (event: T): void => {\n /** Update any general listeners */\n this.listeners.forEach(listener => listener(event));\n\n /** Clear the `once` queue */\n this.listenersOncer.forEach(listener => listener(event));\n this.listenersOncer = [];\n };\n\n public pipe = (te: TypedEvent): Disposable => this.on(e => te.emit(e));\n}\n","import { UnknownObject, WithModuleProps } from \"../types\";\nimport {\n modulePropsDecoder,\n parseIntOr,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type EventsHistoryProps = {\n type: ItemType.AUTO_SLA_GRAPH;\n maxTime: number | null;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the events history props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function eventsHistoryPropsDecoder(\n data: UnknownObject\n): EventsHistoryProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.AUTO_SLA_GRAPH,\n maxTime: parseIntOr(data.maxTime, null),\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class EventsHistory extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"events-history\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type DonutGraphProps = {\n type: ItemType.DONUT_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the donut graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function donutGraphPropsDecoder(\n data: UnknownObject\n): DonutGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.DONUT_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class DonutGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"donut-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import { UnknownObject, WithModuleProps } from \"../types\";\nimport { modulePropsDecoder, decodeBase64, stringIsEmpty } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type BarsGraphProps = {\n type: ItemType.BARS_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the bars graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function barsGraphPropsDecoder(\n data: UnknownObject\n): BarsGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BARS_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class BarsGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"bars-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ModuleGraphProps = {\n type: ItemType.MODULE_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the module graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function moduleGraphPropsDecoder(\n data: UnknownObject\n): ModuleGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.MODULE_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class ModuleGraph extends Item {\n /**\n * @override Item.resizeElement.\n * Resize the DOM content container.\n * We need to override the resize function cause this item's height\n * is larger than the configured and the graph is over the label.\n * @param width\n * @param height\n */\n protected resizeElement(width: number): void {\n super.resizeElement(width, 0);\n }\n\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"module-graph\";\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n UnknownObject\n} from \"../types\";\n\nimport {\n modulePropsDecoder,\n linkedVCPropsDecoder,\n notEmptyStringOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type StaticGraphProps = {\n type: ItemType.STATIC_GRAPH;\n imageSrc: string; // URL?\n showLastValueTooltip: \"default\" | \"enabled\" | \"disabled\";\n statusImageSrc: string | null; // URL?\n lastValue: string | null;\n} & ItemProps &\n (WithModuleProps | LinkedVisualConsoleProps);\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param showLastValueTooltip Raw value.\n */\nconst parseShowLastValueTooltip = (\n showLastValueTooltip: any // eslint-disable-line @typescript-eslint/no-explicit-any\n): StaticGraphProps[\"showLastValueTooltip\"] => {\n switch (showLastValueTooltip) {\n case \"default\":\n case \"enabled\":\n case \"disabled\":\n return showLastValueTooltip;\n default:\n return \"default\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function staticGraphPropsDecoder(\n data: UnknownObject\n): StaticGraphProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.STATIC_GRAPH,\n imageSrc: data.imageSrc,\n showLastValueTooltip: parseShowLastValueTooltip(data.showLastValueTooltip),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n lastValue: notEmptyStringOr(data.lastValue, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class StaticGraph extends Item {\n protected createDomElement(): HTMLElement {\n const imgSrc = this.props.statusImageSrc || this.props.imageSrc;\n const element = document.createElement(\"div\");\n element.className = \"static-graph\";\n element.style.background = `url(${imgSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n // Show last value in a tooltip.\n if (\n this.props.lastValue !== null &&\n this.props.showLastValueTooltip !== \"disabled\"\n ) {\n element.className = \"static-graph image forced_title\";\n element.setAttribute(\"data-use_title_for_force_title\", \"1\");\n element.setAttribute(\"data-title\", this.props.lastValue);\n }\n\n return element;\n }\n}\n","import { LinkedVisualConsoleProps, UnknownObject } from \"../types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type IconProps = {\n type: ItemType.ICON;\n imageSrc: string; // URL?\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the icon props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function iconPropsDecoder(data: UnknownObject): IconProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.ICON,\n imageSrc: data.imageSrc,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Icon extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"icon\";\n element.style.background = `url(${this.props.imageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n return element;\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n UnknownObject\n} from \"../types\";\nimport { modulePropsDecoder, linkedVCPropsDecoder } from \"../lib\";\nimport Item, { itemBasePropsDecoder, ItemType, ItemProps } from \"../Item\";\n\nexport type ColorCloudProps = {\n type: ItemType.COLOR_CLOUD;\n color: string;\n // TODO: Add the rest of the color cloud values?\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function colorCloudPropsDecoder(\n data: UnknownObject\n): ColorCloudProps | never {\n // TODO: Validate the color.\n if (typeof data.color !== \"string\" || data.color.length === 0) {\n throw new TypeError(\"invalid color.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.COLOR_CLOUD,\n color: data.color,\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class ColorCloud extends Item {\n protected createDomElement(): HTMLElement {\n const container: HTMLDivElement = document.createElement(\"div\");\n container.className = \"color-cloud\";\n\n // Add the SVG.\n container.append(this.createSvgElement());\n\n return container;\n }\n\n public createSvgElement(): SVGSVGElement {\n const gradientId = `grad_${this.props.id}`;\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Defs.\n const defs = document.createElementNS(svgNS, \"defs\");\n // Radial gradient.\n const radialGradient = document.createElementNS(svgNS, \"radialGradient\");\n radialGradient.setAttribute(\"id\", gradientId);\n radialGradient.setAttribute(\"cx\", \"50%\");\n radialGradient.setAttribute(\"cy\", \"50%\");\n radialGradient.setAttribute(\"r\", \"50%\");\n radialGradient.setAttribute(\"fx\", \"50%\");\n radialGradient.setAttribute(\"fy\", \"50%\");\n // Stops.\n const stop0 = document.createElementNS(svgNS, \"stop\");\n stop0.setAttribute(\"offset\", \"0%\");\n stop0.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0.9`\n );\n const stop100 = document.createElementNS(svgNS, \"stop\");\n stop100.setAttribute(\"offset\", \"100%\");\n stop100.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0`\n );\n // Circle.\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"fill\", `url(#${gradientId})`);\n circle.setAttribute(\"cx\", \"50%\");\n circle.setAttribute(\"cy\", \"50%\");\n circle.setAttribute(\"r\", \"50%\");\n\n // Append elements.\n radialGradient.append(stop0, stop100);\n defs.append(radialGradient);\n svg.append(defs, circle);\n\n return svg;\n }\n}\n","import { LinkedVisualConsoleProps, UnknownObject } from \"../types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n stringIsEmpty,\n decodeBase64,\n parseBoolean\n} from \"../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../Item\";\n\nexport type GroupProps = {\n type: ItemType.GROUP_ITEM;\n groupId: number;\n imageSrc: string | null; // URL?\n statusImageSrc: string | null;\n showStatistics: boolean;\n html?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\nfunction extractHtml(data: UnknownObject): string | null {\n if (!stringIsEmpty(data.html)) return data.html;\n if (!stringIsEmpty(data.encodedHtml)) return decodeBase64(data.encodedHtml);\n return null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the group props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function groupPropsDecoder(data: UnknownObject): GroupProps | never {\n if (\n (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) &&\n data.encodedHtml === null\n ) {\n throw new TypeError(\"invalid image src.\");\n }\n if (parseIntOr(data.groupId, null) === null) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n const showStatistics = parseBoolean(data.showStatistics);\n const html = showStatistics ? extractHtml(data) : null;\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.GROUP_ITEM,\n groupId: parseInt(data.groupId),\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n showStatistics,\n html,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Group extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"group\";\n\n if (!this.props.showStatistics && this.props.statusImageSrc !== null) {\n // Icon with status.\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.showStatistics && this.props.html != null) {\n // Stats table.\n element.innerHTML = this.props.html;\n }\n\n return element;\n }\n}\n","import \"./styles.css\";\n\nimport { LinkedVisualConsoleProps, UnknownObject, Size } from \"../../types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n parseBoolean,\n prefixedCssRules,\n notEmptyStringOr,\n humanDate,\n humanTime\n} from \"../../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../../Item\";\n\nexport type ClockProps = {\n type: ItemType.CLOCK;\n clockType: \"analogic\" | \"digital\";\n clockFormat: \"datetime\" | \"time\";\n clockTimezone: string;\n clockTimezoneOffset: number; // Offset of the timezone to UTC in seconds.\n showClockTimezone: boolean;\n color?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockType Raw value.\n */\nconst parseClockType = (\n clockType: any // eslint-disable-line @typescript-eslint/no-explicit-any\n): ClockProps[\"clockType\"] => {\n switch (clockType) {\n case \"analogic\":\n case \"digital\":\n return clockType;\n default:\n return \"analogic\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockFormat Raw value.\n */\nconst parseClockFormat = (\n clockFormat: any // eslint-disable-line @typescript-eslint/no-explicit-any\n): ClockProps[\"clockFormat\"] => {\n switch (clockFormat) {\n case \"datetime\":\n case \"date\":\n case \"time\":\n return clockFormat;\n default:\n return \"datetime\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the clock props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function clockPropsDecoder(data: UnknownObject): ClockProps | never {\n if (\n typeof data.clockTimezone !== \"string\" ||\n data.clockTimezone.length === 0\n ) {\n throw new TypeError(\"invalid timezone.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.CLOCK,\n clockType: parseClockType(data.clockType),\n clockFormat: parseClockFormat(data.clockFormat),\n clockTimezone: data.clockTimezone,\n clockTimezoneOffset: parseIntOr(data.clockTimezoneOffset, 0),\n showClockTimezone: parseBoolean(data.showClockTimezone),\n color: notEmptyStringOr(data.color, null),\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Clock extends Item {\n public static readonly TICK_INTERVAL = 1000; // In ms.\n private intervalRef: number | null = null;\n\n public constructor(props: ClockProps) {\n // Call the superclass constructor.\n super(props);\n\n /* The item is already loaded and inserted into the DOM.\n * The class properties are now initialized.\n * Now you can modify the item, add event handlers, timers, etc.\n */\n\n /* The use of the arrow function is important here. startTick will\n * use the function passed as an argument to call the global setInterval\n * function. The interval, timeout or event functions, among other, are\n * called into another execution loop and using a different context.\n * The arrow functions, unlike the classic functions, doesn't create\n * their own context (this), so their context at execution time will be\n * use the current context at the declaration time.\n * http://es6-features.org/#Lexicalthis\n */\n this.startTick(\n () => {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n },\n /* The analogic clock doesn't need to tick,\n * but it will be refreshed every 20 seconds\n * to avoid a desync caused by page freezes.\n */\n this.props.clockType === \"analogic\" ? 20000 : Clock.TICK_INTERVAL\n );\n }\n\n /**\n * Wrap a window.clearInterval call.\n */\n private stopTick(): void {\n if (this.intervalRef !== null) {\n window.clearInterval(this.intervalRef);\n this.intervalRef = null;\n }\n }\n\n /**\n * Wrap a window.setInterval call.\n * @param handler Function to be called every time the interval\n * timer is reached.\n * @param interval Number in milliseconds for the interval timer.\n */\n private startTick(\n handler: TimerHandler,\n interval: number = Clock.TICK_INTERVAL\n ): void {\n this.stopTick();\n this.intervalRef = window.setInterval(handler, interval);\n }\n\n /**\n * Create a element which contains the DOM representation of the item.\n * @return DOM Element.\n * @override\n */\n protected createDomElement(): HTMLElement | never {\n return this.createClock();\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n * @override\n */\n public remove(): void {\n // Clear the interval.\n this.stopTick();\n // Call to the parent clean function.\n super.remove();\n }\n\n /**\n * @override Item.resizeElement\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n const { width: newWidth, height: newHeight } = this.getElementSize(\n width,\n height\n ); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n super.resizeElement(newWidth, newHeight);\n // Re-render the item to force it calculate a new font size.\n if (this.props.clockType === \"digital\") {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n }\n }\n\n /**\n * Create a element which contains a representation of a clock.\n * It choose between the clock types.\n * @return DOM Element.\n * @throws Error.\n */\n private createClock(): HTMLElement | never {\n switch (this.props.clockType) {\n case \"analogic\":\n return this.createAnalogicClock();\n case \"digital\":\n return this.createDigitalClock();\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n\n /**\n * Create a element which contains a representation of an analogic clock.\n * @return DOM Element.\n */\n private createAnalogicClock(): HTMLElement {\n const svgNS = \"http://www.w3.org/2000/svg\";\n const colors = {\n watchFace: \"#FFFFF0\",\n watchFaceBorder: \"#242124\",\n mark: \"#242124\",\n handDark: \"#242124\",\n handLight: \"#525252\",\n secondHand: \"#DC143C\"\n };\n\n const { width, height } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n\n const div = document.createElement(\"div\");\n div.className = \"analogic-clock\";\n div.style.width = `${width}px`;\n div.style.height = `${height}px`;\n\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Clock face.\n const clockFace = document.createElementNS(svgNS, \"g\");\n clockFace.setAttribute(\"class\", \"clockface\");\n const clockFaceBackground = document.createElementNS(svgNS, \"circle\");\n clockFaceBackground.setAttribute(\"cx\", \"50\");\n clockFaceBackground.setAttribute(\"cy\", \"50\");\n clockFaceBackground.setAttribute(\"r\", \"48\");\n clockFaceBackground.setAttribute(\"fill\", colors.watchFace);\n clockFaceBackground.setAttribute(\"stroke\", colors.watchFaceBorder);\n clockFaceBackground.setAttribute(\"stroke-width\", \"2\");\n clockFaceBackground.setAttribute(\"stroke-linecap\", \"round\");\n // Insert the clockface background into the clockface group.\n clockFace.append(clockFaceBackground);\n\n // Timezone complication.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const timezoneComplication = document.createElementNS(svgNS, \"text\");\n timezoneComplication.setAttribute(\"text-anchor\", \"middle\");\n timezoneComplication.setAttribute(\"font-size\", \"8\");\n timezoneComplication.setAttribute(\n \"transform\",\n \"translate(30 50) rotate(90)\" // Rotate to counter the clock rotation.\n );\n timezoneComplication.setAttribute(\"fill\", colors.mark);\n timezoneComplication.textContent = city;\n clockFace.append(timezoneComplication);\n }\n\n // Marks group.\n const marksGroup = document.createElementNS(svgNS, \"g\");\n marksGroup.setAttribute(\"class\", \"marks\");\n // Build the 12 hours mark.\n const mainMarkGroup = document.createElementNS(svgNS, \"g\");\n mainMarkGroup.setAttribute(\"class\", \"mark\");\n mainMarkGroup.setAttribute(\"transform\", \"translate(50 50)\");\n const mark1a = document.createElementNS(svgNS, \"line\");\n mark1a.setAttribute(\"x1\", \"36\");\n mark1a.setAttribute(\"y1\", \"0\");\n mark1a.setAttribute(\"x2\", \"46\");\n mark1a.setAttribute(\"y2\", \"0\");\n mark1a.setAttribute(\"stroke\", colors.mark);\n mark1a.setAttribute(\"stroke-width\", \"5\");\n const mark1b = document.createElementNS(svgNS, \"line\");\n mark1b.setAttribute(\"x1\", \"36\");\n mark1b.setAttribute(\"y1\", \"0\");\n mark1b.setAttribute(\"x2\", \"46\");\n mark1b.setAttribute(\"y2\", \"0\");\n mark1b.setAttribute(\"stroke\", colors.watchFace);\n mark1b.setAttribute(\"stroke-width\", \"1\");\n // Insert the 12 mark lines into their group.\n mainMarkGroup.append(mark1a, mark1b);\n // Insert the main mark into the marks group.\n marksGroup.append(mainMarkGroup);\n // Build the rest of the marks.\n for (let i = 1; i < 60; i++) {\n const mark = document.createElementNS(svgNS, \"line\");\n mark.setAttribute(\"y1\", \"0\");\n mark.setAttribute(\"y2\", \"0\");\n mark.setAttribute(\"stroke\", colors.mark);\n mark.setAttribute(\"transform\", `translate(50 50) rotate(${i * 6})`);\n\n if (i % 5 === 0) {\n mark.setAttribute(\"x1\", \"38\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", i % 15 === 0 ? \"2\" : \"1\");\n } else {\n mark.setAttribute(\"x1\", \"42\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", \"0.5\");\n }\n\n // Insert the mark into the marks group.\n marksGroup.append(mark);\n }\n\n /* Clock hands */\n\n // Hour hand.\n const hourHand = document.createElementNS(svgNS, \"g\");\n hourHand.setAttribute(\"class\", \"hour-hand\");\n hourHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const hourHandA = document.createElementNS(svgNS, \"line\");\n hourHandA.setAttribute(\"class\", \"hour-hand-a\");\n hourHandA.setAttribute(\"x1\", \"0\");\n hourHandA.setAttribute(\"y1\", \"0\");\n hourHandA.setAttribute(\"x2\", \"30\");\n hourHandA.setAttribute(\"y2\", \"0\");\n hourHandA.setAttribute(\"stroke\", colors.handLight);\n hourHandA.setAttribute(\"stroke-width\", \"4\");\n hourHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const hourHandB = document.createElementNS(svgNS, \"line\");\n hourHandB.setAttribute(\"class\", \"hour-hand-b\");\n hourHandB.setAttribute(\"x1\", \"0\");\n hourHandB.setAttribute(\"y1\", \"0\");\n hourHandB.setAttribute(\"x2\", \"29.9\");\n hourHandB.setAttribute(\"y2\", \"0\");\n hourHandB.setAttribute(\"stroke\", colors.handDark);\n hourHandB.setAttribute(\"stroke-width\", \"3.1\");\n hourHandB.setAttribute(\"stroke-linecap\", \"round\");\n // Append the elements to finish the hour hand.\n hourHand.append(hourHandA, hourHandB);\n\n // Minute hand.\n const minuteHand = document.createElementNS(svgNS, \"g\");\n minuteHand.setAttribute(\"class\", \"minute-hand\");\n minuteHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const minuteHandA = document.createElementNS(svgNS, \"line\");\n minuteHandA.setAttribute(\"class\", \"minute-hand-a\");\n minuteHandA.setAttribute(\"x1\", \"0\");\n minuteHandA.setAttribute(\"y1\", \"0\");\n minuteHandA.setAttribute(\"x2\", \"40\");\n minuteHandA.setAttribute(\"y2\", \"0\");\n minuteHandA.setAttribute(\"stroke\", colors.handLight);\n minuteHandA.setAttribute(\"stroke-width\", \"2\");\n minuteHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const minuteHandB = document.createElementNS(svgNS, \"line\");\n minuteHandB.setAttribute(\"class\", \"minute-hand-b\");\n minuteHandB.setAttribute(\"x1\", \"0\");\n minuteHandB.setAttribute(\"y1\", \"0\");\n minuteHandB.setAttribute(\"x2\", \"39.9\");\n minuteHandB.setAttribute(\"y2\", \"0\");\n minuteHandB.setAttribute(\"stroke\", colors.handDark);\n minuteHandB.setAttribute(\"stroke-width\", \"1.5\");\n minuteHandB.setAttribute(\"stroke-linecap\", \"round\");\n const minuteHandPin = document.createElementNS(svgNS, \"circle\");\n minuteHandPin.setAttribute(\"r\", \"3\");\n minuteHandPin.setAttribute(\"fill\", colors.handDark);\n // Append the elements to finish the minute hand.\n minuteHand.append(minuteHandA, minuteHandB, minuteHandPin);\n\n // Second hand.\n const secondHand = document.createElementNS(svgNS, \"g\");\n secondHand.setAttribute(\"class\", \"second-hand\");\n secondHand.setAttribute(\"transform\", \"translate(50 50)\");\n const secondHandBar = document.createElementNS(svgNS, \"line\");\n secondHandBar.setAttribute(\"x1\", \"0\");\n secondHandBar.setAttribute(\"y1\", \"0\");\n secondHandBar.setAttribute(\"x2\", \"46\");\n secondHandBar.setAttribute(\"y2\", \"0\");\n secondHandBar.setAttribute(\"stroke\", colors.secondHand);\n secondHandBar.setAttribute(\"stroke-width\", \"1\");\n secondHandBar.setAttribute(\"stroke-linecap\", \"round\");\n const secondHandPin = document.createElementNS(svgNS, \"circle\");\n secondHandPin.setAttribute(\"r\", \"2\");\n secondHandPin.setAttribute(\"fill\", colors.secondHand);\n // Append the elements to finish the second hand.\n secondHand.append(secondHandBar, secondHandPin);\n\n // Pin.\n const pin = document.createElementNS(svgNS, \"circle\");\n pin.setAttribute(\"cx\", \"50\");\n pin.setAttribute(\"cy\", \"50\");\n pin.setAttribute(\"r\", \"0.3\");\n pin.setAttribute(\"fill\", colors.handDark);\n\n // Get the hand angles.\n const date = this.getOriginDate();\n const seconds = date.getSeconds();\n const minutes = date.getMinutes();\n const hours = date.getHours();\n const secAngle = (360 / 60) * seconds;\n const minuteAngle = (360 / 60) * minutes + (360 / 60) * (seconds / 60);\n const hourAngle = (360 / 12) * hours + (360 / 12) * (minutes / 60);\n // Set the clock time by moving the hands.\n hourHand.setAttribute(\"transform\", `translate(50 50) rotate(${hourAngle})`);\n minuteHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${minuteAngle})`\n );\n secondHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${secAngle})`\n );\n\n // Build the clock\n svg.append(clockFace, marksGroup, hourHand, minuteHand, secondHand, pin);\n // Rotate the clock to its normal position.\n svg.setAttribute(\"transform\", \"rotate(-90)\");\n\n /* Add the animation declaration to the container.\n * Since the animation keyframes need to know the\n * start angle, this angle is dynamic (current time),\n * and we can't edit keyframes through javascript\n * safely and with backwards compatibility, we need\n * to inject it.\n */\n div.innerHTML = `\n \n `;\n // Add the clock to the container\n div.append(svg);\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n div.append(dateElem);\n }\n\n return div;\n }\n\n /**\n * Create a element which contains a representation of a digital clock.\n * @return DOM Element.\n */\n private createDigitalClock(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"digital-clock\";\n\n const { width } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const tzFontSizeMultiplier = 6 / this.props.clockTimezone.length;\n const timeFontSize = (baseTimeFontSize * width) / 100;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n const tzFontSize = Math.min(\n (baseTimeFontSize * tzFontSizeMultiplier * width) / 100,\n (width / 100) * 10\n );\n\n // Date calculated using the original timezone.\n const date = this.getOriginDate();\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n element.append(dateElem);\n }\n\n // Time.\n const timeElem: HTMLSpanElement = document.createElement(\"span\");\n timeElem.className = \"time\";\n timeElem.textContent = humanTime(date);\n timeElem.style.fontSize = `${timeFontSize}px`;\n if (this.props.color) timeElem.style.color = this.props.color;\n element.append(timeElem);\n\n // City name.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const tzElem: HTMLSpanElement = document.createElement(\"span\");\n tzElem.className = \"timezone\";\n tzElem.textContent = city;\n tzElem.style.fontSize = `${tzFontSize}px`;\n if (this.props.color) tzElem.style.color = this.props.color;\n element.append(tzElem);\n }\n\n return element;\n }\n\n /**\n * Generate the current date using the timezone offset stored into the properties.\n * @return The current date.\n */\n private getOriginDate(initialDate: Date | null = null): Date {\n const d = initialDate ? initialDate : new Date();\n const targetTZOffset = this.props.clockTimezoneOffset * 1000; // In ms.\n const localTZOffset = d.getTimezoneOffset() * 60 * 1000; // In ms.\n const utimestamp = d.getTime() + targetTZOffset + localTZOffset;\n\n return new Date(utimestamp);\n }\n\n /**\n * Extract a human readable city name from the timezone text.\n * @param timezone Timezone text.\n */\n public getHumanTimezone(timezone: string = this.props.clockTimezone): string {\n const [, city = \"\"] = timezone.split(\"/\");\n return city.replace(\"_\", \" \");\n }\n\n /**\n * Generate a element size using the current size and the default values.\n * @return The size.\n */\n private getElementSize(\n width: number = this.props.width,\n height: number = this.props.height\n ): Size {\n switch (this.props.clockType) {\n case \"analogic\": {\n let diameter = 100; // Default value.\n\n if (width > 0 && height > 0) {\n diameter = Math.min(width, height);\n } else if (width > 0) {\n diameter = width;\n } else if (height > 0) {\n diameter = height;\n }\n\n return {\n width: diameter,\n height: diameter\n };\n }\n case \"digital\": {\n if (width > 0 && height > 0) {\n // The proportion of the clock should be (width = height / 2) aproximately.\n height = width / 2 < height ? width / 2 : height;\n } else if (width > 0) {\n height = width / 2;\n } else if (height > 0) {\n // The proportion of the clock should be (height * 2 = width) aproximately.\n width = height * 2;\n } else {\n width = 100; // Default value.\n height = 50; // Default value.\n }\n\n return {\n width,\n height\n };\n }\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n}\n","import { UnknownObject } from \"../types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface BoxProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.BOX_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n borderWidth: number;\n borderColor: string | null;\n fillColor: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function boxPropsDecoder(data: UnknownObject): BoxProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BOX_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Custom properties.\n borderWidth: parseIntOr(data.borderWidth, 0),\n borderColor: notEmptyStringOr(data.borderColor, null),\n fillColor: notEmptyStringOr(data.fillColor, null)\n };\n}\n\nexport default class Box extends Item {\n protected createDomElement(): HTMLElement {\n const box: HTMLDivElement = document.createElement(\"div\");\n box.className = \"box\";\n // To prevent this item to expand beyond its parent.\n box.style.boxSizing = \"border-box\";\n\n if (this.props.fillColor) {\n box.style.backgroundColor = this.props.fillColor;\n }\n\n // Border.\n if (this.props.borderWidth > 0) {\n box.style.borderStyle = \"solid\";\n // Control the max width to prevent this item to expand beyond its parent.\n const maxBorderWidth = Math.min(this.props.width, this.props.height) / 2;\n const borderWidth = Math.min(this.props.borderWidth, maxBorderWidth);\n box.style.borderWidth = `${borderWidth}px`;\n\n if (this.props.borderColor) {\n box.style.borderColor = this.props.borderColor;\n }\n }\n\n return box;\n }\n}\n","import { UnknownObject, Position, Size } from \"../types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface LineProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.LINE_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n startPosition: Position;\n endPosition: Position;\n lineWidth: number;\n color: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function linePropsDecoder(data: UnknownObject): LineProps | never {\n const props: LineProps = {\n ...itemBasePropsDecoder({ ...data, width: 1, height: 1 }), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LINE_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Initialize Position & Size.\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n // Custom properties.\n startPosition: {\n x: parseIntOr(data.startX, 0),\n y: parseIntOr(data.startY, 0)\n },\n endPosition: {\n x: parseIntOr(data.endX, 0),\n y: parseIntOr(data.endY, 0)\n },\n lineWidth: parseIntOr(data.lineWidth || data.borderWidth, 1),\n color: notEmptyStringOr(data.borderColor || data.color, null)\n };\n\n /*\n * We need to enhance the props with the extracted size and position\n * of the box cause there are missing at the props update. A better\n * solution would be overriding the props setter to do it there, but\n * the language doesn't allow it while targetting ES5.\n * TODO: We need to figure out a more consistent solution.\n */\n\n return {\n ...props,\n // Enhance the props extracting the box size and position.\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n ...Line.extractBoxSizeAndPosition(props)\n };\n}\n\nexport default class Line extends Item {\n /**\n * @override\n */\n public constructor(props: LineProps) {\n /*\n * We need to override the constructor cause we need to obtain\n * the\n * box size and position from the start and finish points\n * of the line.\n */\n super({\n ...props,\n ...Line.extractBoxSizeAndPosition(props)\n });\n }\n\n /**\n * @override\n * To create the item's DOM representation.\n * @return Item.\n */\n protected createDomElement(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"line\";\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Set SVG size.\n svg.setAttribute(\n \"width\",\n (this.props.width + this.props.lineWidth).toString()\n );\n svg.setAttribute(\n \"height\",\n (this.props.height + this.props.lineWidth).toString()\n );\n const line = document.createElementNS(svgNS, \"line\");\n line.setAttribute(\n \"x1\",\n `${this.props.startPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y1\",\n `${this.props.startPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"x2\",\n `${this.props.endPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y2\",\n `${this.props.endPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\"stroke\", this.props.color || \"black\");\n line.setAttribute(\"stroke-width\", this.props.lineWidth.toString());\n\n svg.append(line);\n element.append(svg);\n\n return element;\n }\n\n /**\n * Extract the size and position of the box from\n * the start and the finish of the line.\n * @param props Item properties.\n */\n public static extractBoxSizeAndPosition(props: LineProps): Size & Position {\n return {\n width: Math.abs(props.startPosition.x - props.endPosition.x),\n height: Math.abs(props.startPosition.y - props.endPosition.y),\n x: Math.min(props.startPosition.x, props.endPosition.x),\n y: Math.min(props.startPosition.y, props.endPosition.y)\n };\n }\n}\n","import { LinkedVisualConsoleProps, UnknownObject } from \"../types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type LabelProps = {\n type: ItemType.LABEL;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the label props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function labelPropsDecoder(data: UnknownObject): LabelProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LABEL,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Label extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"label\";\n element.innerHTML = this.getLabelWithMacrosReplaced();\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n public createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","import {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n modulePropsDecoder,\n replaceMacros\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type SimpleValueProps = {\n type: ItemType.SIMPLE_VALUE;\n valueType: \"string\" | \"image\";\n value: string;\n} & (\n | {\n processValue: \"none\";\n }\n | {\n processValue: \"avg\" | \"max\" | \"min\";\n period: number;\n }) &\n ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw value type.\n * @param valueType Raw value.\n */\nconst parseValueType = (\n valueType: any // eslint-disable-line @typescript-eslint/no-explicit-any\n): SimpleValueProps[\"valueType\"] => {\n switch (valueType) {\n case \"string\":\n case \"image\":\n return valueType;\n default:\n return \"string\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw process value.\n * @param processValue Raw value.\n */\nconst parseProcessValue = (\n processValue: any // eslint-disable-line @typescript-eslint/no-explicit-any\n): SimpleValueProps[\"processValue\"] => {\n switch (processValue) {\n case \"none\":\n case \"avg\":\n case \"max\":\n case \"min\":\n return processValue;\n default:\n return \"none\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the simple value props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function simpleValuePropsDecoder(\n data: UnknownObject\n): SimpleValueProps | never {\n if (typeof data.value !== \"string\" || data.value.length === 0) {\n throw new TypeError(\"invalid value\");\n }\n\n const processValue = parseProcessValue(data.processValue);\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SIMPLE_VALUE,\n valueType: parseValueType(data.valueType),\n value: data.value,\n ...(processValue === \"none\"\n ? { processValue }\n : { processValue, period: parseIntOr(data.period, 0) }), // Object spread. It will merge the properties of the two objects.\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class SimpleValue extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"simple-value\";\n\n if (this.props.valueType === \"image\") {\n const img = document.createElement(\"img\");\n img.src = this.props.value;\n element.append(img);\n } else {\n // Add the value to the label and show it.\n let text = this.props.value;\n let label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n text = replaceMacros([{ macro: /\\(?_VALUE_\\)?/i, value: text }], label);\n }\n\n element.innerHTML = text;\n }\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","export var slice = Array.prototype.slice;\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default function() {}\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import noop from \"../noop\";\nimport {point} from \"./basis\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n","import {point} from \"./basis\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import noop from \"../noop\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","import ascending from \"./ascending\";\n\nexport default function(series) {\n return ascending(series).reverse();\n}\n","import { arc as arcFactory } from \"d3-shape\";\n\nimport {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n notEmptyStringOr,\n parseIntOr,\n parseFloatOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type PercentileProps = {\n type: ItemType.PERCENTILE_BAR;\n percentileType:\n | \"progress-bar\"\n | \"bubble\"\n | \"circular-progress-bar\"\n | \"circular-progress-bar-alt\";\n valueType: \"percent\" | \"value\";\n minValue: number | null;\n maxValue: number | null;\n color: string | null;\n labelColor: string | null;\n value: number | null;\n unit: string | null;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw type value.\n * @param type Raw value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractPercentileType(type: any): PercentileProps[\"percentileType\"] {\n switch (type) {\n case \"progress-bar\":\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n return type;\n default:\n case ItemType.PERCENTILE_BAR:\n return \"progress-bar\";\n case ItemType.PERCENTILE_BUBBLE:\n return \"bubble\";\n case ItemType.CIRCULAR_PROGRESS_BAR:\n return \"circular-progress-bar\";\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return \"circular-progress-bar-alt\";\n }\n}\n\n/**\n * Extract a valid enum value from a raw value type value.\n * @param type Raw value.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractValueType(valueType: any): PercentileProps[\"valueType\"] {\n switch (valueType) {\n case \"percent\":\n case \"value\":\n return valueType;\n default:\n return \"percent\";\n }\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the percentile props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function percentilePropsDecoder(\n data: UnknownObject\n): PercentileProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.PERCENTILE_BAR,\n percentileType: extractPercentileType(data.percentileType || data.type),\n valueType: extractValueType(data.valueType),\n minValue: parseIntOr(data.minValue, null),\n maxValue: parseIntOr(data.maxValue, null),\n color: notEmptyStringOr(data.color, null),\n labelColor: notEmptyStringOr(data.labelColor, null),\n value: parseFloatOr(data.value, null),\n unit: notEmptyStringOr(data.unit, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class Percentile extends Item {\n protected createDomElement(): HTMLElement {\n const colors = {\n background: \"#000000\",\n progress: this.props.color || \"#F0F0F0\",\n text: this.props.labelColor || \"#444444\"\n };\n // Progress.\n const progress = this.getProgress();\n // Main element.\n const element = document.createElement(\"div\");\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n\n var formatValue;\n if (this.props.value != null) {\n if (Intl) {\n formatValue = Intl.NumberFormat(\"en-EN\").format(this.props.value);\n } else {\n formatValue = this.props.value;\n }\n }\n\n switch (this.props.percentileType) {\n case \"progress-bar\":\n {\n const backgroundRect = document.createElementNS(svgNS, \"rect\");\n backgroundRect.setAttribute(\"fill\", colors.background);\n backgroundRect.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundRect.setAttribute(\"width\", \"100\");\n backgroundRect.setAttribute(\"height\", \"20\");\n backgroundRect.setAttribute(\"rx\", \"5\");\n backgroundRect.setAttribute(\"ry\", \"5\");\n const progressRect = document.createElementNS(svgNS, \"rect\");\n progressRect.setAttribute(\"fill\", colors.progress);\n progressRect.setAttribute(\"fill-opacity\", \"1\");\n progressRect.setAttribute(\"width\", `${progress}`);\n progressRect.setAttribute(\"height\", \"20\");\n progressRect.setAttribute(\"rx\", \"5\");\n progressRect.setAttribute(\"ry\", \"5\");\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"12\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"transform\", \"translate(50 11)\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\") {\n text.style.fontSize = \"6pt\";\n\n text.textContent = this.props.unit\n ? `${formatValue} ${this.props.unit}`\n : `${formatValue}`;\n } else {\n text.textContent = `${progress}%`;\n }\n\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 20\");\n svg.append(backgroundRect, progressRect, text);\n }\n break;\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n {\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n if (this.props.percentileType === \"bubble\") {\n // Create and append the circles.\n const backgroundCircle = document.createElementNS(svgNS, \"circle\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"r\", \"50\");\n const progressCircle = document.createElementNS(svgNS, \"circle\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\"r\", `${progress / 2}`);\n\n svg.append(backgroundCircle, progressCircle);\n } else {\n // Create and append the circles.\n const arcProps = {\n innerRadius:\n this.props.percentileType === \"circular-progress-bar\" ? 30 : 0,\n outerRadius: 50,\n startAngle: 0,\n endAngle: Math.PI * 2\n };\n const arc = arcFactory();\n\n const backgroundCircle = document.createElementNS(svgNS, \"path\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"d\", `${arc(arcProps)}`);\n const progressCircle = document.createElementNS(svgNS, \"path\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\n \"d\",\n `${arc({\n ...arcProps,\n endAngle: arcProps.endAngle * (progress / 100)\n })}`\n );\n\n svg.append(backgroundCircle, progressCircle);\n }\n\n // Create and append the text.\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"16\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\" && this.props.value != null) {\n // Show value and unit in 1 (no unit) or 2 lines.\n if (this.props.unit && this.props.unit.length > 0) {\n const value = document.createElementNS(svgNS, \"tspan\");\n value.setAttribute(\"x\", \"0\");\n value.setAttribute(\"dy\", \"1em\");\n value.textContent = `${formatValue}`;\n value.style.fontSize = \"8pt\";\n const unit = document.createElementNS(svgNS, \"tspan\");\n unit.setAttribute(\"x\", \"0\");\n unit.setAttribute(\"dy\", \"1em\");\n unit.textContent = `${this.props.unit}`;\n unit.style.fontSize = \"8pt\";\n text.append(value, unit);\n text.setAttribute(\"transform\", \"translate(50 33)\");\n } else {\n text.textContent = `${formatValue}`;\n text.style.fontSize = \"8pt\";\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n } else {\n // Percentage.\n text.textContent = `${progress}%`;\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n\n svg.append(text);\n }\n break;\n }\n\n element.append(svg);\n\n return element;\n }\n\n private getProgress(): number {\n const minValue = this.props.minValue || 0;\n const maxValue = this.props.maxValue || 100;\n const value = this.props.value || 100;\n\n if (value <= minValue) return 0;\n else if (value >= maxValue) return 100;\n else return ((value - minValue) / (maxValue - minValue)) * 100;\n }\n}\n","import { UnknownObject } from \"../types\";\nimport {\n stringIsEmpty,\n notEmptyStringOr,\n decodeBase64,\n parseIntOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ServiceProps = {\n type: ItemType.SERVICE;\n serviceId: number;\n imageSrc: string | null;\n statusImageSrc: string | null;\n encodedTitle: string | null;\n} & ItemProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the service props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function servicePropsDecoder(data: UnknownObject): ServiceProps | never {\n if (data.imageSrc !== null) {\n if (\n typeof data.statusImageSrc !== \"string\" ||\n data.imageSrc.statusImageSrc === 0\n ) {\n throw new TypeError(\"invalid status image src.\");\n }\n } else {\n if (stringIsEmpty(data.encodedTitle)) {\n throw new TypeError(\"missing encode tittle content.\");\n }\n }\n\n if (parseIntOr(data.serviceId, null) === null) {\n throw new TypeError(\"invalid service id.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SERVICE,\n serviceId: data.serviceId,\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n encodedTitle: notEmptyStringOr(data.encodedTitle, null)\n };\n}\n\nexport default class Service extends Item {\n public createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"service\";\n\n if (this.props.statusImageSrc !== null) {\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.encodedTitle !== null) {\n element.innerHTML = decodeBase64(this.props.encodedTitle);\n }\n\n return element;\n }\n}\n","import { UnknownObject, Size } from \"./types\";\nimport {\n parseBoolean,\n sizePropsDecoder,\n parseIntOr,\n notEmptyStringOr\n} from \"./lib\";\nimport Item, {\n ItemType,\n ItemProps,\n ItemClickEvent,\n ItemRemoveEvent\n} from \"./Item\";\nimport StaticGraph, { staticGraphPropsDecoder } from \"./items/StaticGraph\";\nimport Icon, { iconPropsDecoder } from \"./items/Icon\";\nimport ColorCloud, { colorCloudPropsDecoder } from \"./items/ColorCloud\";\nimport Group, { groupPropsDecoder } from \"./items/Group\";\nimport Clock, { clockPropsDecoder } from \"./items/Clock\";\nimport Box, { boxPropsDecoder } from \"./items/Box\";\nimport Line, { linePropsDecoder } from \"./items/Line\";\nimport Label, { labelPropsDecoder } from \"./items/Label\";\nimport SimpleValue, { simpleValuePropsDecoder } from \"./items/SimpleValue\";\nimport EventsHistory, {\n eventsHistoryPropsDecoder\n} from \"./items/EventsHistory\";\nimport Percentile, { percentilePropsDecoder } from \"./items/Percentile\";\nimport TypedEvent, { Disposable, Listener } from \"./TypedEvent\";\nimport DonutGraph, { donutGraphPropsDecoder } from \"./items/DonutGraph\";\nimport BarsGraph, { barsGraphPropsDecoder } from \"./items/BarsGraph\";\nimport ModuleGraph, { moduleGraphPropsDecoder } from \"./items/ModuleGraph\";\nimport Service, { servicePropsDecoder } from \"./items/Service\";\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction itemInstanceFrom(data: UnknownObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return new StaticGraph(staticGraphPropsDecoder(data));\n case ItemType.MODULE_GRAPH:\n return new ModuleGraph(moduleGraphPropsDecoder(data));\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return new SimpleValue(simpleValuePropsDecoder(data));\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return new Percentile(percentilePropsDecoder(data));\n case ItemType.LABEL:\n return new Label(labelPropsDecoder(data));\n case ItemType.ICON:\n return new Icon(iconPropsDecoder(data));\n case ItemType.SERVICE:\n return new Service(servicePropsDecoder(data));\n case ItemType.GROUP_ITEM:\n return new Group(groupPropsDecoder(data));\n case ItemType.BOX_ITEM:\n return new Box(boxPropsDecoder(data));\n case ItemType.LINE_ITEM:\n return new Line(linePropsDecoder(data));\n case ItemType.AUTO_SLA_GRAPH:\n return new EventsHistory(eventsHistoryPropsDecoder(data));\n case ItemType.DONUT_GRAPH:\n return new DonutGraph(donutGraphPropsDecoder(data));\n case ItemType.BARS_GRAPH:\n return new BarsGraph(barsGraphPropsDecoder(data));\n case ItemType.CLOCK:\n return new Clock(clockPropsDecoder(data));\n case ItemType.COLOR_CLOUD:\n return new ColorCloud(colorCloudPropsDecoder(data));\n default:\n throw new TypeError(\"item not found\");\n }\n}\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction decodeProps(data: UnknownObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return staticGraphPropsDecoder(data);\n case ItemType.MODULE_GRAPH:\n return moduleGraphPropsDecoder(data);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return simpleValuePropsDecoder(data);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return percentilePropsDecoder(data);\n case ItemType.LABEL:\n return labelPropsDecoder(data);\n case ItemType.ICON:\n return iconPropsDecoder(data);\n case ItemType.SERVICE:\n return servicePropsDecoder(data);\n case ItemType.GROUP_ITEM:\n return groupPropsDecoder(data);\n case ItemType.BOX_ITEM:\n return boxPropsDecoder(data);\n case ItemType.LINE_ITEM:\n return linePropsDecoder(data);\n case ItemType.AUTO_SLA_GRAPH:\n return eventsHistoryPropsDecoder(data);\n case ItemType.DONUT_GRAPH:\n return donutGraphPropsDecoder(data);\n case ItemType.BARS_GRAPH:\n return barsGraphPropsDecoder(data);\n case ItemType.CLOCK:\n return clockPropsDecoder(data);\n case ItemType.COLOR_CLOUD:\n return colorCloudPropsDecoder(data);\n default:\n throw new TypeError(\"decoder not found\");\n }\n}\n\n// Base properties.\nexport interface VisualConsoleProps extends Size {\n readonly id: number;\n name: string;\n groupId: number;\n backgroundURL: string | null; // URL?\n backgroundColor: string | null;\n isFavorite: boolean;\n relationLineWidth: number;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the Visual Console props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function visualConsolePropsDecoder(\n data: UnknownObject\n): VisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n id,\n name,\n groupId,\n backgroundURL,\n backgroundColor,\n isFavorite,\n relationLineWidth\n } = data;\n\n if (id == null || isNaN(parseInt(id))) {\n throw new TypeError(\"invalid Id.\");\n }\n if (typeof name !== \"string\" || name.length === 0) {\n throw new TypeError(\"invalid name.\");\n }\n if (groupId == null || isNaN(parseInt(groupId))) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n return {\n id: parseInt(id),\n name,\n groupId: parseInt(groupId),\n backgroundURL: notEmptyStringOr(backgroundURL, null),\n backgroundColor: notEmptyStringOr(backgroundColor, null),\n isFavorite: parseBoolean(isFavorite),\n relationLineWidth: parseIntOr(relationLineWidth, 0),\n ...sizePropsDecoder(data)\n };\n}\n\nexport default class VisualConsole {\n // Reference to the DOM element which will contain the items.\n private readonly containerRef: HTMLElement;\n // Properties.\n private _props: VisualConsoleProps;\n // Visual Console Item instances by their Id.\n private elementsById: {\n [key: number]: Item;\n } = {};\n // Visual Console Item Ids.\n private elementIds: ItemProps[\"id\"][] = [];\n // Dictionary which store the created lines.\n private relations: {\n [key: string]: Line;\n } = {};\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent<\n ItemClickEvent\n >();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n /**\n * React to a click on an element.\n * @param e Event object.\n */\n private handleElementClick: (e: ItemClickEvent) => void = e => {\n this.clickEventManager.emit(e);\n // console.log(`Clicked element #${e.data.id}`, e);\n };\n\n /**\n * Clear some element references.\n * @param e Event object.\n */\n private handleElementRemove: (e: ItemRemoveEvent) => void = e => {\n // Remove the element from the list and its relations.\n this.elementIds = this.elementIds.filter(id => id !== e.data.id);\n delete this.elementsById[e.data.id];\n this.clearRelations(e.data.id);\n };\n\n public constructor(\n container: HTMLElement,\n props: UnknownObject,\n items: UnknownObject[]\n ) {\n this.containerRef = container;\n this._props = visualConsolePropsDecoder(props);\n\n // Force the first render.\n this.render();\n\n // Sort by isOnTop, id ASC\n items = items.sort(function(a, b) {\n if (\n a.isOnTop == null ||\n b.isOnTop == null ||\n a.id == null ||\n b.id == null\n ) {\n return 0;\n }\n\n if (a.isOnTop && !b.isOnTop) return 1;\n else if (!a.isOnTop && b.isOnTop) return -1;\n else if (a.id < b.id) return 1;\n else return -1;\n });\n\n // Initialize the items.\n items.forEach(item => {\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n this.elementIds.push(itemInstance.props.id);\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n });\n\n // Create lines.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `elements` property.\n * @return Properties.\n */\n public get elements(): Item[] {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n return this.elementIds\n .map(id => this.elementsById[id])\n .filter(_ => _ != null) as Item[];\n }\n\n /**\n * Public setter of the `elements` property.\n * @param items.\n */\n public updateElements(items: UnknownObject[]): void {\n const itemIds = items.map(item => item.id || null).filter(id => id != null);\n itemIds as number[]; // Tell the type system to rely on us.\n // Get the elements we should delete.\n const deletedIds: number[] = this.elementIds.filter(\n id => itemIds.indexOf(id) < 0\n );\n // Delete the elements.\n deletedIds.forEach(id => {\n if (this.elementsById[id] != null) {\n this.elementsById[id].remove();\n delete this.elementsById[id];\n }\n });\n // Replace the element ids.\n this.elementIds = itemIds;\n\n // Initialize the items.\n items.forEach(item => {\n if (item.id) {\n if (this.elementsById[item.id] == null) {\n // New item.\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n } else {\n // Update item.\n try {\n this.elementsById[item.id].props = decodeProps(item);\n } catch (error) {\n console.log(\"Error updating an element:\", error.message);\n }\n }\n }\n });\n\n // Re-build relations.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): VisualConsoleProps {\n return { ...this._props }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: VisualConsoleProps) {\n const prevProps = this.props;\n // Update the internal props.\n this._props = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Re-render.\n this.render(prevProps);\n }\n\n /**\n * Recreate or update the HTMLElement which represents the Visual Console into the DOM.\n * @param prevProps If exists it will be used to only DOM updates instead of a full replace.\n */\n public render(prevProps: VisualConsoleProps | null = null): void {\n if (prevProps) {\n if (prevProps.backgroundURL !== this.props.backgroundURL) {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n }\n if (prevProps.backgroundColor !== this.props.backgroundColor) {\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n }\n if (this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n } else {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n this.resizeElement(this.props.width, this.props.height);\n }\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n public sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM container.\n * @param width\n * @param height\n */\n public resizeElement(width: number, height: number): void {\n this.containerRef.style.width = `${width}px`;\n this.containerRef.style.height = `${height}px`;\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.props = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n this.disposables.forEach(d => d.dispose()); // Arrow function.\n this.elements.forEach(e => e.remove()); // Arrow function.\n this.elementsById = {};\n this.elementIds = [];\n // Clear relations.\n this.clearRelations();\n // Clean container.\n this.containerRef.innerHTML = \"\";\n }\n\n /**\n * Create line elements which connect the elements with their parents.\n */\n private buildRelations(): void {\n // Clear relations.\n this.clearRelations();\n // Add relations.\n this.elements.forEach(item => {\n if (item.props.parentId !== null) {\n const parent = this.elementsById[item.props.parentId];\n const child = this.elementsById[item.props.id];\n if (parent && child) this.addRelationLine(parent, child);\n }\n });\n }\n\n /**\n * @param itemId Optional identifier of a parent or child item.\n * Remove the line elements which connect the elements with their parents.\n */\n private clearRelations(itemId?: number): void {\n if (itemId != null) {\n for (let key in this.relations) {\n const ids = key.split(\"|\");\n const parentId = Number.parseInt(ids[0]);\n const childId = Number.parseInt(ids[1]);\n\n if (itemId === parentId || itemId === childId) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n } else {\n for (let key in this.relations) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n }\n\n /**\n * Retrieve the line element which represent the relation between items.\n * @param parentId Identifier of the parent item.\n * @param childId Itentifier of the child item.\n * @return The line element or nothing.\n */\n private getRelationLine(parentId: number, childId: number): Line | null {\n const identifier = `${parentId}|${childId}`;\n return this.relations[identifier] || null;\n }\n\n /**\n * Add a new line item to represent a relation between the items.\n * @param parent Parent item.\n * @param child Child item.\n * @return Whether the line was added or not.\n */\n private addRelationLine(\n parent: Item,\n child: Item\n ): Line {\n const identifier = `${parent.props.id}|${child.props.id}`;\n if (this.relations[identifier] != null) {\n this.relations[identifier].remove();\n }\n\n // Get the items center.\n const startX = parent.props.x + parent.elementRef.clientWidth / 2;\n const startY =\n parent.props.y +\n (parent.elementRef.clientHeight - parent.labelElementRef.clientHeight) /\n 2;\n const endX = child.props.x + child.elementRef.clientWidth / 2;\n const endY =\n child.props.y +\n (child.elementRef.clientHeight - child.labelElementRef.clientHeight) / 2;\n\n const line = new Line(\n linePropsDecoder({\n id: 0,\n type: ItemType.LINE_ITEM,\n startX,\n startY,\n endX,\n endY,\n width: 0,\n height: 0,\n lineWidth: this.props.relationLineWidth,\n color: \"#CCCCCC\"\n })\n );\n // Save a reference to the line item.\n this.relations[identifier] = line;\n\n // Add the line to the DOM.\n line.elementRef.style.zIndex = \"0\";\n this.containerRef.append(line.elementRef);\n\n return line;\n }\n\n /**\n * Add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onClick(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n","/*\n * Useful resources.\n * http://es6-features.org/\n * http://exploringjs.com/es6\n * https://www.typescriptlang.org/\n */\n\nimport \"./main.css\"; // CSS import.\nimport VisualConsole from \"./VisualConsole\";\n\n// Export the VisualConsole class to the global object.\n\n// eslint-disable-next-line\n(window as any).VisualConsole = VisualConsole;\n"],"sourceRoot":""} +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/index.ts","webpack:///./src/Item.ts","webpack:///./src/TypedEvent.ts","webpack:///./src/items/EventsHistory.ts","webpack:///./src/items/DonutGraph.ts","webpack:///./src/items/BarsGraph.ts","webpack:///./src/items/ModuleGraph.ts","webpack:///./src/items/StaticGraph.ts","webpack:///./src/items/Icon.ts","webpack:///./src/items/ColorCloud.ts","webpack:///./src/items/Group.ts","webpack:///./src/items/Clock/index.ts","webpack:///./src/items/Box.ts","webpack:///./src/items/Line.ts","webpack:///./src/items/Label.ts","webpack:///./src/items/SimpleValue.ts","webpack:///./node_modules/d3-path/src/path.js","webpack:///./node_modules/d3-shape/src/constant.js","webpack:///./node_modules/d3-shape/src/math.js","webpack:///./node_modules/d3-shape/src/arc.js","webpack:///./node_modules/d3-shape/src/curve/linear.js","webpack:///./node_modules/d3-shape/src/curve/radial.js","webpack:///./node_modules/d3-shape/src/array.js","webpack:///./node_modules/d3-shape/src/symbol/diamond.js","webpack:///./node_modules/d3-shape/src/symbol/circle.js","webpack:///./node_modules/d3-shape/src/symbol/star.js","webpack:///./node_modules/d3-shape/src/noop.js","webpack:///./node_modules/d3-shape/src/symbol/triangle.js","webpack:///./node_modules/d3-shape/src/symbol/wye.js","webpack:///./node_modules/d3-shape/src/curve/basis.js","webpack:///./node_modules/d3-shape/src/curve/basisClosed.js","webpack:///./node_modules/d3-shape/src/curve/basisOpen.js","webpack:///./node_modules/d3-shape/src/curve/bundle.js","webpack:///./node_modules/d3-shape/src/curve/cardinal.js","webpack:///./node_modules/d3-shape/src/curve/cardinalClosed.js","webpack:///./node_modules/d3-shape/src/curve/cardinalOpen.js","webpack:///./node_modules/d3-shape/src/curve/catmullRom.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomClosed.js","webpack:///./node_modules/d3-shape/src/curve/catmullRomOpen.js","webpack:///./node_modules/d3-shape/src/curve/linearClosed.js","webpack:///./node_modules/d3-shape/src/curve/monotone.js","webpack:///./node_modules/d3-shape/src/curve/natural.js","webpack:///./node_modules/d3-shape/src/curve/step.js","webpack:///./node_modules/d3-shape/src/order/descending.js","webpack:///./src/items/Percentile.ts","webpack:///./src/items/Service.ts","webpack:///./src/VisualConsole.ts","webpack:///./src/lib/AsyncTaskManager.ts","webpack:///./src/index.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","parseIntOr","defaultValue","length","isNaN","parseInt","parseFloatOr","parseFloat","stringIsEmpty","notEmptyStringOr","parseBoolean","leftPad","pad","diffLength","substr","Math","abs","substring","repeatTimes","floor","restLength","newPad","positionPropsDecoder","data","x","y","sizePropsDecoder","width","height","TypeError","modulePropsDecoder","__assign","moduleName","moduleDescription","agentProps","agentId","agent","agentName","agentAlias","agentDescription","agentAddress","metaconsoleId","agentPropsDecoder","linkedVCPropsDecoder","id","linkedLayoutId","linkedLayoutAgentId","linkedLayoutStatusProps","linkedLayoutStatusType","weight","linkedLayoutStatusTypeWeight","warningThreshold","linkedLayoutStatusTypeWarningThreshold","criticalThreshold","linkedLayoutStatusTypeCriticalThreshold","linkedLayoutBaseProps","prefixedCssRules","ruleName","ruleValue","rule","decodeBase64","input","decodeURIComponent","escape","window","atob","humanDate","date","locale","Intl","DateTimeFormat","day","month","year","format","getDate","getMonth","getFullYear","humanTime","getHours","getMinutes","getSeconds","replaceMacros","macros","text","reduce","acc","_a","macro","replace","parseLabelPosition","labelPosition","itemBasePropsDecoder","type","label","_lib__WEBPACK_IMPORTED_MODULE_0__","isLinkEnabled","link","isOnTop","parentId","aclGroupId","VisualConsoleItem","props","this","clickEventManager","_TypedEvent__WEBPACK_IMPORTED_MODULE_1__","removeEventManager","disposables","itemProps","elementRef","createContainerDomElement","labelElementRef","createLabelDomElement","childElementRef","createDomElement","append","resizeElement","changeLabelPosition","box","_this","document","createElement","href","className","style","zIndex","left","top","onclick","e","emit","nativeEvent","element","getLabelWithMacrosReplaced","table","row","emptyRow1","emptyRow2","cell","innerHTML","textAlign","Date","updateDomElement","newProps","prevProps","shouldBeUpdated","render","positionChanged","moveElement","sizeChanged","oldLabelHtml","newLabelHtml","container","attrs","attributes","nodeName","setAttributeNode","parentNode","replaceChild","remove","forEach","disposable","dispose","ignored","prevPosition","newPosition","position","flexDirection","tables","getElementsByTagName","item","move","prevSize","newSize","resize","onClick","listener","on","push","onRemove","__webpack_exports__","TypedEvent","listeners","listenersOncer","off","once","callbackIndex","indexOf","splice","event","pipe","te","eventsHistoryPropsDecoder","html","encodedHtml","_Item__WEBPACK_IMPORTED_MODULE_1__","maxTime","EventsHistory","_super","__extends","scripts","src","setTimeout","eval","trim","aux","donutGraphPropsDecoder","DonutGraph","barsGraphPropsDecoder","BarsGraph","moduleGraphPropsDecoder","ModuleGraph","legendP","margin","overviewGraphs","getElementsByClassName","parseShowLastValueTooltip","showLastValueTooltip","staticGraphPropsDecoder","imageSrc","Item","statusImageSrc","lib","lastValue","StaticGraph","imgSrc","background","backgroundSize","backgroundPosition","setAttribute","iconPropsDecoder","Icon_assign","Icon","Icon_extends","colorCloudPropsDecoder","color","ColorCloud_assign","ColorCloud_svgNS","ColorCloud","ColorCloud_extends","createSvgElement","gradientId","svg","createElementNS","defs","radialGradient","stop0","stop100","circle","groupPropsDecoder","groupId","showStatistics","extractHtml","Group_assign","Group","Group_extends","parseClockType","clockType","parseClockFormat","clockFormat","clockPropsDecoder","clockTimezone","Clock_assign","clockTimezoneOffset","showClockTimezone","items_Clock","Clock","intervalRef","startTick","createClock","TICK_INTERVAL","Clock_extends","stopTick","clearInterval","handler","interval","setInterval","getElementSize","newWidth","newHeight","createAnalogicClock","createDigitalClock","Error","svgNS","colors","dateFontSize","baseTimeFontSize","div","clockFace","clockFaceBackground","city","getHumanTimezone","timezoneComplication","textContent","marksGroup","mainMarkGroup","mark1a","mark1b","mark","hourHand","hourHandA","hourHandB","minuteHand","minuteHandA","minuteHandB","minuteHandPin","secondHand","secondHandBar","secondHandPin","pin","getOriginDate","seconds","minutes","secAngle","minuteAngle","hourAngle","join","dateElem","fontSize","tzFontSizeMultiplier","timeFontSize","tzFontSize","min","timeElem","tzElem","initialDate","targetTZOffset","localTZOffset","getTimezoneOffset","utimestamp","getTime","timezone","_b","split","diameter","boxPropsDecoder","Box_assign","borderWidth","borderColor","fillColor","Box","Box_extends","boxSizing","backgroundColor","borderStyle","maxBorderWidth","linePropsDecoder","Line_assign","startPosition","startX","startY","endPosition","endX","endY","lineWidth","Line","extractBoxSizeAndPosition","Line_extends","toString","line","labelPropsDecoder","Label_assign","Label","Label_extends","parseValueType","valueType","parseProcessValue","processValue","simpleValuePropsDecoder","SimpleValue_assign","period","SimpleValue","SimpleValue_extends","img","pi","PI","tau","tauEpsilon","Path","_x0","_y0","_x1","_y1","_","path","constructor","moveTo","closePath","lineTo","quadraticCurveTo","x1","y1","bezierCurveTo","x2","y2","arcTo","x0","y0","x21","y21","x01","y01","l01_2","x20","y20","l21_2","l20_2","l21","sqrt","l01","tan","acos","t01","t21","arc","a0","a1","ccw","dx","cos","dy","sin","cw","da","rect","w","h","src_path","constant","atan2","max","math_epsilon","math_pi","halfPi","math_tau","asin","arcInnerRadius","innerRadius","arcOuterRadius","outerRadius","arcStartAngle","startAngle","arcEndAngle","endAngle","arcPadAngle","padAngle","cornerTangents","r1","rc","lo","ox","oy","x11","y11","x10","y10","x00","y00","d2","D","cx0","cy0","cx1","cy1","dx0","dy0","dx1","dy1","cx","cy","src_arc","cornerRadius","padRadius","context","buffer","r0","apply","arguments","t0","t1","a01","a11","a00","a10","da0","da1","ap","rp","rc0","rc1","p0","p1","oc","x3","y3","x32","y32","intersect","ax","ay","bx","by","kc","lc","centroid","a","Linear","_context","areaStart","_line","areaEnd","NaN","lineStart","_point","lineEnd","point","linear","curveRadial","Radial","curve","_curve","radial","Array","slice","kr","noop","that","Basis","BasisClosed","_x2","_x3","_x4","_y2","_y3","_y4","BasisOpen","Bundle","beta","_basis","_beta","_x","_y","j","custom","bundle","cardinal_point","_k","Cardinal","tension","cardinal","CardinalClosed","_x5","_y5","CardinalOpen","catmullRom_point","_l01_a","_l01_2a","_l12_a","_l12_2a","_l23_a","b","_l23_2a","CatmullRom","alpha","_alpha","x23","y23","pow","catmullRom","CatmullRomClosed","CatmullRomOpen","LinearClosed","sign","slope3","h0","h1","s0","s1","slope2","monotone_point","MonotoneX","MonotoneY","ReflectContext","Natural","controlPoints","_t0","px","py","i0","i1","Step","_t","extractPercentileType","extractValueType","percentilePropsDecoder","Percentile_assign","percentileType","minValue","maxValue","labelColor","unit","Percentile_svgNS","Percentile","Percentile_extends","formatValue","progress","getProgress","NumberFormat","backgroundRect","progressRect","backgroundCircle","progressCircle","arcProps","trunc","servicePropsDecoder","encodedTitle","serviceId","Service_assign","Service","Service_extends","itemInstanceFrom","items_StaticGraph","items_SimpleValue","items_Percentile","items_Label","items_Icon","items_Service","items_Group","items_Box","items_Line","items_ColorCloud","VisualConsole","items","elementsById","elementIds","relations","handleElementClick","handleElementRemove","filter","clearRelations","containerRef","_props","backgroundURL","isFavorite","relationLineWidth","VisualConsole_assign","visualConsolePropsDecoder","sort","itemInstance","error","console","log","message","buildRelations","map","updateElements","itemIds","decodeProps","backgroundImage","elements","parent_1","child","addRelationLine","itemId","ids","Number","childId","getRelationLine","identifier","parent","clientWidth","clientHeight","AsyncTaskManager_AsyncTask","AsyncTask","taskInitiator","cancellable","cancel","_status","statusChangeEventManager","status","init","onStatusChange","AsyncTaskManager","tasks","add","asyncTask","task","ref","clearTimeout","asyncPeriodic","src_VisualConsole","lib_AsyncTaskManager"],"mappings":"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","file":"vc.main.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 9);\n","import {\n UnknownObject,\n Position,\n Size,\n WithAgentProps,\n WithModuleProps,\n LinkedVisualConsoleProps,\n LinkedVisualConsolePropsStatus\n} from \"../types\";\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseIntOr(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\" && value.length > 0 && !isNaN(parseInt(value)))\n return parseInt(value);\n else return defaultValue;\n}\n\n/**\n * Return a number or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid number.\n * @param defaultValue Default value to use if we cannot extract a valid number.\n * @return A valid number or the default value.\n */\nexport function parseFloatOr(value: unknown, defaultValue: T): number | T {\n if (typeof value === \"number\") return value;\n if (\n typeof value === \"string\" &&\n value.length > 0 &&\n !isNaN(parseFloat(value))\n )\n return parseFloat(value);\n else return defaultValue;\n}\n\n/**\n * Check if a string exists and it's not empty.\n * @param value Value to check.\n * @return The check result.\n */\nexport function stringIsEmpty(value?: string | null): boolean {\n return value == null || value.length === 0;\n}\n\n/**\n * Return a not empty string or a default value from a raw value.\n * @param value Raw value from which we will try to extract a non empty string.\n * @param defaultValue Default value to use if we cannot extract a non empty string.\n * @return A non empty string or the default value.\n */\nexport function notEmptyStringOr(\n value: unknown,\n defaultValue: T\n): string | T {\n return typeof value === \"string\" && value.length > 0 ? value : defaultValue;\n}\n\n/**\n * Return a boolean from a raw value.\n * @param value Raw value from which we will try to extract the boolean.\n * @return A valid boolean value. false by default.\n */\nexport function parseBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") return value;\n else if (typeof value === \"number\") return value > 0;\n else if (typeof value === \"string\") return value === \"1\" || value === \"true\";\n else return false;\n}\n\n/**\n * Pad the current string with another string (multiple times, if needed)\n * until the resulting string reaches the given length.\n * The padding is applied from the start (left) of the current string.\n * @param value Text that needs to be padded.\n * @param length Length of the returned text.\n * @param pad Text to add.\n * @return Padded text.\n */\nexport function leftPad(\n value: string | number,\n length: number,\n pad: string | number = \" \"\n): string {\n if (typeof value === \"number\") value = `${value}`;\n if (typeof pad === \"number\") pad = `${pad}`;\n\n const diffLength = length - value.length;\n if (diffLength === 0) return value;\n if (diffLength < 0) return value.substr(Math.abs(diffLength));\n\n if (diffLength === pad.length) return `${pad}${value}`;\n if (diffLength < pad.length) return `${pad.substring(0, diffLength)}${value}`;\n\n const repeatTimes = Math.floor(diffLength / pad.length);\n const restLength = diffLength - pad.length * repeatTimes;\n\n let newPad = \"\";\n for (let i = 0; i < repeatTimes; i++) newPad += pad;\n\n if (restLength === 0) return `${newPad}${value}`;\n return `${newPad}${pad.substring(0, restLength)}${value}`;\n}\n\n/* Decoders */\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the position.\n */\nexport function positionPropsDecoder(data: UnknownObject): Position {\n return {\n x: parseIntOr(data.x, 0),\n y: parseIntOr(data.y, 0)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the size.\n * @throws Will throw a TypeError if the width and height are not valid numbers.\n */\nexport function sizePropsDecoder(data: UnknownObject): Size | never {\n if (\n data.width == null ||\n isNaN(parseInt(data.width)) ||\n data.height == null ||\n isNaN(parseInt(data.height))\n ) {\n throw new TypeError(\"invalid size.\");\n }\n\n return {\n width: parseInt(data.width),\n height: parseInt(data.height)\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the agent properties.\n */\nexport function agentPropsDecoder(data: UnknownObject): WithAgentProps {\n const agentProps: WithAgentProps = {\n agentId: parseIntOr(data.agent, null),\n agentName: notEmptyStringOr(data.agentName, null),\n agentAlias: notEmptyStringOr(data.agentAlias, null),\n agentDescription: notEmptyStringOr(data.agentDescription, null),\n agentAddress: notEmptyStringOr(data.agentAddress, null)\n };\n\n return data.metaconsoleId != null\n ? {\n metaconsoleId: data.metaconsoleId,\n ...agentProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : agentProps;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the module and agent properties.\n */\nexport function modulePropsDecoder(data: UnknownObject): WithModuleProps {\n return {\n moduleId: parseIntOr(data.moduleId, null),\n moduleName: notEmptyStringOr(data.moduleName, null),\n moduleDescription: notEmptyStringOr(data.moduleDescription, null),\n ...agentPropsDecoder(data) // Object spread: http://es6-features.org/#SpreadOperator\n };\n}\n\n/**\n * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the linked visual console properties.\n * @throws Will throw a TypeError if the status calculation properties are invalid.\n */\nexport function linkedVCPropsDecoder(\n data: UnknownObject\n): LinkedVisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n metaconsoleId,\n linkedLayoutId: id,\n linkedLayoutAgentId: agentId\n } = data;\n\n let linkedLayoutStatusProps: LinkedVisualConsolePropsStatus = {\n linkedLayoutStatusType: \"default\"\n };\n switch (data.linkedLayoutStatusType) {\n case \"weight\": {\n const weight = parseIntOr(data.linkedLayoutStatusTypeWeight, null);\n if (weight == null)\n throw new TypeError(\"invalid status calculation properties.\");\n\n if (data.linkedLayoutStatusTypeWeight)\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"weight\",\n linkedLayoutStatusTypeWeight: weight\n };\n break;\n }\n case \"service\": {\n const warningThreshold = parseIntOr(\n data.linkedLayoutStatusTypeWarningThreshold,\n null\n );\n const criticalThreshold = parseIntOr(\n data.linkedLayoutStatusTypeCriticalThreshold,\n null\n );\n if (warningThreshold == null || criticalThreshold == null) {\n throw new TypeError(\"invalid status calculation properties.\");\n }\n\n linkedLayoutStatusProps = {\n linkedLayoutStatusType: \"service\",\n linkedLayoutStatusTypeWarningThreshold: warningThreshold,\n linkedLayoutStatusTypeCriticalThreshold: criticalThreshold\n };\n break;\n }\n }\n\n const linkedLayoutBaseProps = {\n linkedLayoutId: parseIntOr(id, null),\n linkedLayoutAgentId: parseIntOr(agentId, null),\n ...linkedLayoutStatusProps // Object spread: http://es6-features.org/#SpreadOperator\n };\n\n return metaconsoleId != null\n ? {\n metaconsoleId,\n ...linkedLayoutBaseProps // Object spread: http://es6-features.org/#SpreadOperator\n }\n : linkedLayoutBaseProps;\n}\n\n/**\n * To get a CSS rule with the most used prefixes.\n * @param ruleName Name of the CSS rule.\n * @param ruleValue Value of the CSS rule.\n * @return An array of rules with the prefixes applied.\n */\nexport function prefixedCssRules(\n ruleName: string,\n ruleValue: string\n): string[] {\n const rule = `${ruleName}: ${ruleValue};`;\n return [\n `-webkit-${rule}`,\n `-moz-${rule}`,\n `-ms-${rule}`,\n `-o-${rule}`,\n `${rule}`\n ];\n}\n\n/**\n * Decode a base64 string.\n * @param input Data encoded using base64.\n * @return Decoded data.\n */\nexport function decodeBase64(input: string): string {\n return decodeURIComponent(escape(window.atob(input)));\n}\n\n/**\n * Generate a date representation with the format 'd/m/Y'.\n * @param initialDate Date to be used instead of a generated one.\n * @param locale Locale to use if localization is required and available.\n * @example 24/02/2020.\n * @return Date representation.\n */\nexport function humanDate(date: Date, locale: string | null = null): string {\n if (locale && Intl && Intl.DateTimeFormat) {\n // Format using the user locale.\n const options: Intl.DateTimeFormatOptions = {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\"\n };\n return Intl.DateTimeFormat(locale, options).format(date);\n } else {\n // Use getDate, getDay returns the week day.\n const day = leftPad(date.getDate(), 2, 0);\n // The getMonth function returns the month starting by 0.\n const month = leftPad(date.getMonth() + 1, 2, 0);\n const year = leftPad(date.getFullYear(), 4, 0);\n\n // Format: 'd/m/Y'.\n return `${day}/${month}/${year}`;\n }\n}\n\n/**\n * Generate a time representation with the format 'hh:mm:ss'.\n * @param initialDate Date to be used instead of a generated one.\n * @example 01:34:09.\n * @return Time representation.\n */\nexport function humanTime(date: Date): string {\n const hours = leftPad(date.getHours(), 2, 0);\n const minutes = leftPad(date.getMinutes(), 2, 0);\n const seconds = leftPad(date.getSeconds(), 2, 0);\n\n return `${hours}:${minutes}:${seconds}`;\n}\n\ninterface Macro {\n macro: string | RegExp;\n value: string;\n}\n/**\n * Replace the macros of a text.\n * @param macros List of macros and their replacements.\n * @param text Text in which we need to replace the macros.\n */\nexport function replaceMacros(macros: Macro[], text: string): string {\n return macros.reduce(\n (acc, { macro, value }) => acc.replace(macro, value),\n text\n );\n}\n","import { Position, Size, UnknownObject, WithModuleProps } from \"./types\";\nimport {\n sizePropsDecoder,\n positionPropsDecoder,\n parseIntOr,\n parseBoolean,\n notEmptyStringOr,\n replaceMacros,\n humanDate,\n humanTime\n} from \"./lib\";\nimport TypedEvent, { Listener, Disposable } from \"./TypedEvent\";\n\n// Enum: https://www.typescriptlang.org/docs/handbook/enums.html.\nexport const enum ItemType {\n STATIC_GRAPH = 0,\n MODULE_GRAPH = 1,\n SIMPLE_VALUE = 2,\n PERCENTILE_BAR = 3,\n LABEL = 4,\n ICON = 5,\n SIMPLE_VALUE_MAX = 6,\n SIMPLE_VALUE_MIN = 7,\n SIMPLE_VALUE_AVG = 8,\n PERCENTILE_BUBBLE = 9,\n SERVICE = 10,\n GROUP_ITEM = 11,\n BOX_ITEM = 12,\n LINE_ITEM = 13,\n AUTO_SLA_GRAPH = 14,\n CIRCULAR_PROGRESS_BAR = 15,\n CIRCULAR_INTERIOR_PROGRESS_BAR = 16,\n DONUT_GRAPH = 17,\n BARS_GRAPH = 18,\n CLOCK = 19,\n COLOR_CLOUD = 20\n}\n\n// Base item properties. This interface should be extended by the item implementations.\nexport interface ItemProps extends Position, Size {\n readonly id: number;\n readonly type: ItemType;\n label: string | null;\n labelPosition: \"up\" | \"right\" | \"down\" | \"left\";\n isLinkEnabled: boolean;\n link: string | null;\n isOnTop: boolean;\n parentId: number | null;\n aclGroupId: number | null;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemClickEvent {\n // data: Props;\n data: UnknownObject;\n nativeEvent: Event;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemRemoveEvent {\n // data: Props;\n data: UnknownObject;\n}\n\n/**\n * Extract a valid enum value from a raw label positi9on value.\n * @param labelPosition Raw value.\n */\nconst parseLabelPosition = (\n labelPosition: unknown\n): ItemProps[\"labelPosition\"] => {\n switch (labelPosition) {\n case \"up\":\n case \"right\":\n case \"down\":\n case \"left\":\n return labelPosition;\n default:\n return \"down\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function itemBasePropsDecoder(data: UnknownObject): ItemProps | never {\n if (data.id == null || isNaN(parseInt(data.id))) {\n throw new TypeError(\"invalid id.\");\n }\n if (data.type == null || isNaN(parseInt(data.type))) {\n throw new TypeError(\"invalid type.\");\n }\n\n return {\n id: parseInt(data.id),\n type: parseInt(data.type),\n label: notEmptyStringOr(data.label, null),\n labelPosition: parseLabelPosition(data.labelPosition),\n isLinkEnabled: parseBoolean(data.isLinkEnabled),\n link: notEmptyStringOr(data.link, null),\n isOnTop: parseBoolean(data.isOnTop),\n parentId: parseIntOr(data.parentId, null),\n aclGroupId: parseIntOr(data.aclGroupId, null),\n ...sizePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...positionPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\n/**\n * Base class of the visual console items. Should be extended to use its capabilities.\n */\nabstract class VisualConsoleItem {\n // Properties of the item.\n private itemProps: Props;\n // Reference to the DOM element which will contain the item.\n public elementRef: HTMLElement;\n public readonly labelElementRef: HTMLElement;\n // Reference to the DOM element which will contain the view of the item which extends this class.\n protected readonly childElementRef: HTMLElement;\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent>();\n // Event manager for remove events.\n private readonly removeEventManager = new TypedEvent<\n ItemRemoveEvent\n >();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n /**\n * To create a new element which will be inside the item box.\n * @return Item.\n */\n protected abstract createDomElement(): HTMLElement;\n\n public constructor(props: Props) {\n this.itemProps = props;\n\n /*\n * Get a HTMLElement which represents the container box\n * of the Visual Console item. This element will manage\n * all the common things like click events, show a border\n * when hovered, etc.\n */\n this.elementRef = this.createContainerDomElement();\n this.labelElementRef = this.createLabelDomElement();\n\n /*\n * Get a HTMLElement which represents the custom view\n * of the Visual Console item. This element will be\n * different depending on the item implementation.\n */\n this.childElementRef = this.createDomElement();\n\n // Insert the elements into the container.\n this.elementRef.append(this.childElementRef, this.labelElementRef);\n\n // Resize element.\n this.resizeElement(props.width, props.height);\n // Set label position.\n this.changeLabelPosition(props.labelPosition);\n }\n\n /**\n * To create a new box for the visual console item.\n * @return Item box.\n */\n private createContainerDomElement(): HTMLElement {\n let box;\n if (this.props.isLinkEnabled) {\n box = document.createElement(\"a\");\n box as HTMLAnchorElement;\n if (this.props.link) box.href = this.props.link;\n } else {\n box = document.createElement(\"div\");\n box as HTMLDivElement;\n }\n\n box.className = \"visual-console-item\";\n box.style.zIndex = this.props.isOnTop ? \"2\" : \"1\";\n box.style.left = `${this.props.x}px`;\n box.style.top = `${this.props.y}px`;\n box.onclick = e =>\n this.clickEventManager.emit({ data: this.props, nativeEvent: e });\n\n return box;\n }\n\n /**\n * To create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Add the label if it exists.\n const label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n // Ugly table we need to use to replicate the legacy style.\n const table = document.createElement(\"table\");\n const row = document.createElement(\"tr\");\n const emptyRow1 = document.createElement(\"tr\");\n const emptyRow2 = document.createElement(\"tr\");\n const cell = document.createElement(\"td\");\n\n cell.innerHTML = label;\n row.append(cell);\n table.append(emptyRow1, row, emptyRow2);\n table.style.textAlign = \"center\";\n\n // Change the table size depending on its position.\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n\n // element.innerHTML = this.props.label;\n element.append(table);\n }\n\n return element;\n }\n\n /**\n * Return the label stored into the props with some macros replaced.\n */\n protected getLabelWithMacrosReplaced(): string {\n // We assert that the props may have some needed properties.\n const props = this.props as Partial;\n\n return replaceMacros(\n [\n {\n macro: \"_date_\",\n value: humanDate(new Date())\n },\n {\n macro: \"_time_\",\n value: humanTime(new Date())\n },\n {\n macro: \"_agent_\",\n value: props.agentAlias != null ? props.agentAlias : \"\"\n },\n {\n macro: \"_agentdescription_\",\n value: props.agentDescription != null ? props.agentDescription : \"\"\n },\n {\n macro: \"_address_\",\n value: props.agentAddress != null ? props.agentAddress : \"\"\n },\n {\n macro: \"_module_\",\n value: props.moduleName != null ? props.moduleName : \"\"\n },\n {\n macro: \"_moduledescription_\",\n value: props.moduleDescription != null ? props.moduleDescription : \"\"\n }\n ],\n this.props.label || \"\"\n );\n }\n\n /**\n * To update the content element.\n * @return Item.\n */\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.createDomElement().innerHTML;\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): Props {\n return { ...this.itemProps }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: Props) {\n const prevProps = this.props;\n // Update the internal props.\n this.itemProps = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Check if we should re-render.\n if (this.shouldBeUpdated(prevProps, newProps)) this.render(prevProps);\n }\n\n /**\n * To compare the previous and the new props and returns a boolean value\n * in case the difference is meaningfull enough to perform DOM changes.\n *\n * Here, the only comparision is done by reference.\n *\n * Override this function to perform a different comparision depending on the item needs.\n *\n * @param prevProps\n * @param newProps\n * @return Whether the difference is meaningful enough to perform DOM changes or not.\n */\n protected shouldBeUpdated(prevProps: Props, newProps: Props): boolean {\n return prevProps !== newProps;\n }\n\n /**\n * To recreate or update the HTMLElement which represents the item into the DOM.\n * @param prevProps If exists it will be used to only perform DOM updates instead of a full replace.\n */\n public render(prevProps: Props | null = null): void {\n this.updateDomElement(this.childElementRef);\n\n // Move box.\n if (!prevProps || this.positionChanged(prevProps, this.props)) {\n this.moveElement(this.props.x, this.props.y);\n }\n // Resize box.\n if (!prevProps || this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n // Change label.\n const oldLabelHtml = this.labelElementRef.innerHTML;\n const newLabelHtml = this.createLabelDomElement().innerHTML;\n if (oldLabelHtml !== newLabelHtml) {\n this.labelElementRef.innerHTML = newLabelHtml;\n }\n // Change label position.\n if (!prevProps || prevProps.labelPosition !== this.props.labelPosition) {\n this.changeLabelPosition(this.props.labelPosition);\n }\n // Change link.\n if (\n prevProps &&\n (prevProps.isLinkEnabled !== this.props.isLinkEnabled ||\n (this.props.isLinkEnabled && prevProps.link !== this.props.link))\n ) {\n const container = this.createContainerDomElement();\n // Add the children of the old element.\n container.innerHTML = this.elementRef.innerHTML;\n // Copy the attributes.\n const attrs = this.elementRef.attributes;\n for (let i = 0; i < attrs.length; i++) {\n if (attrs[i].nodeName !== \"id\") {\n container.setAttributeNode(attrs[i]);\n }\n }\n // Replace the reference.\n if (this.elementRef.parentNode !== null) {\n this.elementRef.parentNode.replaceChild(container, this.elementRef);\n }\n\n // Changed the reference to the main element. It's ugly, but needed.\n this.elementRef = container;\n }\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n // Call the remove event.\n this.removeEventManager.emit({ data: this.props });\n // Event listeners.\n this.disposables.forEach(disposable => {\n try {\n disposable.dispose();\n } catch (ignored) {} // eslint-disable-line no-empty\n });\n // VisualConsoleItem DOM element.\n this.elementRef.remove();\n }\n\n /**\n * Compare the previous and the new position and return\n * a boolean value in case the position changed.\n * @param prevPosition\n * @param newPosition\n * @return Whether the position changed or not.\n */\n protected positionChanged(\n prevPosition: Position,\n newPosition: Position\n ): boolean {\n return prevPosition.x !== newPosition.x || prevPosition.y !== newPosition.y;\n }\n\n /**\n * Move the label around the item content.\n * @param position Label position.\n */\n protected changeLabelPosition(position: Props[\"labelPosition\"]): void {\n switch (position) {\n case \"up\":\n this.elementRef.style.flexDirection = \"column-reverse\";\n break;\n case \"left\":\n this.elementRef.style.flexDirection = \"row-reverse\";\n break;\n case \"right\":\n this.elementRef.style.flexDirection = \"row\";\n break;\n case \"down\":\n default:\n this.elementRef.style.flexDirection = \"column\";\n break;\n }\n\n // Ugly table to show the label as its legacy counterpart.\n const tables = this.labelElementRef.getElementsByTagName(\"table\");\n const table = tables.length > 0 ? tables.item(0) : null;\n // Change the table size depending on its position.\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n if (this.props.width > 0) {\n table.style.width = `${this.props.width}px`;\n table.style.height = null;\n }\n break;\n case \"left\":\n case \"right\":\n if (this.props.height > 0) {\n table.style.width = null;\n table.style.height = `${this.props.height}px`;\n }\n break;\n }\n }\n }\n\n /**\n * Move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n protected moveElement(x: number, y: number): void {\n this.elementRef.style.left = `${x}px`;\n this.elementRef.style.top = `${y}px`;\n }\n\n /**\n * Update the position into the properties and move the DOM container.\n * @param x Horizontal axis position.\n * @param y Vertical axis position.\n */\n public move(x: number, y: number): void {\n this.moveElement(x, y);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n x,\n y\n };\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n protected sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n // The most valuable size is the content size.\n this.childElementRef.style.width = width > 0 ? `${width}px` : null;\n this.childElementRef.style.height = height > 0 ? `${height}px` : null;\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.resizeElement(width, height);\n this.itemProps = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onClick(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the removal of the item.\n * @param listener Function which is going to be executed when a item is removed.\n */\n public onRemove(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.removeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\nexport default VisualConsoleItem;\n","export interface Listener {\n (event: T): void;\n}\n\nexport interface Disposable {\n dispose: () => void;\n}\n\n/** passes through events as they happen. You will not get events from before you start listening */\nexport default class TypedEvent {\n private listeners: Listener[] = [];\n private listenersOncer: Listener[] = [];\n\n public on = (listener: Listener): Disposable => {\n this.listeners.push(listener);\n return {\n dispose: () => this.off(listener)\n };\n };\n\n public once = (listener: Listener): void => {\n this.listenersOncer.push(listener);\n };\n\n public off = (listener: Listener): void => {\n const callbackIndex = this.listeners.indexOf(listener);\n if (callbackIndex > -1) this.listeners.splice(callbackIndex, 1);\n };\n\n public emit = (event: T): void => {\n /** Update any general listeners */\n this.listeners.forEach(listener => listener(event));\n\n /** Clear the `once` queue */\n this.listenersOncer.forEach(listener => listener(event));\n this.listenersOncer = [];\n };\n\n public pipe = (te: TypedEvent): Disposable => this.on(e => te.emit(e));\n}\n","import { UnknownObject, WithModuleProps } from \"../types\";\nimport {\n modulePropsDecoder,\n parseIntOr,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type EventsHistoryProps = {\n type: ItemType.AUTO_SLA_GRAPH;\n maxTime: number | null;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the events history props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function eventsHistoryPropsDecoder(\n data: UnknownObject\n): EventsHistoryProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.AUTO_SLA_GRAPH,\n maxTime: parseIntOr(data.maxTime, null),\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class EventsHistory extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"events-history\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type DonutGraphProps = {\n type: ItemType.DONUT_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the donut graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function donutGraphPropsDecoder(\n data: UnknownObject\n): DonutGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.DONUT_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class DonutGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"donut-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import { UnknownObject, WithModuleProps } from \"../types\";\nimport { modulePropsDecoder, decodeBase64, stringIsEmpty } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type BarsGraphProps = {\n type: ItemType.BARS_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the bars graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function barsGraphPropsDecoder(\n data: UnknownObject\n): BarsGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BARS_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class BarsGraph extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"bars-graph\";\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n setTimeout(() => {\n if (scripts[i].src.length === 0) eval(scripts[i].innerHTML.trim());\n }, 0);\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n decodeBase64,\n stringIsEmpty\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ModuleGraphProps = {\n type: ItemType.MODULE_GRAPH;\n html: string;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the module graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function moduleGraphPropsDecoder(\n data: UnknownObject\n): ModuleGraphProps | never {\n if (stringIsEmpty(data.html) && stringIsEmpty(data.encodedHtml)) {\n throw new TypeError(\"missing html content.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.MODULE_GRAPH,\n html: !stringIsEmpty(data.html)\n ? data.html\n : decodeBase64(data.encodedHtml),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class ModuleGraph extends Item {\n /**\n * @override Item.resizeElement.\n * Resize the DOM content container.\n * We need to override the resize function cause this item's height\n * is larger than the configured and the graph is over the label.\n * @param width\n * @param height\n */\n protected resizeElement(width: number): void {\n super.resizeElement(width, 0);\n }\n\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"module-graph\";\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const scripts = element.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n setTimeout(() => {\n try {\n eval(scripts[i].innerHTML.trim());\n } catch (ignored) {} // eslint-disable-line no-empty\n }, 0);\n }\n }\n\n return element;\n }\n\n protected updateDomElement(element: HTMLElement): void {\n element.innerHTML = this.props.html;\n\n // Remove the overview graph.\n const legendP = element.getElementsByTagName(\"p\");\n for (let i = 0; i < legendP.length; i++) {\n legendP[i].style.margin = \"0px\";\n }\n\n // Remove the overview graph.\n const overviewGraphs = element.getElementsByClassName(\"overview_graph\");\n for (let i = 0; i < overviewGraphs.length; i++) {\n overviewGraphs[i].remove();\n }\n\n // Hack to execute the JS after the HTML is added to the DOM.\n const aux = document.createElement(\"div\");\n aux.innerHTML = this.props.html;\n const scripts = aux.getElementsByTagName(\"script\");\n for (let i = 0; i < scripts.length; i++) {\n if (scripts[i].src.length === 0) {\n eval(scripts[i].innerHTML.trim());\n }\n }\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n UnknownObject\n} from \"../types\";\n\nimport {\n modulePropsDecoder,\n linkedVCPropsDecoder,\n notEmptyStringOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type StaticGraphProps = {\n type: ItemType.STATIC_GRAPH;\n imageSrc: string; // URL?\n showLastValueTooltip: \"default\" | \"enabled\" | \"disabled\";\n statusImageSrc: string | null; // URL?\n lastValue: string | null;\n} & ItemProps &\n (WithModuleProps | LinkedVisualConsoleProps);\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param showLastValueTooltip Raw value.\n */\nconst parseShowLastValueTooltip = (\n showLastValueTooltip: unknown\n): StaticGraphProps[\"showLastValueTooltip\"] => {\n switch (showLastValueTooltip) {\n case \"default\":\n case \"enabled\":\n case \"disabled\":\n return showLastValueTooltip;\n default:\n return \"default\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function staticGraphPropsDecoder(\n data: UnknownObject\n): StaticGraphProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.STATIC_GRAPH,\n imageSrc: data.imageSrc,\n showLastValueTooltip: parseShowLastValueTooltip(data.showLastValueTooltip),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n lastValue: notEmptyStringOr(data.lastValue, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class StaticGraph extends Item {\n protected createDomElement(): HTMLElement {\n const imgSrc = this.props.statusImageSrc || this.props.imageSrc;\n const element = document.createElement(\"div\");\n element.className = \"static-graph\";\n element.style.background = `url(${imgSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n // Show last value in a tooltip.\n if (\n this.props.lastValue !== null &&\n this.props.showLastValueTooltip !== \"disabled\"\n ) {\n element.className = \"static-graph image forced_title\";\n element.setAttribute(\"data-use_title_for_force_title\", \"1\");\n element.setAttribute(\"data-title\", this.props.lastValue);\n }\n\n return element;\n }\n}\n","import { LinkedVisualConsoleProps, UnknownObject } from \"../types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type IconProps = {\n type: ItemType.ICON;\n imageSrc: string; // URL?\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the icon props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function iconPropsDecoder(data: UnknownObject): IconProps | never {\n if (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) {\n throw new TypeError(\"invalid image src.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.ICON,\n imageSrc: data.imageSrc,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Icon extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"icon\";\n element.style.background = `url(${this.props.imageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n\n return element;\n }\n}\n","import {\n WithModuleProps,\n LinkedVisualConsoleProps,\n UnknownObject\n} from \"../types\";\nimport { modulePropsDecoder, linkedVCPropsDecoder } from \"../lib\";\nimport Item, { itemBasePropsDecoder, ItemType, ItemProps } from \"../Item\";\n\nexport type ColorCloudProps = {\n type: ItemType.COLOR_CLOUD;\n color: string;\n // TODO: Add the rest of the color cloud values?\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the static graph props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function colorCloudPropsDecoder(\n data: UnknownObject\n): ColorCloudProps | never {\n // TODO: Validate the color.\n if (typeof data.color !== \"string\" || data.color.length === 0) {\n throw new TypeError(\"invalid color.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.COLOR_CLOUD,\n color: data.color,\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class ColorCloud extends Item {\n protected createDomElement(): HTMLElement {\n const container: HTMLDivElement = document.createElement(\"div\");\n container.className = \"color-cloud\";\n\n // Add the SVG.\n container.append(this.createSvgElement());\n\n return container;\n }\n\n public createSvgElement(): SVGSVGElement {\n const gradientId = `grad_${this.props.id}`;\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Defs.\n const defs = document.createElementNS(svgNS, \"defs\");\n // Radial gradient.\n const radialGradient = document.createElementNS(svgNS, \"radialGradient\");\n radialGradient.setAttribute(\"id\", gradientId);\n radialGradient.setAttribute(\"cx\", \"50%\");\n radialGradient.setAttribute(\"cy\", \"50%\");\n radialGradient.setAttribute(\"r\", \"50%\");\n radialGradient.setAttribute(\"fx\", \"50%\");\n radialGradient.setAttribute(\"fy\", \"50%\");\n // Stops.\n const stop0 = document.createElementNS(svgNS, \"stop\");\n stop0.setAttribute(\"offset\", \"0%\");\n stop0.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0.9`\n );\n const stop100 = document.createElementNS(svgNS, \"stop\");\n stop100.setAttribute(\"offset\", \"100%\");\n stop100.setAttribute(\n \"style\",\n `stop-color:${this.props.color};stop-opacity:0`\n );\n // Circle.\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"fill\", `url(#${gradientId})`);\n circle.setAttribute(\"cx\", \"50%\");\n circle.setAttribute(\"cy\", \"50%\");\n circle.setAttribute(\"r\", \"50%\");\n\n // Append elements.\n radialGradient.append(stop0, stop100);\n defs.append(radialGradient);\n svg.append(defs, circle);\n\n return svg;\n }\n}\n","import { LinkedVisualConsoleProps, UnknownObject } from \"../types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n stringIsEmpty,\n decodeBase64,\n parseBoolean\n} from \"../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../Item\";\n\nexport type GroupProps = {\n type: ItemType.GROUP_ITEM;\n groupId: number;\n imageSrc: string | null; // URL?\n statusImageSrc: string | null;\n showStatistics: boolean;\n html?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\nfunction extractHtml(data: UnknownObject): string | null {\n if (!stringIsEmpty(data.html)) return data.html;\n if (!stringIsEmpty(data.encodedHtml)) return decodeBase64(data.encodedHtml);\n return null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the group props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function groupPropsDecoder(data: UnknownObject): GroupProps | never {\n if (\n (typeof data.imageSrc !== \"string\" || data.imageSrc.length === 0) &&\n data.encodedHtml === null\n ) {\n throw new TypeError(\"invalid image src.\");\n }\n if (parseIntOr(data.groupId, null) === null) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n const showStatistics = parseBoolean(data.showStatistics);\n const html = showStatistics ? extractHtml(data) : null;\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.GROUP_ITEM,\n groupId: parseInt(data.groupId),\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n showStatistics,\n html,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Group extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"group\";\n\n if (!this.props.showStatistics && this.props.statusImageSrc !== null) {\n // Icon with status.\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.showStatistics && this.props.html != null) {\n // Stats table.\n element.innerHTML = this.props.html;\n }\n\n return element;\n }\n}\n","import \"./styles.css\";\n\nimport { LinkedVisualConsoleProps, UnknownObject, Size } from \"../../types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n parseBoolean,\n prefixedCssRules,\n notEmptyStringOr,\n humanDate,\n humanTime\n} from \"../../lib\";\nimport Item, { ItemProps, itemBasePropsDecoder, ItemType } from \"../../Item\";\n\nexport type ClockProps = {\n type: ItemType.CLOCK;\n clockType: \"analogic\" | \"digital\";\n clockFormat: \"datetime\" | \"time\";\n clockTimezone: string;\n clockTimezoneOffset: number; // Offset of the timezone to UTC in seconds.\n showClockTimezone: boolean;\n color?: string | null;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockType Raw value.\n */\nconst parseClockType = (clockType: unknown): ClockProps[\"clockType\"] => {\n switch (clockType) {\n case \"analogic\":\n case \"digital\":\n return clockType;\n default:\n return \"analogic\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw unknown value.\n * @param clockFormat Raw value.\n */\nconst parseClockFormat = (clockFormat: unknown): ClockProps[\"clockFormat\"] => {\n switch (clockFormat) {\n case \"datetime\":\n case \"time\":\n return clockFormat;\n default:\n return \"datetime\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the clock props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function clockPropsDecoder(data: UnknownObject): ClockProps | never {\n if (\n typeof data.clockTimezone !== \"string\" ||\n data.clockTimezone.length === 0\n ) {\n throw new TypeError(\"invalid timezone.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.CLOCK,\n clockType: parseClockType(data.clockType),\n clockFormat: parseClockFormat(data.clockFormat),\n clockTimezone: data.clockTimezone,\n clockTimezoneOffset: parseIntOr(data.clockTimezoneOffset, 0),\n showClockTimezone: parseBoolean(data.showClockTimezone),\n color: notEmptyStringOr(data.color, null),\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Clock extends Item {\n public static readonly TICK_INTERVAL = 1000; // In ms.\n private intervalRef: number | null = null;\n\n public constructor(props: ClockProps) {\n // Call the superclass constructor.\n super(props);\n\n /* The item is already loaded and inserted into the DOM.\n * The class properties are now initialized.\n * Now you can modify the item, add event handlers, timers, etc.\n */\n\n /* The use of the arrow function is important here. startTick will\n * use the function passed as an argument to call the global setInterval\n * function. The interval, timeout or event functions, among other, are\n * called into another execution loop and using a different context.\n * The arrow functions, unlike the classic functions, doesn't create\n * their own context (this), so their context at execution time will be\n * use the current context at the declaration time.\n * http://es6-features.org/#Lexicalthis\n */\n this.startTick(\n () => {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n },\n /* The analogic clock doesn't need to tick,\n * but it will be refreshed every 20 seconds\n * to avoid a desync caused by page freezes.\n */\n this.props.clockType === \"analogic\" ? 20000 : Clock.TICK_INTERVAL\n );\n }\n\n /**\n * Wrap a window.clearInterval call.\n */\n private stopTick(): void {\n if (this.intervalRef !== null) {\n window.clearInterval(this.intervalRef);\n this.intervalRef = null;\n }\n }\n\n /**\n * Wrap a window.setInterval call.\n * @param handler Function to be called every time the interval\n * timer is reached.\n * @param interval Number in milliseconds for the interval timer.\n */\n private startTick(\n handler: TimerHandler,\n interval: number = Clock.TICK_INTERVAL\n ): void {\n this.stopTick();\n this.intervalRef = window.setInterval(handler, interval);\n }\n\n /**\n * Create a element which contains the DOM representation of the item.\n * @return DOM Element.\n * @override\n */\n protected createDomElement(): HTMLElement | never {\n return this.createClock();\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n * @override\n */\n public remove(): void {\n // Clear the interval.\n this.stopTick();\n // Call to the parent clean function.\n super.remove();\n }\n\n /**\n * @override Item.resizeElement\n * Resize the DOM content container.\n * @param width\n * @param height\n */\n protected resizeElement(width: number, height: number): void {\n const { width: newWidth, height: newHeight } = this.getElementSize(\n width,\n height\n ); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n super.resizeElement(newWidth, newHeight);\n // Re-render the item to force it calculate a new font size.\n if (this.props.clockType === \"digital\") {\n // Replace the old element with the updated date.\n this.childElementRef.innerHTML = this.createClock().innerHTML;\n }\n }\n\n /**\n * Create a element which contains a representation of a clock.\n * It choose between the clock types.\n * @return DOM Element.\n * @throws Error.\n */\n private createClock(): HTMLElement | never {\n switch (this.props.clockType) {\n case \"analogic\":\n return this.createAnalogicClock();\n case \"digital\":\n return this.createDigitalClock();\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n\n /**\n * Create a element which contains a representation of an analogic clock.\n * @return DOM Element.\n */\n private createAnalogicClock(): HTMLElement {\n const svgNS = \"http://www.w3.org/2000/svg\";\n const colors = {\n watchFace: \"#FFFFF0\",\n watchFaceBorder: \"#242124\",\n mark: \"#242124\",\n handDark: \"#242124\",\n handLight: \"#525252\",\n secondHand: \"#DC143C\"\n };\n\n const { width, height } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n\n const div = document.createElement(\"div\");\n div.className = \"analogic-clock\";\n div.style.width = `${width}px`;\n div.style.height = `${height}px`;\n\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n // Clock face.\n const clockFace = document.createElementNS(svgNS, \"g\");\n clockFace.setAttribute(\"class\", \"clockface\");\n const clockFaceBackground = document.createElementNS(svgNS, \"circle\");\n clockFaceBackground.setAttribute(\"cx\", \"50\");\n clockFaceBackground.setAttribute(\"cy\", \"50\");\n clockFaceBackground.setAttribute(\"r\", \"48\");\n clockFaceBackground.setAttribute(\"fill\", colors.watchFace);\n clockFaceBackground.setAttribute(\"stroke\", colors.watchFaceBorder);\n clockFaceBackground.setAttribute(\"stroke-width\", \"2\");\n clockFaceBackground.setAttribute(\"stroke-linecap\", \"round\");\n // Insert the clockface background into the clockface group.\n clockFace.append(clockFaceBackground);\n\n // Timezone complication.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const timezoneComplication = document.createElementNS(svgNS, \"text\");\n timezoneComplication.setAttribute(\"text-anchor\", \"middle\");\n timezoneComplication.setAttribute(\"font-size\", \"8\");\n timezoneComplication.setAttribute(\n \"transform\",\n \"translate(30 50) rotate(90)\" // Rotate to counter the clock rotation.\n );\n timezoneComplication.setAttribute(\"fill\", colors.mark);\n timezoneComplication.textContent = city;\n clockFace.append(timezoneComplication);\n }\n\n // Marks group.\n const marksGroup = document.createElementNS(svgNS, \"g\");\n marksGroup.setAttribute(\"class\", \"marks\");\n // Build the 12 hours mark.\n const mainMarkGroup = document.createElementNS(svgNS, \"g\");\n mainMarkGroup.setAttribute(\"class\", \"mark\");\n mainMarkGroup.setAttribute(\"transform\", \"translate(50 50)\");\n const mark1a = document.createElementNS(svgNS, \"line\");\n mark1a.setAttribute(\"x1\", \"36\");\n mark1a.setAttribute(\"y1\", \"0\");\n mark1a.setAttribute(\"x2\", \"46\");\n mark1a.setAttribute(\"y2\", \"0\");\n mark1a.setAttribute(\"stroke\", colors.mark);\n mark1a.setAttribute(\"stroke-width\", \"5\");\n const mark1b = document.createElementNS(svgNS, \"line\");\n mark1b.setAttribute(\"x1\", \"36\");\n mark1b.setAttribute(\"y1\", \"0\");\n mark1b.setAttribute(\"x2\", \"46\");\n mark1b.setAttribute(\"y2\", \"0\");\n mark1b.setAttribute(\"stroke\", colors.watchFace);\n mark1b.setAttribute(\"stroke-width\", \"1\");\n // Insert the 12 mark lines into their group.\n mainMarkGroup.append(mark1a, mark1b);\n // Insert the main mark into the marks group.\n marksGroup.append(mainMarkGroup);\n // Build the rest of the marks.\n for (let i = 1; i < 60; i++) {\n const mark = document.createElementNS(svgNS, \"line\");\n mark.setAttribute(\"y1\", \"0\");\n mark.setAttribute(\"y2\", \"0\");\n mark.setAttribute(\"stroke\", colors.mark);\n mark.setAttribute(\"transform\", `translate(50 50) rotate(${i * 6})`);\n\n if (i % 5 === 0) {\n mark.setAttribute(\"x1\", \"38\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", i % 15 === 0 ? \"2\" : \"1\");\n } else {\n mark.setAttribute(\"x1\", \"42\");\n mark.setAttribute(\"x2\", \"46\");\n mark.setAttribute(\"stroke-width\", \"0.5\");\n }\n\n // Insert the mark into the marks group.\n marksGroup.append(mark);\n }\n\n /* Clock hands */\n\n // Hour hand.\n const hourHand = document.createElementNS(svgNS, \"g\");\n hourHand.setAttribute(\"class\", \"hour-hand\");\n hourHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const hourHandA = document.createElementNS(svgNS, \"line\");\n hourHandA.setAttribute(\"class\", \"hour-hand-a\");\n hourHandA.setAttribute(\"x1\", \"0\");\n hourHandA.setAttribute(\"y1\", \"0\");\n hourHandA.setAttribute(\"x2\", \"30\");\n hourHandA.setAttribute(\"y2\", \"0\");\n hourHandA.setAttribute(\"stroke\", colors.handLight);\n hourHandA.setAttribute(\"stroke-width\", \"4\");\n hourHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const hourHandB = document.createElementNS(svgNS, \"line\");\n hourHandB.setAttribute(\"class\", \"hour-hand-b\");\n hourHandB.setAttribute(\"x1\", \"0\");\n hourHandB.setAttribute(\"y1\", \"0\");\n hourHandB.setAttribute(\"x2\", \"29.9\");\n hourHandB.setAttribute(\"y2\", \"0\");\n hourHandB.setAttribute(\"stroke\", colors.handDark);\n hourHandB.setAttribute(\"stroke-width\", \"3.1\");\n hourHandB.setAttribute(\"stroke-linecap\", \"round\");\n // Append the elements to finish the hour hand.\n hourHand.append(hourHandA, hourHandB);\n\n // Minute hand.\n const minuteHand = document.createElementNS(svgNS, \"g\");\n minuteHand.setAttribute(\"class\", \"minute-hand\");\n minuteHand.setAttribute(\"transform\", \"translate(50 50)\");\n // This will go back and will act like a border.\n const minuteHandA = document.createElementNS(svgNS, \"line\");\n minuteHandA.setAttribute(\"class\", \"minute-hand-a\");\n minuteHandA.setAttribute(\"x1\", \"0\");\n minuteHandA.setAttribute(\"y1\", \"0\");\n minuteHandA.setAttribute(\"x2\", \"40\");\n minuteHandA.setAttribute(\"y2\", \"0\");\n minuteHandA.setAttribute(\"stroke\", colors.handLight);\n minuteHandA.setAttribute(\"stroke-width\", \"2\");\n minuteHandA.setAttribute(\"stroke-linecap\", \"round\");\n // This will go in front of the previous line.\n const minuteHandB = document.createElementNS(svgNS, \"line\");\n minuteHandB.setAttribute(\"class\", \"minute-hand-b\");\n minuteHandB.setAttribute(\"x1\", \"0\");\n minuteHandB.setAttribute(\"y1\", \"0\");\n minuteHandB.setAttribute(\"x2\", \"39.9\");\n minuteHandB.setAttribute(\"y2\", \"0\");\n minuteHandB.setAttribute(\"stroke\", colors.handDark);\n minuteHandB.setAttribute(\"stroke-width\", \"1.5\");\n minuteHandB.setAttribute(\"stroke-linecap\", \"round\");\n const minuteHandPin = document.createElementNS(svgNS, \"circle\");\n minuteHandPin.setAttribute(\"r\", \"3\");\n minuteHandPin.setAttribute(\"fill\", colors.handDark);\n // Append the elements to finish the minute hand.\n minuteHand.append(minuteHandA, minuteHandB, minuteHandPin);\n\n // Second hand.\n const secondHand = document.createElementNS(svgNS, \"g\");\n secondHand.setAttribute(\"class\", \"second-hand\");\n secondHand.setAttribute(\"transform\", \"translate(50 50)\");\n const secondHandBar = document.createElementNS(svgNS, \"line\");\n secondHandBar.setAttribute(\"x1\", \"0\");\n secondHandBar.setAttribute(\"y1\", \"0\");\n secondHandBar.setAttribute(\"x2\", \"46\");\n secondHandBar.setAttribute(\"y2\", \"0\");\n secondHandBar.setAttribute(\"stroke\", colors.secondHand);\n secondHandBar.setAttribute(\"stroke-width\", \"1\");\n secondHandBar.setAttribute(\"stroke-linecap\", \"round\");\n const secondHandPin = document.createElementNS(svgNS, \"circle\");\n secondHandPin.setAttribute(\"r\", \"2\");\n secondHandPin.setAttribute(\"fill\", colors.secondHand);\n // Append the elements to finish the second hand.\n secondHand.append(secondHandBar, secondHandPin);\n\n // Pin.\n const pin = document.createElementNS(svgNS, \"circle\");\n pin.setAttribute(\"cx\", \"50\");\n pin.setAttribute(\"cy\", \"50\");\n pin.setAttribute(\"r\", \"0.3\");\n pin.setAttribute(\"fill\", colors.handDark);\n\n // Get the hand angles.\n const date = this.getOriginDate();\n const seconds = date.getSeconds();\n const minutes = date.getMinutes();\n const hours = date.getHours();\n const secAngle = (360 / 60) * seconds;\n const minuteAngle = (360 / 60) * minutes + (360 / 60) * (seconds / 60);\n const hourAngle = (360 / 12) * hours + (360 / 12) * (minutes / 60);\n // Set the clock time by moving the hands.\n hourHand.setAttribute(\"transform\", `translate(50 50) rotate(${hourAngle})`);\n minuteHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${minuteAngle})`\n );\n secondHand.setAttribute(\n \"transform\",\n `translate(50 50) rotate(${secAngle})`\n );\n\n // Build the clock\n svg.append(clockFace, marksGroup, hourHand, minuteHand, secondHand, pin);\n // Rotate the clock to its normal position.\n svg.setAttribute(\"transform\", \"rotate(-90)\");\n\n /* Add the animation declaration to the container.\n * Since the animation keyframes need to know the\n * start angle, this angle is dynamic (current time),\n * and we can't edit keyframes through javascript\n * safely and with backwards compatibility, we need\n * to inject it.\n */\n div.innerHTML = `\n \n `;\n // Add the clock to the container\n div.append(svg);\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n div.append(dateElem);\n }\n\n return div;\n }\n\n /**\n * Create a element which contains a representation of a digital clock.\n * @return DOM Element.\n */\n private createDigitalClock(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"digital-clock\";\n\n const { width } = this.getElementSize(); // Destructuring assigment: http://es6-features.org/#ObjectMatchingShorthandNotation\n\n // Calculate font size to adapt the font to the item size.\n const baseTimeFontSize = 20; // Per 100px of width.\n const dateFontSizeMultiplier = 0.5;\n const tzFontSizeMultiplier = 6 / this.props.clockTimezone.length;\n const timeFontSize = (baseTimeFontSize * width) / 100;\n const dateFontSize =\n (baseTimeFontSize * dateFontSizeMultiplier * width) / 100;\n const tzFontSize = Math.min(\n (baseTimeFontSize * tzFontSizeMultiplier * width) / 100,\n (width / 100) * 10\n );\n\n // Date calculated using the original timezone.\n const date = this.getOriginDate();\n\n // Date.\n if (this.props.clockFormat === \"datetime\") {\n const dateElem: HTMLSpanElement = document.createElement(\"span\");\n dateElem.className = \"date\";\n dateElem.textContent = humanDate(date, \"default\");\n dateElem.style.fontSize = `${dateFontSize}px`;\n if (this.props.color) dateElem.style.color = this.props.color;\n element.append(dateElem);\n }\n\n // Time.\n const timeElem: HTMLSpanElement = document.createElement(\"span\");\n timeElem.className = \"time\";\n timeElem.textContent = humanTime(date);\n timeElem.style.fontSize = `${timeFontSize}px`;\n if (this.props.color) timeElem.style.color = this.props.color;\n element.append(timeElem);\n\n // City name.\n const city = this.getHumanTimezone();\n if (city.length > 0) {\n const tzElem: HTMLSpanElement = document.createElement(\"span\");\n tzElem.className = \"timezone\";\n tzElem.textContent = city;\n tzElem.style.fontSize = `${tzFontSize}px`;\n if (this.props.color) tzElem.style.color = this.props.color;\n element.append(tzElem);\n }\n\n return element;\n }\n\n /**\n * Generate the current date using the timezone offset stored into the properties.\n * @return The current date.\n */\n private getOriginDate(initialDate: Date | null = null): Date {\n const d = initialDate ? initialDate : new Date();\n const targetTZOffset = this.props.clockTimezoneOffset * 1000; // In ms.\n const localTZOffset = d.getTimezoneOffset() * 60 * 1000; // In ms.\n const utimestamp = d.getTime() + targetTZOffset + localTZOffset;\n\n return new Date(utimestamp);\n }\n\n /**\n * Extract a human readable city name from the timezone text.\n * @param timezone Timezone text.\n */\n public getHumanTimezone(timezone: string = this.props.clockTimezone): string {\n const [, city = \"\"] = timezone.split(\"/\");\n return city.replace(\"_\", \" \");\n }\n\n /**\n * Generate a element size using the current size and the default values.\n * @return The size.\n */\n private getElementSize(\n width: number = this.props.width,\n height: number = this.props.height\n ): Size {\n switch (this.props.clockType) {\n case \"analogic\": {\n let diameter = 100; // Default value.\n\n if (width > 0 && height > 0) {\n diameter = Math.min(width, height);\n } else if (width > 0) {\n diameter = width;\n } else if (height > 0) {\n diameter = height;\n }\n\n return {\n width: diameter,\n height: diameter\n };\n }\n case \"digital\": {\n if (width > 0 && height > 0) {\n // The proportion of the clock should be (width = height / 2) aproximately.\n height = width / 2 < height ? width / 2 : height;\n } else if (width > 0) {\n height = width / 2;\n } else if (height > 0) {\n // The proportion of the clock should be (height * 2 = width) aproximately.\n width = height * 2;\n } else {\n width = 100; // Default value.\n height = 50; // Default value.\n }\n\n return {\n width,\n height\n };\n }\n default:\n throw new Error(\"invalid clock type.\");\n }\n }\n}\n","import { UnknownObject } from \"../types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface BoxProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.BOX_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n borderWidth: number;\n borderColor: string | null;\n fillColor: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function boxPropsDecoder(data: UnknownObject): BoxProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.BOX_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Custom properties.\n borderWidth: parseIntOr(data.borderWidth, 0),\n borderColor: notEmptyStringOr(data.borderColor, null),\n fillColor: notEmptyStringOr(data.fillColor, null)\n };\n}\n\nexport default class Box extends Item {\n protected createDomElement(): HTMLElement {\n const box: HTMLDivElement = document.createElement(\"div\");\n box.className = \"box\";\n // To prevent this item to expand beyond its parent.\n box.style.boxSizing = \"border-box\";\n\n if (this.props.fillColor) {\n box.style.backgroundColor = this.props.fillColor;\n }\n\n // Border.\n if (this.props.borderWidth > 0) {\n box.style.borderStyle = \"solid\";\n // Control the max width to prevent this item to expand beyond its parent.\n const maxBorderWidth = Math.min(this.props.width, this.props.height) / 2;\n const borderWidth = Math.min(this.props.borderWidth, maxBorderWidth);\n box.style.borderWidth = `${borderWidth}px`;\n\n if (this.props.borderColor) {\n box.style.borderColor = this.props.borderColor;\n }\n }\n\n return box;\n }\n}\n","import { UnknownObject, Position, Size } from \"../types\";\nimport { parseIntOr, notEmptyStringOr } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\ninterface LineProps extends ItemProps {\n // Overrided properties.\n readonly type: ItemType.LINE_ITEM;\n label: null;\n isLinkEnabled: false;\n parentId: null;\n aclGroupId: null;\n // Custom properties.\n startPosition: Position;\n endPosition: Position;\n lineWidth: number;\n color: string | null;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the item props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function linePropsDecoder(data: UnknownObject): LineProps | never {\n const props: LineProps = {\n ...itemBasePropsDecoder({ ...data, width: 1, height: 1 }), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LINE_ITEM,\n label: null,\n isLinkEnabled: false,\n parentId: null,\n aclGroupId: null,\n // Initialize Position & Size.\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n // Custom properties.\n startPosition: {\n x: parseIntOr(data.startX, 0),\n y: parseIntOr(data.startY, 0)\n },\n endPosition: {\n x: parseIntOr(data.endX, 0),\n y: parseIntOr(data.endY, 0)\n },\n lineWidth: parseIntOr(data.lineWidth || data.borderWidth, 1),\n color: notEmptyStringOr(data.borderColor || data.color, null)\n };\n\n /*\n * We need to enhance the props with the extracted size and position\n * of the box cause there are missing at the props update. A better\n * solution would be overriding the props setter to do it there, but\n * the language doesn't allow it while targetting ES5.\n * TODO: We need to figure out a more consistent solution.\n */\n\n return {\n ...props,\n // Enhance the props extracting the box size and position.\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n ...Line.extractBoxSizeAndPosition(props)\n };\n}\n\nexport default class Line extends Item {\n /**\n * @override\n */\n public constructor(props: LineProps) {\n /*\n * We need to override the constructor cause we need to obtain\n * the\n * box size and position from the start and finish points\n * of the line.\n */\n super({\n ...props,\n ...Line.extractBoxSizeAndPosition(props)\n });\n }\n\n /**\n * @override\n * To create the item's DOM representation.\n * @return Item.\n */\n protected createDomElement(): HTMLElement {\n const element: HTMLDivElement = document.createElement(\"div\");\n element.className = \"line\";\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n // Set SVG size.\n svg.setAttribute(\n \"width\",\n (this.props.width + this.props.lineWidth).toString()\n );\n svg.setAttribute(\n \"height\",\n (this.props.height + this.props.lineWidth).toString()\n );\n const line = document.createElementNS(svgNS, \"line\");\n line.setAttribute(\n \"x1\",\n `${this.props.startPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y1\",\n `${this.props.startPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"x2\",\n `${this.props.endPosition.x - this.props.x + this.props.lineWidth / 2}`\n );\n line.setAttribute(\n \"y2\",\n `${this.props.endPosition.y - this.props.y + this.props.lineWidth / 2}`\n );\n line.setAttribute(\"stroke\", this.props.color || \"black\");\n line.setAttribute(\"stroke-width\", this.props.lineWidth.toString());\n\n svg.append(line);\n element.append(svg);\n\n return element;\n }\n\n /**\n * Extract the size and position of the box from\n * the start and the finish of the line.\n * @param props Item properties.\n */\n public static extractBoxSizeAndPosition(props: LineProps): Size & Position {\n return {\n width: Math.abs(props.startPosition.x - props.endPosition.x),\n height: Math.abs(props.startPosition.y - props.endPosition.y),\n x: Math.min(props.startPosition.x, props.endPosition.x),\n y: Math.min(props.startPosition.y, props.endPosition.y)\n };\n }\n}\n","import { LinkedVisualConsoleProps, UnknownObject } from \"../types\";\nimport { linkedVCPropsDecoder } from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type LabelProps = {\n type: ItemType.LABEL;\n} & ItemProps &\n LinkedVisualConsoleProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the label props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function labelPropsDecoder(data: UnknownObject): LabelProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.LABEL,\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class Label extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"label\";\n element.innerHTML = this.getLabelWithMacrosReplaced();\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n public createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","import {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n parseIntOr,\n modulePropsDecoder,\n replaceMacros\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type SimpleValueProps = {\n type: ItemType.SIMPLE_VALUE;\n valueType: \"string\" | \"image\";\n value: string;\n} & (\n | {\n processValue: \"none\";\n }\n | {\n processValue: \"avg\" | \"max\" | \"min\";\n period: number;\n }) &\n ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw value type.\n * @param valueType Raw value.\n */\nconst parseValueType = (valueType: unknown): SimpleValueProps[\"valueType\"] => {\n switch (valueType) {\n case \"string\":\n case \"image\":\n return valueType;\n default:\n return \"string\";\n }\n};\n\n/**\n * Extract a valid enum value from a raw process value.\n * @param processValue Raw value.\n */\nconst parseProcessValue = (\n processValue: unknown\n): SimpleValueProps[\"processValue\"] => {\n switch (processValue) {\n case \"none\":\n case \"avg\":\n case \"max\":\n case \"min\":\n return processValue;\n default:\n return \"none\";\n }\n};\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the simple value props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function simpleValuePropsDecoder(\n data: UnknownObject\n): SimpleValueProps | never {\n if (typeof data.value !== \"string\" || data.value.length === 0) {\n throw new TypeError(\"invalid value\");\n }\n\n const processValue = parseProcessValue(data.processValue);\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SIMPLE_VALUE,\n valueType: parseValueType(data.valueType),\n value: data.value,\n ...(processValue === \"none\"\n ? { processValue }\n : { processValue, period: parseIntOr(data.period, 0) }), // Object spread. It will merge the properties of the two objects.\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nexport default class SimpleValue extends Item {\n protected createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"simple-value\";\n\n if (this.props.valueType === \"image\") {\n const img = document.createElement(\"img\");\n img.src = this.props.value;\n element.append(img);\n } else {\n // Add the value to the label and show it.\n let text = this.props.value;\n let label = this.getLabelWithMacrosReplaced();\n if (label.length > 0) {\n text = replaceMacros([{ macro: /\\(?_VALUE_\\)?/i, value: text }], label);\n }\n\n element.innerHTML = text;\n }\n\n return element;\n }\n\n /**\n * @override Item.createLabelDomElement\n * Create a new label for the visual console item.\n * @return Item label.\n */\n protected createLabelDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"visual-console-item-label\";\n // Always return an empty label.\n return element;\n }\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var x0 = this._x1,\n y0 = this._y1,\n x21 = x2 - x1,\n y21 = y2 - y1,\n x01 = x0 - x1,\n y01 = y0 - y1,\n l01_2 = x01 * x01 + y01 * y01;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"M\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n else if (!(l01_2 > epsilon));\n\n // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n // Equivalently, is (x1,y1) coincident with (x2,y2)?\n // Or, is the radius zero? Line to (x1,y1).\n else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n this._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var x20 = x2 - x0,\n y20 = y2 - y0,\n l21_2 = x21 * x21 + y21 * y21,\n l20_2 = x20 * x20 + y20 * y20,\n l21 = Math.sqrt(l21_2),\n l01 = Math.sqrt(l01_2),\n l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n t01 = l / l01,\n t21 = l / l21;\n\n // If the start tangent is not coincident with (x0,y0), line to.\n if (Math.abs(t01 - 1) > epsilon) {\n this._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r;\n var dx = r * Math.cos(a0),\n dy = r * Math.sin(a0),\n x0 = x + dx,\n y0 = y + dy,\n cw = 1 ^ ccw,\n da = ccw ? a0 - a1 : a1 - a0;\n\n // Is the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"M\" + x0 + \",\" + y0;\n }\n\n // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n this._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re done.\n if (!r) return;\n\n // Does the angle go the wrong way? Flip the direction.\n if (da < 0) da = da % tau + tau;\n\n // Is this a complete circle? Draw two arcs to complete the circle.\n if (da > tauEpsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (x - dx) + \",\" + (y - dy) + \"A\" + r + \",\" + r + \",0,1,\" + cw + \",\" + (this._x1 = x0) + \",\" + (this._y1 = y0);\n }\n\n // Is this arc non-empty? Draw an arc!\n else if (da > epsilon) {\n this._ += \"A\" + r + \",\" + r + \",0,\" + (+(da >= pi)) + \",\" + cw + \",\" + (this._x1 = x + r * Math.cos(a1)) + \",\" + (this._y1 = y + r * Math.sin(a1));\n }\n },\n rect: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export var abs = Math.abs;\nexport var atan2 = Math.atan2;\nexport var cos = Math.cos;\nexport var max = Math.max;\nexport var min = Math.min;\nexport var sin = Math.sin;\nexport var sqrt = Math.sqrt;\n\nexport var epsilon = 1e-12;\nexport var pi = Math.PI;\nexport var halfPi = pi / 2;\nexport var tau = 2 * pi;\n\nexport function acos(x) {\n return x > 1 ? 0 : x < -1 ? pi : Math.acos(x);\n}\n\nexport function asin(x) {\n return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x);\n}\n","import {path} from \"d3-path\";\nimport constant from \"./constant\";\nimport {abs, acos, asin, atan2, cos, epsilon, halfPi, max, min, pi, sin, sqrt, tau} from \"./math\";\n\nfunction arcInnerRadius(d) {\n return d.innerRadius;\n}\n\nfunction arcOuterRadius(d) {\n return d.outerRadius;\n}\n\nfunction arcStartAngle(d) {\n return d.startAngle;\n}\n\nfunction arcEndAngle(d) {\n return d.endAngle;\n}\n\nfunction arcPadAngle(d) {\n return d && d.padAngle; // Note: optional!\n}\n\nfunction intersect(x0, y0, x1, y1, x2, y2, x3, y3) {\n var x10 = x1 - x0, y10 = y1 - y0,\n x32 = x3 - x2, y32 = y3 - y2,\n t = y32 * x10 - x32 * y10;\n if (t * t < epsilon) return;\n t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;\n return [x0 + t * x10, y0 + t * y10];\n}\n\n// Compute perpendicular offset line of length rc.\n// http://mathworld.wolfram.com/Circle-LineIntersection.html\nfunction cornerTangents(x0, y0, x1, y1, r1, rc, cw) {\n var x01 = x0 - x1,\n y01 = y0 - y1,\n lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01),\n ox = lo * y01,\n oy = -lo * x01,\n x11 = x0 + ox,\n y11 = y0 + oy,\n x10 = x1 + ox,\n y10 = y1 + oy,\n x00 = (x11 + x10) / 2,\n y00 = (y11 + y10) / 2,\n dx = x10 - x11,\n dy = y10 - y11,\n d2 = dx * dx + dy * dy,\n r = r1 - rc,\n D = x11 * y10 - x10 * y11,\n d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)),\n cx0 = (D * dy - dx * d) / d2,\n cy0 = (-D * dx - dy * d) / d2,\n cx1 = (D * dy + dx * d) / d2,\n cy1 = (-D * dx + dy * d) / d2,\n dx0 = cx0 - x00,\n dy0 = cy0 - y00,\n dx1 = cx1 - x00,\n dy1 = cy1 - y00;\n\n // Pick the closer of the two intersection points.\n // TODO Is there a faster way to determine which intersection to use?\n if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n\n return {\n cx: cx0,\n cy: cy0,\n x01: -ox,\n y01: -oy,\n x11: cx0 * (r1 / r - 1),\n y11: cy0 * (r1 / r - 1)\n };\n}\n\nexport default function() {\n var innerRadius = arcInnerRadius,\n outerRadius = arcOuterRadius,\n cornerRadius = constant(0),\n padRadius = null,\n startAngle = arcStartAngle,\n endAngle = arcEndAngle,\n padAngle = arcPadAngle,\n context = null;\n\n function arc() {\n var buffer,\n r,\n r0 = +innerRadius.apply(this, arguments),\n r1 = +outerRadius.apply(this, arguments),\n a0 = startAngle.apply(this, arguments) - halfPi,\n a1 = endAngle.apply(this, arguments) - halfPi,\n da = abs(a1 - a0),\n cw = a1 > a0;\n\n if (!context) context = buffer = path();\n\n // Ensure that the outer radius is always larger than the inner radius.\n if (r1 < r0) r = r1, r1 = r0, r0 = r;\n\n // Is it a point?\n if (!(r1 > epsilon)) context.moveTo(0, 0);\n\n // Or is it a circle or annulus?\n else if (da > tau - epsilon) {\n context.moveTo(r1 * cos(a0), r1 * sin(a0));\n context.arc(0, 0, r1, a0, a1, !cw);\n if (r0 > epsilon) {\n context.moveTo(r0 * cos(a1), r0 * sin(a1));\n context.arc(0, 0, r0, a1, a0, cw);\n }\n }\n\n // Or is it a circular or annular sector?\n else {\n var a01 = a0,\n a11 = a1,\n a00 = a0,\n a10 = a1,\n da0 = da,\n da1 = da,\n ap = padAngle.apply(this, arguments) / 2,\n rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)),\n rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),\n rc0 = rc,\n rc1 = rc,\n t0,\n t1;\n\n // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.\n if (rp > epsilon) {\n var p0 = asin(rp / r0 * sin(ap)),\n p1 = asin(rp / r1 * sin(ap));\n if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;\n else da0 = 0, a00 = a10 = (a0 + a1) / 2;\n if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;\n else da1 = 0, a01 = a11 = (a0 + a1) / 2;\n }\n\n var x01 = r1 * cos(a01),\n y01 = r1 * sin(a01),\n x10 = r0 * cos(a10),\n y10 = r0 * sin(a10);\n\n // Apply rounded corners?\n if (rc > epsilon) {\n var x11 = r1 * cos(a11),\n y11 = r1 * sin(a11),\n x00 = r0 * cos(a00),\n y00 = r0 * sin(a00),\n oc;\n\n // Restrict the corner radius according to the sector angle.\n if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {\n var ax = x01 - oc[0],\n ay = y01 - oc[1],\n bx = x11 - oc[0],\n by = y11 - oc[1],\n kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2),\n lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n rc0 = min(rc, (r0 - lc) / (kc - 1));\n rc1 = min(rc, (r1 - lc) / (kc + 1));\n }\n }\n\n // Is the sector collapsed to a line?\n if (!(da1 > epsilon)) context.moveTo(x01, y01);\n\n // Does the sector’s outer ring have rounded corners?\n else if (rc1 > epsilon) {\n t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);\n t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);\n\n context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw);\n context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the outer ring just a circular arc?\n else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);\n\n // Is there no inner ring, and it’s a circular sector?\n // Or perhaps it’s an annular sector collapsed due to padding?\n if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10);\n\n // Does the sector’s inner ring (or point) have rounded corners?\n else if (rc0 > epsilon) {\n t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);\n t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);\n\n context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);\n\n // Have the corners merged?\n if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw);\n\n // Otherwise, draw the two corners and the ring.\n else {\n context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw);\n context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw);\n context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw);\n }\n }\n\n // Or is the inner ring just a circular arc?\n else context.arc(0, 0, r0, a10, a00, cw);\n }\n\n context.closePath();\n\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n arc.centroid = function() {\n var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,\n a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2;\n return [cos(a) * r, sin(a) * r];\n };\n\n arc.innerRadius = function(_) {\n return arguments.length ? (innerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : innerRadius;\n };\n\n arc.outerRadius = function(_) {\n return arguments.length ? (outerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : outerRadius;\n };\n\n arc.cornerRadius = function(_) {\n return arguments.length ? (cornerRadius = typeof _ === \"function\" ? _ : constant(+_), arc) : cornerRadius;\n };\n\n arc.padRadius = function(_) {\n return arguments.length ? (padRadius = _ == null ? null : typeof _ === \"function\" ? _ : constant(+_), arc) : padRadius;\n };\n\n arc.startAngle = function(_) {\n return arguments.length ? (startAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : startAngle;\n };\n\n arc.endAngle = function(_) {\n return arguments.length ? (endAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : endAngle;\n };\n\n arc.padAngle = function(_) {\n return arguments.length ? (padAngle = typeof _ === \"function\" ? _ : constant(+_), arc) : padAngle;\n };\n\n arc.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), arc) : context;\n };\n\n return arc;\n}\n","function Linear(context) {\n this._context = context;\n}\n\nLinear.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: this._context.lineTo(x, y); break;\n }\n }\n};\n\nexport default function(context) {\n return new Linear(context);\n}\n","import curveLinear from \"./linear\";\n\nexport var curveRadialLinear = curveRadial(curveLinear);\n\nfunction Radial(curve) {\n this._curve = curve;\n}\n\nRadial.prototype = {\n areaStart: function() {\n this._curve.areaStart();\n },\n areaEnd: function() {\n this._curve.areaEnd();\n },\n lineStart: function() {\n this._curve.lineStart();\n },\n lineEnd: function() {\n this._curve.lineEnd();\n },\n point: function(a, r) {\n this._curve.point(r * Math.sin(a), r * -Math.cos(a));\n }\n};\n\nexport default function curveRadial(curve) {\n\n function radial(context) {\n return new Radial(curve(context));\n }\n\n radial._curve = curve;\n\n return radial;\n}\n","export var slice = Array.prototype.slice;\n","var tan30 = Math.sqrt(1 / 3),\n tan30_2 = tan30 * 2;\n\nexport default {\n draw: function(context, size) {\n var y = Math.sqrt(size / tan30_2),\n x = y * tan30;\n context.moveTo(0, -y);\n context.lineTo(x, 0);\n context.lineTo(0, y);\n context.lineTo(-x, 0);\n context.closePath();\n }\n};\n","import {pi, tau} from \"../math\";\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / pi);\n context.moveTo(r, 0);\n context.arc(0, 0, r, 0, tau);\n }\n};\n","import {pi, tau} from \"../math\";\n\nvar ka = 0.89081309152928522810,\n kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10),\n kx = Math.sin(tau / 10) * kr,\n ky = -Math.cos(tau / 10) * kr;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size * ka),\n x = kx * r,\n y = ky * r;\n context.moveTo(0, -r);\n context.lineTo(x, y);\n for (var i = 1; i < 5; ++i) {\n var a = tau * i / 5,\n c = Math.cos(a),\n s = Math.sin(a);\n context.lineTo(s * r, -c * r);\n context.lineTo(c * x - s * y, s * x + c * y);\n }\n context.closePath();\n }\n};\n","export default function() {}\n","var sqrt3 = Math.sqrt(3);\n\nexport default {\n draw: function(context, size) {\n var y = -Math.sqrt(size / (sqrt3 * 3));\n context.moveTo(0, y * 2);\n context.lineTo(-sqrt3 * y, -y);\n context.lineTo(sqrt3 * y, -y);\n context.closePath();\n }\n};\n","var c = -0.5,\n s = Math.sqrt(3) / 2,\n k = 1 / Math.sqrt(12),\n a = (k / 2 + 1) * 3;\n\nexport default {\n draw: function(context, size) {\n var r = Math.sqrt(size / a),\n x0 = r / 2,\n y0 = r * k,\n x1 = x0,\n y1 = r * k + r,\n x2 = -x1,\n y2 = y1;\n context.moveTo(x0, y0);\n context.lineTo(x1, y1);\n context.lineTo(x2, y2);\n context.lineTo(c * x0 - s * y0, s * x0 + c * y0);\n context.lineTo(c * x1 - s * y1, s * x1 + c * y1);\n context.lineTo(c * x2 - s * y2, s * x2 + c * y2);\n context.lineTo(c * x0 + s * y0, c * y0 - s * x0);\n context.lineTo(c * x1 + s * y1, c * y1 - s * x1);\n context.lineTo(c * x2 + s * y2, c * y2 - s * x2);\n context.closePath();\n }\n};\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n (2 * that._x0 + that._x1) / 3,\n (2 * that._y0 + that._y1) / 3,\n (that._x0 + 2 * that._x1) / 3,\n (that._y0 + 2 * that._y1) / 3,\n (that._x0 + 4 * that._x1 + x) / 6,\n (that._y0 + 4 * that._y1 + y) / 6\n );\n}\n\nexport function Basis(context) {\n this._context = context;\n}\n\nBasis.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 3: point(this, this._x1, this._y1); // proceed\n case 2: this._context.lineTo(this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new Basis(context);\n}\n","import noop from \"../noop\";\nimport {point} from \"./basis\";\n\nfunction BasisClosed(context) {\n this._context = context;\n}\n\nBasisClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x2, this._y2);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);\n this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x2, this._y2);\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x2 = x, this._y2 = y; break;\n case 1: this._point = 2; this._x3 = x, this._y3 = y; break;\n case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisClosed(context);\n}\n","import {point} from \"./basis\";\n\nfunction BasisOpen(context) {\n this._context = context;\n}\n\nBasisOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n }\n};\n\nexport default function(context) {\n return new BasisOpen(context);\n}\n","import {Basis} from \"./basis\";\n\nfunction Bundle(context, beta) {\n this._basis = new Basis(context);\n this._beta = beta;\n}\n\nBundle.prototype = {\n lineStart: function() {\n this._x = [];\n this._y = [];\n this._basis.lineStart();\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n j = x.length - 1;\n\n if (j > 0) {\n var x0 = x[0],\n y0 = y[0],\n dx = x[j] - x0,\n dy = y[j] - y0,\n i = -1,\n t;\n\n while (++i <= j) {\n t = i / j;\n this._basis.point(\n this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),\n this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)\n );\n }\n }\n\n this._x = this._y = null;\n this._basis.lineEnd();\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\nexport default (function custom(beta) {\n\n function bundle(context) {\n return beta === 1 ? new Basis(context) : new Bundle(context, beta);\n }\n\n bundle.beta = function(beta) {\n return custom(+beta);\n };\n\n return bundle;\n})(0.85);\n","export function point(that, x, y) {\n that._context.bezierCurveTo(\n that._x1 + that._k * (that._x2 - that._x0),\n that._y1 + that._k * (that._y2 - that._y0),\n that._x2 + that._k * (that._x1 - x),\n that._y2 + that._k * (that._y1 - y),\n that._x2,\n that._y2\n );\n}\n\nexport function Cardinal(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinal.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: point(this, this._x1, this._y1); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; this._x1 = x, this._y1 = y; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new Cardinal(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import noop from \"../noop\";\nimport {point} from \"./cardinal\";\n\nexport function CardinalClosed(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalClosed(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {point} from \"./cardinal\";\n\nexport function CardinalOpen(context, tension) {\n this._context = context;\n this._k = (1 - tension) / 6;\n}\n\nCardinalOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(tension) {\n\n function cardinal(context) {\n return new CardinalOpen(context, tension);\n }\n\n cardinal.tension = function(tension) {\n return custom(+tension);\n };\n\n return cardinal;\n})(0);\n","import {epsilon} from \"../math\";\nimport {Cardinal} from \"./cardinal\";\n\nexport function point(that, x, y) {\n var x1 = that._x1,\n y1 = that._y1,\n x2 = that._x2,\n y2 = that._y2;\n\n if (that._l01_a > epsilon) {\n var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,\n n = 3 * that._l01_a * (that._l01_a + that._l12_a);\n x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;\n y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;\n }\n\n if (that._l23_a > epsilon) {\n var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,\n m = 3 * that._l23_a * (that._l23_a + that._l12_a);\n x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;\n y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;\n }\n\n that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);\n}\n\nfunction CatmullRom(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRom.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x2, this._y2); break;\n case 3: this.point(this._x2, this._y2); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalClosed} from \"./cardinalClosed\";\nimport noop from \"../noop\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomClosed(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =\n this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 1: {\n this._context.moveTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 2: {\n this._context.lineTo(this._x3, this._y3);\n this._context.closePath();\n break;\n }\n case 3: {\n this.point(this._x3, this._y3);\n this.point(this._x4, this._y4);\n this.point(this._x5, this._y5);\n break;\n }\n }\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; this._x3 = x, this._y3 = y; break;\n case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;\n case 2: this._point = 3; this._x5 = x, this._y5 = y; break;\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import {CardinalOpen} from \"./cardinalOpen\";\nimport {point} from \"./catmullRom\";\n\nfunction CatmullRomOpen(context, alpha) {\n this._context = context;\n this._alpha = alpha;\n}\n\nCatmullRomOpen.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 = this._x2 =\n this._y0 = this._y1 = this._y2 = NaN;\n this._l01_a = this._l12_a = this._l23_a =\n this._l01_2a = this._l12_2a = this._l23_2a =\n this._point = 0;\n },\n lineEnd: function() {\n if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n\n if (this._point) {\n var x23 = this._x2 - x,\n y23 = this._y2 - y;\n this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));\n }\n\n switch (this._point) {\n case 0: this._point = 1; break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;\n case 3: this._point = 4; // proceed\n default: point(this, x, y); break;\n }\n\n this._l01_a = this._l12_a, this._l12_a = this._l23_a;\n this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;\n this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;\n this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;\n }\n};\n\nexport default (function custom(alpha) {\n\n function catmullRom(context) {\n return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);\n }\n\n catmullRom.alpha = function(alpha) {\n return custom(+alpha);\n };\n\n return catmullRom;\n})(0.5);\n","import noop from \"../noop\";\n\nfunction LinearClosed(context) {\n this._context = context;\n}\n\nLinearClosed.prototype = {\n areaStart: noop,\n areaEnd: noop,\n lineStart: function() {\n this._point = 0;\n },\n lineEnd: function() {\n if (this._point) this._context.closePath();\n },\n point: function(x, y) {\n x = +x, y = +y;\n if (this._point) this._context.lineTo(x, y);\n else this._point = 1, this._context.moveTo(x, y);\n }\n};\n\nexport default function(context) {\n return new LinearClosed(context);\n}\n","function sign(x) {\n return x < 0 ? -1 : 1;\n}\n\n// Calculate the slopes of the tangents (Hermite-type interpolation) based on\n// the following paper: Steffen, M. 1990. A Simple Method for Monotonic\n// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.\n// NOV(II), P. 443, 1990.\nfunction slope3(that, x2, y2) {\n var h0 = that._x1 - that._x0,\n h1 = x2 - that._x1,\n s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),\n s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),\n p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n// Calculate a one-sided slope.\nfunction slope2(that, t) {\n var h = that._x1 - that._x0;\n return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;\n}\n\n// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations\n// \"you can express cubic Hermite interpolation in terms of cubic Bézier curves\n// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1\".\nfunction point(that, t0, t1) {\n var x0 = that._x0,\n y0 = that._y0,\n x1 = that._x1,\n y1 = that._y1,\n dx = (x1 - x0) / 3;\n that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);\n}\n\nfunction MonotoneX(context) {\n this._context = context;\n}\n\nMonotoneX.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x0 = this._x1 =\n this._y0 = this._y1 =\n this._t0 = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n switch (this._point) {\n case 2: this._context.lineTo(this._x1, this._y1); break;\n case 3: point(this, this._t0, slope2(this, this._t0)); break;\n }\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n this._line = 1 - this._line;\n },\n point: function(x, y) {\n var t1 = NaN;\n\n x = +x, y = +y;\n if (x === this._x1 && y === this._y1) return; // Ignore coincident points.\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; break;\n case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break;\n default: point(this, this._t0, t1 = slope3(this, x, y)); break;\n }\n\n this._x0 = this._x1, this._x1 = x;\n this._y0 = this._y1, this._y1 = y;\n this._t0 = t1;\n }\n}\n\nfunction MonotoneY(context) {\n this._context = new ReflectContext(context);\n}\n\n(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {\n MonotoneX.prototype.point.call(this, y, x);\n};\n\nfunction ReflectContext(context) {\n this._context = context;\n}\n\nReflectContext.prototype = {\n moveTo: function(x, y) { this._context.moveTo(y, x); },\n closePath: function() { this._context.closePath(); },\n lineTo: function(x, y) { this._context.lineTo(y, x); },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }\n};\n\nexport function monotoneX(context) {\n return new MonotoneX(context);\n}\n\nexport function monotoneY(context) {\n return new MonotoneY(context);\n}\n","function Natural(context) {\n this._context = context;\n}\n\nNatural.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = [];\n this._y = [];\n },\n lineEnd: function() {\n var x = this._x,\n y = this._y,\n n = x.length;\n\n if (n) {\n this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);\n if (n === 2) {\n this._context.lineTo(x[1], y[1]);\n } else {\n var px = controlPoints(x),\n py = controlPoints(y);\n for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {\n this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);\n }\n }\n }\n\n if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();\n this._line = 1 - this._line;\n this._x = this._y = null;\n },\n point: function(x, y) {\n this._x.push(+x);\n this._y.push(+y);\n }\n};\n\n// See https://www.particleincell.com/2012/bezier-splines/ for derivation.\nfunction controlPoints(x) {\n var i,\n n = x.length - 1,\n m,\n a = new Array(n),\n b = new Array(n),\n r = new Array(n);\n a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];\n for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];\n a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];\n for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];\n a[n - 1] = r[n - 1] / b[n - 1];\n for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];\n b[n - 1] = (x[n] + a[n - 1]) / 2;\n for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];\n return [a, b];\n}\n\nexport default function(context) {\n return new Natural(context);\n}\n","function Step(context, t) {\n this._context = context;\n this._t = t;\n}\n\nStep.prototype = {\n areaStart: function() {\n this._line = 0;\n },\n areaEnd: function() {\n this._line = NaN;\n },\n lineStart: function() {\n this._x = this._y = NaN;\n this._point = 0;\n },\n lineEnd: function() {\n if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);\n if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;\n },\n point: function(x, y) {\n x = +x, y = +y;\n switch (this._point) {\n case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n case 1: this._point = 2; // proceed\n default: {\n if (this._t <= 0) {\n this._context.lineTo(this._x, y);\n this._context.lineTo(x, y);\n } else {\n var x1 = this._x * (1 - this._t) + x * this._t;\n this._context.lineTo(x1, this._y);\n this._context.lineTo(x1, y);\n }\n break;\n }\n }\n this._x = x, this._y = y;\n }\n};\n\nexport default function(context) {\n return new Step(context, 0.5);\n}\n\nexport function stepBefore(context) {\n return new Step(context, 0);\n}\n\nexport function stepAfter(context) {\n return new Step(context, 1);\n}\n","import ascending from \"./ascending\";\n\nexport default function(series) {\n return ascending(series).reverse();\n}\n","import { arc as arcFactory } from \"d3-shape\";\n\nimport {\n LinkedVisualConsoleProps,\n UnknownObject,\n WithModuleProps\n} from \"../types\";\nimport {\n linkedVCPropsDecoder,\n modulePropsDecoder,\n notEmptyStringOr,\n parseIntOr,\n parseFloatOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type PercentileProps = {\n type: ItemType.PERCENTILE_BAR;\n percentileType:\n | \"progress-bar\"\n | \"bubble\"\n | \"circular-progress-bar\"\n | \"circular-progress-bar-alt\";\n valueType: \"percent\" | \"value\";\n minValue: number | null;\n maxValue: number | null;\n color: string | null;\n labelColor: string | null;\n value: number | null;\n unit: string | null;\n} & ItemProps &\n WithModuleProps &\n LinkedVisualConsoleProps;\n\n/**\n * Extract a valid enum value from a raw type value.\n * @param type Raw value.\n */\nfunction extractPercentileType(\n type: unknown\n): PercentileProps[\"percentileType\"] {\n switch (type) {\n case \"progress-bar\":\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n return type;\n default:\n case ItemType.PERCENTILE_BAR:\n return \"progress-bar\";\n case ItemType.PERCENTILE_BUBBLE:\n return \"bubble\";\n case ItemType.CIRCULAR_PROGRESS_BAR:\n return \"circular-progress-bar\";\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return \"circular-progress-bar-alt\";\n }\n}\n\n/**\n * Extract a valid enum value from a raw value type value.\n * @param type Raw value.\n */\nfunction extractValueType(valueType: unknown): PercentileProps[\"valueType\"] {\n switch (valueType) {\n case \"percent\":\n case \"value\":\n return valueType;\n default:\n return \"percent\";\n }\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the percentile props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function percentilePropsDecoder(\n data: UnknownObject\n): PercentileProps | never {\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.PERCENTILE_BAR,\n percentileType: extractPercentileType(data.percentileType || data.type),\n valueType: extractValueType(data.valueType),\n minValue: parseIntOr(data.minValue, null),\n maxValue: parseIntOr(data.maxValue, null),\n color: notEmptyStringOr(data.color, null),\n labelColor: notEmptyStringOr(data.labelColor, null),\n value: parseFloatOr(data.value, null),\n unit: notEmptyStringOr(data.unit, null),\n ...modulePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n ...linkedVCPropsDecoder(data) // Object spread. It will merge the properties of the two objects.\n };\n}\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nexport default class Percentile extends Item {\n protected createDomElement(): HTMLElement {\n const colors = {\n background: \"#000000\",\n progress: this.props.color || \"#F0F0F0\",\n text: this.props.labelColor || \"#444444\"\n };\n // Progress.\n const progress = this.getProgress();\n // Main element.\n const element = document.createElement(\"div\");\n // SVG container.\n const svg = document.createElementNS(svgNS, \"svg\");\n\n var formatValue;\n if (this.props.value != null) {\n if (Intl) {\n formatValue = Intl.NumberFormat(\"en-EN\").format(this.props.value);\n } else {\n formatValue = this.props.value;\n }\n }\n\n switch (this.props.percentileType) {\n case \"progress-bar\":\n {\n const backgroundRect = document.createElementNS(svgNS, \"rect\");\n backgroundRect.setAttribute(\"fill\", colors.background);\n backgroundRect.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundRect.setAttribute(\"width\", \"100\");\n backgroundRect.setAttribute(\"height\", \"20\");\n backgroundRect.setAttribute(\"rx\", \"5\");\n backgroundRect.setAttribute(\"ry\", \"5\");\n const progressRect = document.createElementNS(svgNS, \"rect\");\n progressRect.setAttribute(\"fill\", colors.progress);\n progressRect.setAttribute(\"fill-opacity\", \"1\");\n progressRect.setAttribute(\"width\", `${progress}`);\n progressRect.setAttribute(\"height\", \"20\");\n progressRect.setAttribute(\"rx\", \"5\");\n progressRect.setAttribute(\"ry\", \"5\");\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"12\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"transform\", \"translate(50 11)\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\") {\n text.style.fontSize = \"6pt\";\n\n text.textContent = this.props.unit\n ? `${formatValue} ${this.props.unit}`\n : `${formatValue}`;\n } else {\n text.textContent = `${progress}%`;\n }\n\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 20\");\n svg.append(backgroundRect, progressRect, text);\n }\n break;\n case \"bubble\":\n case \"circular-progress-bar\":\n case \"circular-progress-bar-alt\":\n {\n // Auto resize SVG using the view box magic: https://css-tricks.com/scale-svg/\n svg.setAttribute(\"viewBox\", \"0 0 100 100\");\n\n if (this.props.percentileType === \"bubble\") {\n // Create and append the circles.\n const backgroundCircle = document.createElementNS(svgNS, \"circle\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"r\", \"50\");\n const progressCircle = document.createElementNS(svgNS, \"circle\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\"r\", `${progress / 2}`);\n\n svg.append(backgroundCircle, progressCircle);\n } else {\n // Create and append the circles.\n const arcProps = {\n innerRadius:\n this.props.percentileType === \"circular-progress-bar\" ? 30 : 0,\n outerRadius: 50,\n startAngle: 0,\n endAngle: Math.PI * 2\n };\n const arc = arcFactory();\n\n const backgroundCircle = document.createElementNS(svgNS, \"path\");\n backgroundCircle.setAttribute(\"transform\", \"translate(50 50)\");\n backgroundCircle.setAttribute(\"fill\", colors.background);\n backgroundCircle.setAttribute(\"fill-opacity\", \"0.5\");\n backgroundCircle.setAttribute(\"d\", `${arc(arcProps)}`);\n const progressCircle = document.createElementNS(svgNS, \"path\");\n progressCircle.setAttribute(\"transform\", \"translate(50 50)\");\n progressCircle.setAttribute(\"fill\", colors.progress);\n progressCircle.setAttribute(\"fill-opacity\", \"1\");\n progressCircle.setAttribute(\n \"d\",\n `${arc({\n ...arcProps,\n endAngle: arcProps.endAngle * (progress / 100)\n })}`\n );\n\n svg.append(backgroundCircle, progressCircle);\n }\n\n // Create and append the text.\n const text = document.createElementNS(svgNS, \"text\");\n text.setAttribute(\"text-anchor\", \"middle\");\n text.setAttribute(\"alignment-baseline\", \"middle\");\n text.setAttribute(\"font-size\", \"16\");\n text.setAttribute(\"font-family\", \"arial\");\n text.setAttribute(\"font-weight\", \"bold\");\n text.setAttribute(\"fill\", colors.text);\n\n if (this.props.valueType === \"value\" && this.props.value != null) {\n // Show value and unit in 1 (no unit) or 2 lines.\n if (this.props.unit && this.props.unit.length > 0) {\n const value = document.createElementNS(svgNS, \"tspan\");\n value.setAttribute(\"x\", \"0\");\n value.setAttribute(\"dy\", \"1em\");\n value.textContent = `${formatValue}`;\n value.style.fontSize = \"8pt\";\n const unit = document.createElementNS(svgNS, \"tspan\");\n unit.setAttribute(\"x\", \"0\");\n unit.setAttribute(\"dy\", \"1em\");\n unit.textContent = `${this.props.unit}`;\n unit.style.fontSize = \"8pt\";\n text.append(value, unit);\n text.setAttribute(\"transform\", \"translate(50 33)\");\n } else {\n text.textContent = `${formatValue}`;\n text.style.fontSize = \"8pt\";\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n } else {\n // Percentage.\n text.textContent = `${progress}%`;\n text.setAttribute(\"transform\", \"translate(50 50)\");\n }\n\n svg.append(text);\n }\n break;\n }\n\n element.append(svg);\n\n return element;\n }\n\n private getProgress(): number {\n const minValue = this.props.minValue || 0;\n const maxValue = this.props.maxValue || 100;\n const value = this.props.value == null ? 0 : this.props.value;\n\n if (value <= minValue) return 0;\n else if (value >= maxValue) return 100;\n else return Math.trunc(((value - minValue) / (maxValue - minValue)) * 100);\n }\n}\n","import { UnknownObject } from \"../types\";\nimport {\n stringIsEmpty,\n notEmptyStringOr,\n decodeBase64,\n parseIntOr\n} from \"../lib\";\nimport Item, { ItemType, ItemProps, itemBasePropsDecoder } from \"../Item\";\n\nexport type ServiceProps = {\n type: ItemType.SERVICE;\n serviceId: number;\n imageSrc: string | null;\n statusImageSrc: string | null;\n encodedTitle: string | null;\n} & ItemProps;\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the service props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function servicePropsDecoder(data: UnknownObject): ServiceProps | never {\n if (data.imageSrc !== null) {\n if (\n typeof data.statusImageSrc !== \"string\" ||\n data.imageSrc.statusImageSrc === 0\n ) {\n throw new TypeError(\"invalid status image src.\");\n }\n } else {\n if (stringIsEmpty(data.encodedTitle)) {\n throw new TypeError(\"missing encode tittle content.\");\n }\n }\n\n if (parseIntOr(data.serviceId, null) === null) {\n throw new TypeError(\"invalid service id.\");\n }\n\n return {\n ...itemBasePropsDecoder(data), // Object spread. It will merge the properties of the two objects.\n type: ItemType.SERVICE,\n serviceId: data.serviceId,\n imageSrc: notEmptyStringOr(data.imageSrc, null),\n statusImageSrc: notEmptyStringOr(data.statusImageSrc, null),\n encodedTitle: notEmptyStringOr(data.encodedTitle, null)\n };\n}\n\nexport default class Service extends Item {\n public createDomElement(): HTMLElement {\n const element = document.createElement(\"div\");\n element.className = \"service\";\n\n if (this.props.statusImageSrc !== null) {\n element.style.background = `url(${this.props.statusImageSrc}) no-repeat`;\n element.style.backgroundSize = \"contain\";\n element.style.backgroundPosition = \"center\";\n } else if (this.props.encodedTitle !== null) {\n element.innerHTML = decodeBase64(this.props.encodedTitle);\n }\n\n return element;\n }\n}\n","import { UnknownObject, Size } from \"./types\";\nimport {\n parseBoolean,\n sizePropsDecoder,\n parseIntOr,\n notEmptyStringOr\n} from \"./lib\";\nimport Item, {\n ItemType,\n ItemProps,\n ItemClickEvent,\n ItemRemoveEvent\n} from \"./Item\";\nimport StaticGraph, { staticGraphPropsDecoder } from \"./items/StaticGraph\";\nimport Icon, { iconPropsDecoder } from \"./items/Icon\";\nimport ColorCloud, { colorCloudPropsDecoder } from \"./items/ColorCloud\";\nimport Group, { groupPropsDecoder } from \"./items/Group\";\nimport Clock, { clockPropsDecoder } from \"./items/Clock\";\nimport Box, { boxPropsDecoder } from \"./items/Box\";\nimport Line, { linePropsDecoder } from \"./items/Line\";\nimport Label, { labelPropsDecoder } from \"./items/Label\";\nimport SimpleValue, { simpleValuePropsDecoder } from \"./items/SimpleValue\";\nimport EventsHistory, {\n eventsHistoryPropsDecoder\n} from \"./items/EventsHistory\";\nimport Percentile, { percentilePropsDecoder } from \"./items/Percentile\";\nimport TypedEvent, { Disposable, Listener } from \"./TypedEvent\";\nimport DonutGraph, { donutGraphPropsDecoder } from \"./items/DonutGraph\";\nimport BarsGraph, { barsGraphPropsDecoder } from \"./items/BarsGraph\";\nimport ModuleGraph, { moduleGraphPropsDecoder } from \"./items/ModuleGraph\";\nimport Service, { servicePropsDecoder } from \"./items/Service\";\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction itemInstanceFrom(data: UnknownObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return new StaticGraph(staticGraphPropsDecoder(data));\n case ItemType.MODULE_GRAPH:\n return new ModuleGraph(moduleGraphPropsDecoder(data));\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return new SimpleValue(simpleValuePropsDecoder(data));\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return new Percentile(percentilePropsDecoder(data));\n case ItemType.LABEL:\n return new Label(labelPropsDecoder(data));\n case ItemType.ICON:\n return new Icon(iconPropsDecoder(data));\n case ItemType.SERVICE:\n return new Service(servicePropsDecoder(data));\n case ItemType.GROUP_ITEM:\n return new Group(groupPropsDecoder(data));\n case ItemType.BOX_ITEM:\n return new Box(boxPropsDecoder(data));\n case ItemType.LINE_ITEM:\n return new Line(linePropsDecoder(data));\n case ItemType.AUTO_SLA_GRAPH:\n return new EventsHistory(eventsHistoryPropsDecoder(data));\n case ItemType.DONUT_GRAPH:\n return new DonutGraph(donutGraphPropsDecoder(data));\n case ItemType.BARS_GRAPH:\n return new BarsGraph(barsGraphPropsDecoder(data));\n case ItemType.CLOCK:\n return new Clock(clockPropsDecoder(data));\n case ItemType.COLOR_CLOUD:\n return new ColorCloud(colorCloudPropsDecoder(data));\n default:\n throw new TypeError(\"item not found\");\n }\n}\n\n// TODO: Document.\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction decodeProps(data: UnknownObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return staticGraphPropsDecoder(data);\n case ItemType.MODULE_GRAPH:\n return moduleGraphPropsDecoder(data);\n case ItemType.SIMPLE_VALUE:\n case ItemType.SIMPLE_VALUE_MAX:\n case ItemType.SIMPLE_VALUE_MIN:\n case ItemType.SIMPLE_VALUE_AVG:\n return simpleValuePropsDecoder(data);\n case ItemType.PERCENTILE_BAR:\n case ItemType.PERCENTILE_BUBBLE:\n case ItemType.CIRCULAR_PROGRESS_BAR:\n case ItemType.CIRCULAR_INTERIOR_PROGRESS_BAR:\n return percentilePropsDecoder(data);\n case ItemType.LABEL:\n return labelPropsDecoder(data);\n case ItemType.ICON:\n return iconPropsDecoder(data);\n case ItemType.SERVICE:\n return servicePropsDecoder(data);\n case ItemType.GROUP_ITEM:\n return groupPropsDecoder(data);\n case ItemType.BOX_ITEM:\n return boxPropsDecoder(data);\n case ItemType.LINE_ITEM:\n return linePropsDecoder(data);\n case ItemType.AUTO_SLA_GRAPH:\n return eventsHistoryPropsDecoder(data);\n case ItemType.DONUT_GRAPH:\n return donutGraphPropsDecoder(data);\n case ItemType.BARS_GRAPH:\n return barsGraphPropsDecoder(data);\n case ItemType.CLOCK:\n return clockPropsDecoder(data);\n case ItemType.COLOR_CLOUD:\n return colorCloudPropsDecoder(data);\n default:\n throw new TypeError(\"decoder not found\");\n }\n}\n\n// Base properties.\nexport interface VisualConsoleProps extends Size {\n readonly id: number;\n name: string;\n groupId: number;\n backgroundURL: string | null; // URL?\n backgroundColor: string | null;\n isFavorite: boolean;\n relationLineWidth: number;\n}\n\n/**\n * Build a valid typed object from a raw object.\n * This will allow us to ensure the type safety.\n *\n * @param data Raw object.\n * @return An object representing the Visual Console props.\n * @throws Will throw a TypeError if some property\n * is missing from the raw object or have an invalid type.\n */\nexport function visualConsolePropsDecoder(\n data: UnknownObject\n): VisualConsoleProps | never {\n // Object destructuring: http://es6-features.org/#ObjectMatchingShorthandNotation\n const {\n id,\n name,\n groupId,\n backgroundURL,\n backgroundColor,\n isFavorite,\n relationLineWidth\n } = data;\n\n if (id == null || isNaN(parseInt(id))) {\n throw new TypeError(\"invalid Id.\");\n }\n if (typeof name !== \"string\" || name.length === 0) {\n throw new TypeError(\"invalid name.\");\n }\n if (groupId == null || isNaN(parseInt(groupId))) {\n throw new TypeError(\"invalid group Id.\");\n }\n\n return {\n id: parseInt(id),\n name,\n groupId: parseInt(groupId),\n backgroundURL: notEmptyStringOr(backgroundURL, null),\n backgroundColor: notEmptyStringOr(backgroundColor, null),\n isFavorite: parseBoolean(isFavorite),\n relationLineWidth: parseIntOr(relationLineWidth, 0),\n ...sizePropsDecoder(data)\n };\n}\n\nexport default class VisualConsole {\n // Reference to the DOM element which will contain the items.\n private readonly containerRef: HTMLElement;\n // Properties.\n private _props: VisualConsoleProps;\n // Visual Console Item instances by their Id.\n private elementsById: {\n [key: number]: Item;\n } = {};\n // Visual Console Item Ids.\n private elementIds: ItemProps[\"id\"][] = [];\n // Dictionary which store the created lines.\n private relations: {\n [key: string]: Line;\n } = {};\n // Event manager for click events.\n private readonly clickEventManager = new TypedEvent<\n ItemClickEvent\n >();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n /**\n * React to a click on an element.\n * @param e Event object.\n */\n private handleElementClick: (e: ItemClickEvent) => void = e => {\n this.clickEventManager.emit(e);\n // console.log(`Clicked element #${e.data.id}`, e);\n };\n\n /**\n * Clear some element references.\n * @param e Event object.\n */\n private handleElementRemove: (e: ItemRemoveEvent) => void = e => {\n // Remove the element from the list and its relations.\n this.elementIds = this.elementIds.filter(id => id !== e.data.id);\n delete this.elementsById[e.data.id];\n this.clearRelations(e.data.id);\n };\n\n public constructor(\n container: HTMLElement,\n props: UnknownObject,\n items: UnknownObject[]\n ) {\n this.containerRef = container;\n this._props = visualConsolePropsDecoder(props);\n\n // Force the first render.\n this.render();\n\n // Sort by isOnTop, id ASC\n items = items.sort(function(a, b) {\n if (\n a.isOnTop == null ||\n b.isOnTop == null ||\n a.id == null ||\n b.id == null\n ) {\n return 0;\n }\n\n if (a.isOnTop && !b.isOnTop) return 1;\n else if (!a.isOnTop && b.isOnTop) return -1;\n else if (a.id > b.id) return 1;\n else return -1;\n });\n\n // Initialize the items.\n items.forEach(item => {\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n this.elementIds.push(itemInstance.props.id);\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n });\n\n // Create lines.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `elements` property.\n * @return Properties.\n */\n public get elements(): Item[] {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n return this.elementIds\n .map(id => this.elementsById[id])\n .filter(_ => _ != null) as Item[];\n }\n\n /**\n * Public setter of the `elements` property.\n * @param items.\n */\n public updateElements(items: UnknownObject[]): void {\n const itemIds = items.map(item => item.id || null).filter(id => id != null);\n itemIds as number[]; // Tell the type system to rely on us.\n // Get the elements we should delete.\n const deletedIds: number[] = this.elementIds.filter(\n id => itemIds.indexOf(id) < 0\n );\n // Delete the elements.\n deletedIds.forEach(id => {\n if (this.elementsById[id] != null) {\n this.elementsById[id].remove();\n delete this.elementsById[id];\n }\n });\n // Replace the element ids.\n this.elementIds = itemIds;\n\n // Initialize the items.\n items.forEach(item => {\n if (item.id) {\n if (this.elementsById[item.id] == null) {\n // New item.\n try {\n const itemInstance = itemInstanceFrom(item);\n // Add the item to the list.\n this.elementsById[itemInstance.props.id] = itemInstance;\n // Item event handlers.\n itemInstance.onClick(this.handleElementClick);\n itemInstance.onRemove(this.handleElementRemove);\n // Add the item to the DOM.\n this.containerRef.append(itemInstance.elementRef);\n } catch (error) {\n console.log(\"Error creating a new element:\", error.message);\n }\n } else {\n // Update item.\n try {\n this.elementsById[item.id].props = decodeProps(item);\n } catch (error) {\n console.log(\"Error updating an element:\", error.message);\n }\n }\n }\n });\n\n // Re-build relations.\n this.buildRelations();\n }\n\n /**\n * Public accessor of the `props` property.\n * @return Properties.\n */\n public get props(): VisualConsoleProps {\n return { ...this._props }; // Return a copy.\n }\n\n /**\n * Public setter of the `props` property.\n * If the new props are different enough than the\n * stored props, a render would be fired.\n * @param newProps\n */\n public set props(newProps: VisualConsoleProps) {\n const prevProps = this.props;\n // Update the internal props.\n this._props = newProps;\n\n // From this point, things which rely on this.props can access to the changes.\n\n // Re-render.\n this.render(prevProps);\n }\n\n /**\n * Recreate or update the HTMLElement which represents the Visual Console into the DOM.\n * @param prevProps If exists it will be used to only DOM updates instead of a full replace.\n */\n public render(prevProps: VisualConsoleProps | null = null): void {\n if (prevProps) {\n if (prevProps.backgroundURL !== this.props.backgroundURL) {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n }\n if (prevProps.backgroundColor !== this.props.backgroundColor) {\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n }\n if (this.sizeChanged(prevProps, this.props)) {\n this.resizeElement(this.props.width, this.props.height);\n }\n } else {\n this.containerRef.style.backgroundImage =\n this.props.backgroundURL !== null\n ? `url(${this.props.backgroundURL})`\n : null;\n\n this.containerRef.style.backgroundColor = this.props.backgroundColor;\n this.resizeElement(this.props.width, this.props.height);\n }\n }\n\n /**\n * Compare the previous and the new size and return\n * a boolean value in case the size changed.\n * @param prevSize\n * @param newSize\n * @return Whether the size changed or not.\n */\n public sizeChanged(prevSize: Size, newSize: Size): boolean {\n return (\n prevSize.width !== newSize.width || prevSize.height !== newSize.height\n );\n }\n\n /**\n * Resize the DOM container.\n * @param width\n * @param height\n */\n public resizeElement(width: number, height: number): void {\n this.containerRef.style.width = `${width}px`;\n this.containerRef.style.height = `${height}px`;\n }\n\n /**\n * Update the size into the properties and resize the DOM container.\n * @param width\n * @param height\n */\n public resize(width: number, height: number): void {\n this.props = {\n ...this.props, // Object spread: http://es6-features.org/#SpreadOperator\n width,\n height\n };\n }\n\n /**\n * To remove the event listeners and the elements from the DOM.\n */\n public remove(): void {\n this.disposables.forEach(d => d.dispose()); // Arrow function.\n this.elements.forEach(e => e.remove()); // Arrow function.\n this.elementsById = {};\n this.elementIds = [];\n // Clear relations.\n this.clearRelations();\n // Clean container.\n this.containerRef.innerHTML = \"\";\n }\n\n /**\n * Create line elements which connect the elements with their parents.\n */\n private buildRelations(): void {\n // Clear relations.\n this.clearRelations();\n // Add relations.\n this.elements.forEach(item => {\n if (item.props.parentId !== null) {\n const parent = this.elementsById[item.props.parentId];\n const child = this.elementsById[item.props.id];\n if (parent && child) this.addRelationLine(parent, child);\n }\n });\n }\n\n /**\n * @param itemId Optional identifier of a parent or child item.\n * Remove the line elements which connect the elements with their parents.\n */\n private clearRelations(itemId?: number): void {\n if (itemId != null) {\n for (let key in this.relations) {\n const ids = key.split(\"|\");\n const parentId = Number.parseInt(ids[0]);\n const childId = Number.parseInt(ids[1]);\n\n if (itemId === parentId || itemId === childId) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n } else {\n for (let key in this.relations) {\n this.relations[key].remove();\n delete this.relations[key];\n }\n }\n }\n\n /**\n * Retrieve the line element which represent the relation between items.\n * @param parentId Identifier of the parent item.\n * @param childId Itentifier of the child item.\n * @return The line element or nothing.\n */\n private getRelationLine(parentId: number, childId: number): Line | null {\n const identifier = `${parentId}|${childId}`;\n return this.relations[identifier] || null;\n }\n\n /**\n * Add a new line item to represent a relation between the items.\n * @param parent Parent item.\n * @param child Child item.\n * @return Whether the line was added or not.\n */\n private addRelationLine(\n parent: Item,\n child: Item\n ): Line {\n const identifier = `${parent.props.id}|${child.props.id}`;\n if (this.relations[identifier] != null) {\n this.relations[identifier].remove();\n }\n\n // Get the items center.\n const startX = parent.props.x + parent.elementRef.clientWidth / 2;\n const startY =\n parent.props.y +\n (parent.elementRef.clientHeight - parent.labelElementRef.clientHeight) /\n 2;\n const endX = child.props.x + child.elementRef.clientWidth / 2;\n const endY =\n child.props.y +\n (child.elementRef.clientHeight - child.labelElementRef.clientHeight) / 2;\n\n const line = new Line(\n linePropsDecoder({\n id: 0,\n type: ItemType.LINE_ITEM,\n startX,\n startY,\n endX,\n endY,\n width: 0,\n height: 0,\n lineWidth: this.props.relationLineWidth,\n color: \"#CCCCCC\"\n })\n );\n // Save a reference to the line item.\n this.relations[identifier] = line;\n\n // Add the line to the DOM.\n line.elementRef.style.zIndex = \"0\";\n this.containerRef.append(line.elementRef);\n\n return line;\n }\n\n /**\n * Add an event handler to the click of the linked visual console elements.\n * @param listener Function which is going to be executed when a linked console is clicked.\n */\n public onClick(listener: Listener>): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.clickEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n","import TypedEvent, { Disposable, Listener } from \"../TypedEvent\";\n\ninterface Cancellable {\n cancel(): void;\n}\n\ntype AsyncTaskStatus = \"waiting\" | \"started\" | \"cancelled\" | \"finished\";\ntype AsyncTaskInitiator = (done: () => void) => Cancellable;\n\n/**\n * Defines an async task which can be started and cancelled.\n * It's possible to observe the status changes of the task.\n */\nclass AsyncTask {\n private readonly taskInitiator: AsyncTaskInitiator;\n private cancellable: Cancellable = { cancel: () => {} };\n private _status: AsyncTaskStatus = \"waiting\";\n\n // Event manager for status change events.\n private readonly statusChangeEventManager = new TypedEvent();\n // List of references to clean the event listeners.\n private readonly disposables: Disposable[] = [];\n\n public constructor(taskInitiator: AsyncTaskInitiator) {\n this.taskInitiator = taskInitiator;\n }\n\n /**\n * Public setter of the `status` property.\n * @param status.\n */\n public set status(status: AsyncTaskStatus) {\n this._status = status;\n this.statusChangeEventManager.emit(status);\n }\n\n /**\n * Public accessor of the `status` property.\n * @return status.\n */\n public get status() {\n return this._status;\n }\n\n /**\n * Start the async task.\n */\n public init(): void {\n this.cancellable = this.taskInitiator(() => {\n this.status = \"finished\";\n });\n this.status = \"started\";\n }\n\n /**\n * Cancel the async task.\n */\n public cancel(): void {\n this.cancellable.cancel();\n this.status = \"cancelled\";\n }\n\n /**\n * Add an event handler to the status change.\n * @param listener Function which is going to be executed when the status changes.\n */\n public onStatusChange(listener: Listener): Disposable {\n /*\n * The '.on' function returns a function which will clean the event\n * listener when executed. We store all the 'dispose' functions to\n * call them when the item should be cleared.\n */\n const disposable = this.statusChangeEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n}\n\n/**\n * Wrap an async task into another which will execute that task indefinitely\n * every time the tash finnish and the chosen period ends.\n * Will last until cancellation.\n *\n * @param task Async task to execute.\n * @param period Time in milliseconds to wait until the next async esecution.\n *\n * @return A new async task.\n */\nfunction asyncPeriodic(task: AsyncTask, period: number): AsyncTask {\n return new AsyncTask(() => {\n let ref: number | null = null;\n\n task.onStatusChange(status => {\n if (status === \"finished\") {\n ref = window.setTimeout(() => {\n task.init();\n }, period);\n }\n });\n\n task.init();\n\n return {\n cancel: () => {\n if (ref) clearTimeout(ref);\n task.cancel();\n }\n };\n });\n}\n\n/**\n * Manages a list of async tasks.\n */\nexport default class AsyncTaskManager {\n private tasks: { [identifier: string]: AsyncTask } = {};\n\n /**\n * Adds an async task to the manager.\n *\n * @param identifier Unique identifier.\n * @param taskInitiator Function to initialize the async task.\n * Should return a structure to cancel the task.\n * @param period Optional period to repeat the task indefinitely.\n */\n public add(\n identifier: string,\n taskInitiator: AsyncTaskInitiator,\n period: number = 0\n ): AsyncTask {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n\n const asyncTask =\n period > 0\n ? asyncPeriodic(new AsyncTask(taskInitiator), period)\n : new AsyncTask(taskInitiator);\n\n this.tasks[identifier] = asyncTask;\n\n return this.tasks[identifier];\n }\n\n /**\n * Starts an async task.\n *\n * @param identifier Unique identifier.\n */\n public init(identifier: string) {\n if (\n this.tasks[identifier] &&\n (this.tasks[identifier].status === \"waiting\" ||\n this.tasks[identifier].status === \"cancelled\" ||\n this.tasks[identifier].status === \"finished\")\n ) {\n this.tasks[identifier].init();\n }\n }\n\n /**\n * Cancel a running async task.\n *\n * @param identifier Unique identifier.\n */\n public cancel(identifier: string) {\n if (this.tasks[identifier] && this.tasks[identifier].status === \"started\") {\n this.tasks[identifier].cancel();\n }\n }\n}\n","/*\n * Useful resources.\n * http://es6-features.org/\n * http://exploringjs.com/es6\n * https://www.typescriptlang.org/\n */\n\nimport \"./main.css\"; // CSS import.\nimport VisualConsole from \"./VisualConsole\";\nimport AsyncTaskManager from \"./lib/AsyncTaskManager\";\n\n// Export the VisualConsole class to the global object.\n// eslint-disable-next-line\n(window as any).VisualConsole = VisualConsole;\n\n// Export the AsyncTaskManager class to the global object.\n// eslint-disable-next-line\n(window as any).AsyncTaskManager = AsyncTaskManager;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/pandora_console/index.php b/pandora_console/index.php index 3c33a1a1e0..730e404a20 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -902,15 +902,6 @@ clear_pandora_error_for_header(); $config['logged'] = false; extensions_load_extensions($process_login); -// Check for update manager messages -if (license_free() && is_user_admin($config['id_user']) - && (($config['last_um_check'] < time()) - || (!isset($config['last_um_check']))) -) { - include_once 'include/functions_update_manager.php'; - update_manager_download_messages(); -} - if ($process_login) { // Call all extensions login function extensions_call_login_function(); @@ -986,31 +977,9 @@ if ($old_global_counter_chat != $now_global_counter_chat) { } } -// Pop-ups display order: -// 1) login_required (timezone and email) -// 2) identification (newsletter and register) -// 3) last_message (update manager message popup -// 4) login_help (online help, enterpirse version, forums, documentation) -if (is_user_admin($config['id_user']) - && (!isset($config['initial_wizard']) || $config['initial_wizard'] != 1) -) { - include_once 'general/login_required.php'; -} +require_once 'general/register.php'; if (get_parameter('login', 0) !== 0) { - // Display news dialog - include_once 'general/news_dialog.php'; - - // Display login help info dialog - // If it's configured to not skip this - $display_previous_popup = false; - if (license_free() && is_user_admin($config['id_user']) && $config['initial_wizard'] == 1) { - $display_previous_popup = include_once 'general/login_identification_wizard.php'; - if ($display_previous_popup === false) { - $display_previous_popup = include_once 'general/last_message.php'; - } - } - if ((!isset($config['skip_login_help_dialog']) || $config['skip_login_help_dialog'] == 0) && $display_previous_popup === false && $config['initial_wizard'] == 1 @@ -1223,6 +1192,11 @@ if ($config['pure'] == 0) { // main_pure } +echo '
    '; +echo '
    '; + +echo '
    '; +echo '
    '; if ($config['pure'] == 0) { echo '
    '; @@ -1277,8 +1251,6 @@ require 'include/php_to_js_values.php'; $("HTML, BODY").animate({ scrollTop: 0 }, 500); } - - //Initial load of page $(document).ready(adjustFooter); @@ -1303,66 +1275,109 @@ require 'include/php_to_js_values.php'; })(); function force_run_register () { - run_identification_wizard (1, 0, 0); + jQuery.post ("ajax.php", + { + "page": "general/register", + "load_wizards": 'registration' + }, + function (data) { + $('#wiz_container').empty () + .html (data); + show_registration_wizard(); + }, + "html" + ); } + function force_run_newsletter () { - run_identification_wizard (0, 1, 0); + jQuery.post ("ajax.php", + { + "page": "general/register", + "load_wizards": 'newsletter' + }, + function (data) { + $('#wiz_container').empty () + .html (data); + show_newsletter_wizard (); + }, + "html" + ); } + function first_time_identification () { - run_identification_wizard (-1, -1, 1); + jQuery.post ("ajax.php", + { + "page": "general/register", + "load_wizards": 'initial' + }, + function (data) { + $('#wiz_container').empty () + .html (data); + run_configuration_wizard (); + }, + "html" + ); + } - var times_fired_register_wizard = 0; - - function run_identification_wizard (register, newsletter , return_button) { - if (times_fired_register_wizard) { - $(".ui-dialog-titlebar-close").show(); - - //Reset some values - $("#label-email-newsletter").hide(); - $("#text-email-newsletter").hide(); - $("#required-email-newsletter").hide(); - $("#checkbox-register").removeAttr('checked'); - $("#checkbox-newsletter").removeAttr('checked'); - - // Hide or show parts - if (register == 1) { - $("#checkbox-register").show(); - $("#label-register").show (); - } - if (register == 0) { - $("#checkbox-register").attr ('style', 'display: none !important'); - $("#label-register").hide (); - } - if (newsletter == 1) { - $("#checkbox-newsletter").show(); - $("#label-newsletter").show (); - } - if (newsletter == 0) { - $("#checkbox-newsletter").attr ('style', 'display: none !important'); - $("#label-newsletter").hide (); - } - $("#login_accept_register").dialog('open'); - } - else { - $(".ui-dialog-titlebar-close").show(); - $("#container").append('
    '); - jQuery.post ("ajax.php", - {"page": "general/login_identification_wizard", - "not_return": 1, - "force_register": register, - "force_newsletter": newsletter, - "return_button": return_button}, - function (data) { - $(".id_wizard").hide () - .empty () - .append (data); - }, - "html" + function show_modal(id) { + var match = /notification-(.*)-id-([0-9]+)/.exec(id); + if (!match) { + console.error( + "Cannot handle toast click event. Id not valid: ", + event.target.id ); + return; } - times_fired_register_wizard++; - return false; + jQuery.post ("ajax.php", + { + "page": "godmode/setup/setup_notifications", + "get_notification": 1, + "id": match[2] + }, + function (data) { + notifications_hide(); + try { + var json = JSON.parse(data); + $('#um_msg_receiver') + .empty () + .html (json.mensaje); + + $('#um_msg_receiver').prop('title', json.subject); + + // Launch modal. + $("#um_msg_receiver").dialog({ + resizable: true, + draggable: true, + modal: true, + width: 800, + buttons: [ + { + text: "OK", + click: function() { + $( this ).dialog( "close" ); + } + } + ], + overlay: { + opacity: 0.5, + background: "black" + }, + closeOnEscape: false, + open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); } + }); + + $(".ui-widget-overlay").css("background", "#000"); + $(".ui-widget-overlay").css("opacity", 0.6); + $(".ui-draggable").css("cursor", "inherit"); + + } catch (error) { + console.log(error); + } + + }, + "html" + ); } //Dynamically assign footer position and width. diff --git a/pandora_console/install.php b/pandora_console/install.php index 3b1d25eed7..43c941b797 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -128,8 +128,8 @@
    '; } }); }); - \ No newline at end of file + diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index 7c322e1846..ea575aac97 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -1403,10 +1403,18 @@ foreach ($config['extensions'] as $extension) { } } -if ($tab == 'wux_console_tab') { - $help_header = 'wux_console'; -} else { - $help_header = ''; +switch ($tab) { + case 'wux_console_tab': + $help_header = 'wux_console_tab'; + break; + + case 'main': + $help_header = 'agent_'.$tab.'_tab'; + break; + + default: + $help_header = ''; + break; } ui_print_page_header( diff --git a/pandora_console/operation/gis_maps/render_view.php b/pandora_console/operation/gis_maps/render_view.php index 0a08326e54..90bbeb3dbc 100644 --- a/pandora_console/operation/gis_maps/render_view.php +++ b/pandora_console/operation/gis_maps/render_view.php @@ -165,7 +165,7 @@ ui_print_page_header( __('Map').' » '.__('Map').' '.$map['map_name'], 'images/op_gis.png', false, - '', + 'render_view_tab', false, $buttons ); diff --git a/pandora_console/operation/snmpconsole/snmp_browser.php b/pandora_console/operation/snmpconsole/snmp_browser.php index bae4f9e06f..d15e624162 100644 --- a/pandora_console/operation/snmpconsole/snmp_browser.php +++ b/pandora_console/operation/snmpconsole/snmp_browser.php @@ -172,7 +172,7 @@ ui_print_page_header( __('SNMP Browser'), 'images/op_snmp.png', false, - '', + 'snmp_browser_view', false, [$link] ); diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index b2344c13ad..41a6b9c5d2 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -134,7 +134,7 @@ if (!is_metaconsole()) { $header_title = $header_title.' - '.$header_sub_title; } - ui_print_page_header($header_title, 'images/extensions.png', false, '', false, $tabs); + ui_print_page_header($header_title, 'images/extensions.png', false, 'tree_view', false, $tabs); } // ---------------------Tabs ------------------------------------------- diff --git a/pandora_console/operation/users/user_edit.php b/pandora_console/operation/users/user_edit.php index 2cf575777d..ceb1ae2b42 100644 --- a/pandora_console/operation/users/user_edit.php +++ b/pandora_console/operation/users/user_edit.php @@ -80,12 +80,34 @@ if (isset($_GET['modified']) && !$view_mode) { $upd_info['id_skin'] = get_parameter('skin', $user_info['id_skin']); $upd_info['default_event_filter'] = get_parameter('event_filter', null); $upd_info['block_size'] = get_parameter('block_size', $config['block_size']); - $upd_info['firstname'] = get_parameter('newsletter_reminder', $user_info['first_name']); + $upd_info['middlename'] = get_parameter_switch('newsletter_reminder', $user_info['middlename']); $default_block_size = get_parameter('default_block_size', 0); if ($default_block_size) { $upd_info['block_size'] = 0; } + if ($upd_info['middlename'] == 1) { + // User wants to enable newsletter reminders. + if ($user_info['middlename'] > 0) { + // User has already registered!. No sense. + $upd_info['middlename'] = $user_info['middlename']; + } else { + // Force subscription reminder. + $upd_info['middlename'] = 0; + } + } + + if ($upd_info['middlename'] == 0 || $upd_info['middlename'] == 0) { + // Switch is ON. user had not registered. + $newsletter_reminder_value = 1; + } else if ($upd_info['middlename'] < 1) { + // Switch is OFF. User do not want to register. + $newsletter_reminder_value = 0; + } else if ($upd_info['middlename'] > 0) { + // Switc is OFF. User is already registered! + $newsletter_reminder_value = 0; + } + $upd_info['section'] = get_parameter('section', $user_info['section']); $upd_info['data_section'] = get_parameter('data_section', ''); $dashboard = get_parameter('dashboard', ''); @@ -400,23 +422,28 @@ if (check_acl($config['id_user'], 0, 'ER')) { null, true ).'
    '; -} else if (license_free()) { - $newsletter = '

    '.__('Newsletter Subscribed').':

    '; - if ($user_info['middlename']) { - $newsletter .= ''.__('Already subscribed to %s newsletter', get_product_name()).'
    '; - } else { - $newsletter .= ''.__('Subscribe to our newsletter').'
    '; - } - - $newsletter_reminder = '

    '.__('Newsletter Reminder').':

    '; - if ($user_info['firstname'] != 0) { - $user_info['firstname'] = 1; - } - - $newsletter_reminder .= html_print_checkbox_switch('newsletter_reminder', 1, $user_info['firstname'], true).'
    '; } +$newsletter = '

    '.__('Newsletter Subscribed').':

    '; +if ($user_info['middlename'] > 0) { + $newsletter .= ''.__('Already subscribed to %s newsletter', get_product_name()).''; +} else { + $newsletter .= ''.__('Subscribe to our newsletter').'
    '; + $newsletter_reminder = '

    '.__('Newsletter Reminder').':

    '; + $newsletter_reminder .= html_print_switch( + [ + 'name' => 'newsletter_reminder', + 'value' => $newsletter_reminder_value, + 'disabled' => false, + ] + ); +} + +$newsletter_reminder .= '
    '; + + + $autorefresh_list_out = []; if (is_metaconsole()) { $autorefresh_list_out['monitoring/tactical'] = 'Tactical view'; @@ -587,7 +614,7 @@ foreach ($timezones as $timezone_name => $tz) { } } -echo '
    '; +echo ''; echo '
    diff --git a/pandora_console/operation/users/user_edit_header.php b/pandora_console/operation/users/user_edit_header.php index 4b329eee77..aac28b76f5 100644 --- a/pandora_console/operation/users/user_edit_header.php +++ b/pandora_console/operation/users/user_edit_header.php @@ -1,17 +1,32 @@ diff --git a/pandora_console/operation/visual_console/view.php b/pandora_console/operation/visual_console/view.php index 5134c0d98d..b160f21c0d 100644 --- a/pandora_console/operation/visual_console/view.php +++ b/pandora_console/operation/visual_console/view.php @@ -177,7 +177,17 @@ if ($pure === true) { echo '
    '; echo '
    '; echo __('Refresh').':'; - echo html_print_select(get_refresh_time_array(), 'refr', $refr, '', '', 0, true, false, false); + echo html_print_select( + get_refresh_time_array(), + 'vc-refr', + $refr, + '', + '', + 0, + true, + false, + false + ); echo '
    '; echo '
    '; echo ''; @@ -296,7 +306,7 @@ $visualConsoleItems = VisualConsole::getItemsFromDB( } } } - var visualConsole = createVisualConsole( + var visualConsoleManager = createVisualConsole( container, props, items, @@ -305,16 +315,20 @@ $visualConsoleItems = VisualConsole::getItemsFromDB( handleUpdate ); - $(document).ready (function () { - var refr = ; - var pure = ; - var href = ""; + // Update the data fetch interval. + $('select#vc-refr').change(function(event) { + var refr = Number.parseInt(event.target.value); - if (pure) { - $('select#refr').change(function (event) { - url = js_html_entity_decode( href ) + $('select#refr').val(); - $(document).attr ("location", url); - }); + if (!Number.isNaN(refr)) { + visualConsoleManager.changeUpdateInterval(refr * 1000); // To ms. + + // Change the URL (if the browser has support). + if ("history" in window) { + var regex = /(refr=)\d+(&?)/gi; + var replacement = '$1' + refr + '$2'; + var href = window.location.href.replace(regex, replacement); + window.history.replaceState({}, document.title, href); + } } }); diff --git a/pandora_console/pandora_console.redhat.spec b/pandora_console/pandora_console.redhat.spec index 6ee6193d7d..62bbca26bd 100644 --- a/pandora_console/pandora_console.redhat.spec +++ b/pandora_console/pandora_console.redhat.spec @@ -2,8 +2,8 @@ # Pandora FMS Console # %define name pandorafms_console -%define version 7.0NG.734 -%define release 190516 +%define version 7.0NG.735 +%define release 190527 # User and Group under which Apache is running %define httpd_name httpd diff --git a/pandora_console/pandora_console.rhel7.spec b/pandora_console/pandora_console.rhel7.spec index 4b9c100ab2..cdb32cc641 100644 --- a/pandora_console/pandora_console.rhel7.spec +++ b/pandora_console/pandora_console.rhel7.spec @@ -2,8 +2,8 @@ # Pandora FMS Console # %define name pandorafms_console -%define version 7.0NG.734 -%define release 190516 +%define version 7.0NG.735 +%define release 190527 # User and Group under which Apache is running %define httpd_name httpd diff --git a/pandora_console/pandora_console.spec b/pandora_console/pandora_console.spec index 9e1b0a3436..f75bd6503b 100644 --- a/pandora_console/pandora_console.spec +++ b/pandora_console/pandora_console.spec @@ -2,8 +2,8 @@ # Pandora FMS Console # %define name pandorafms_console -%define version 7.0NG.734 -%define release 190516 +%define version 7.0NG.735 +%define release 190527 %define httpd_name httpd # User and Group under which Apache is running %define httpd_name apache2 diff --git a/pandora_console/pandora_console_install b/pandora_console/pandora_console_install index 707098d231..1e813790ee 100644 --- a/pandora_console/pandora_console_install +++ b/pandora_console/pandora_console_install @@ -9,7 +9,7 @@ # This code is licensed under GPL 2.0 license. # ********************************************************************** -PI_VERSION="7.0NG.734" +PI_VERSION="7.0NG.735" FORCE=0 DESTDIR="" LOG_TIMESTAMP=`date +"%Y/%m/%d %H:%M:%S"` diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index d9e330838b..073c9496e2 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -1303,7 +1303,7 @@ INSERT INTO `tnotification_source`(`description`, `icon`, `max_postpone_time`, ` ("Message", "icono_info_mr.png", 86400, 1, 1, 0), ("Pending task", "icono_info_mr.png", 86400, 1, 1, 0), ("Advertisement", "icono_info_mr.png", 86400, 1, 1, 0), - ("Official communication", "icono_info_mr.png", 86400, 1, 1, 0), + ("Official communication", "icono_logo_pandora.png", 86400, 1, 1, 0), ("Sugerence", "icono_info_mr.png", 86400, 1, 1, 0); -- @@ -1314,4 +1314,8 @@ INSERT INTO `tnotification_source_user`(`id_source`,`id_user`,`enabled`,`also_ma INSERT INTO `tnotification_source_group` SELECT `id`,0 FROM `tnotification_source` WHERE `description`="Message"; +INSERT INTO `tnotification_source_user` (`id_source`, `id_user`, `enabled`, `also_mail`) VALUES + ((SELECT `id` FROM `tnotification_source` WHERE `description`="Official communication"), "admin", 1, 0); + +UPDATE `tnotification_source` SET `enabled`=1 WHERE `description` = 'System status' OR `description` = 'Official communication'; diff --git a/pandora_server/DEBIAN/control b/pandora_server/DEBIAN/control index 5038543426..e0c8a4fa52 100644 --- a/pandora_server/DEBIAN/control +++ b/pandora_server/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-server -Version: 7.0NG.734-190516 +Version: 7.0NG.735-190527 Architecture: all Priority: optional Section: admin diff --git a/pandora_server/DEBIAN/make_deb_package.sh b/pandora_server/DEBIAN/make_deb_package.sh index e80ca470f4..88884097fe 100644 --- a/pandora_server/DEBIAN/make_deb_package.sh +++ b/pandora_server/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.734-190516" +pandora_version="7.0NG.735-190527" package_cpan=0 package_pandora=1 diff --git a/pandora_server/conf/pandora_server.conf.new b/pandora_server/conf/pandora_server.conf.new index 625113b7c1..88868034ce 100644 --- a/pandora_server/conf/pandora_server.conf.new +++ b/pandora_server/conf/pandora_server.conf.new @@ -1,7 +1,7 @@ ############################################################################# # Pandora FMS Server Parameters # Pandora FMS, the Flexible Monitoring System. -# Version 7.0NG.734 +# Version 7.0NG.735 # Licensed under GPL license v2, # (c) 2003-2017 Artica Soluciones Tecnologicas # http://www.pandorafms.com diff --git a/pandora_server/lib/PandoraFMS/Config.pm b/pandora_server/lib/PandoraFMS/Config.pm index c0f1afad15..a72dac39c8 100644 --- a/pandora_server/lib/PandoraFMS/Config.pm +++ b/pandora_server/lib/PandoraFMS/Config.pm @@ -44,8 +44,8 @@ our @EXPORT = qw( ); # version: Defines actual version of Pandora Server for this module only -my $pandora_version = "7.0NG.734"; -my $pandora_build = "190516"; +my $pandora_version = "7.0NG.735"; +my $pandora_build = "190527"; our $VERSION = $pandora_version." ".$pandora_build; # Setup hash @@ -1133,6 +1133,18 @@ sub pandora_load_config { elsif ($parametro =~ m/^fsnmp\s(.*)/i) { $pa_config->{'fsnmp'}= clean_blank($1); } + + # Pandora HA extra + elsif ($parametro =~ m/^ha_file\s(.*)/i) { + $pa_config->{'ha_file'} = clean_blank($1); + } + elsif ($parametro =~ m/^ha_pid_file\s(.*)/i) { + $pa_config->{'ha_pid_file'} = clean_blank($1); + } + elsif ($parametro =~ m/^pandora_service_cmd\s(.*)/i) { + $pa_config->{'pandora_service_cmd'} = clean_blank($1); + } + } # end of loop for parameter # # Set to RDBMS' standard port diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index c92b56ed0d..e15511de44 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -597,6 +597,9 @@ sub PandoraFMS::Recon::Base::create_agents($$) { sub PandoraFMS::Recon::Base::create_agent($$) { my ($self, $device) = @_; + # Clean name. + $device = clean_blank($device); + my @agents = get_db_rows($self->{'dbh'}, 'SELECT * FROM taddress, taddress_agent, tagente WHERE tagente.id_agente = taddress_agent.id_agent @@ -732,21 +735,22 @@ sub PandoraFMS::Recon::Base::create_agent($$) { my $if_name = $self->snmp_get_value($device, "$PandoraFMS::Recon::Base::IFNAME.$if_index"); $if_name = "if$if_index" unless defined ($if_name); $if_name =~ s/"//g; + $if_name = clean_blank($if_name); # Check whether the module already exists. - my $module_id = get_agent_module_id($self->{'dbh'}, "${if_name}_ifOperStatus", $agent_id); + my $module_id = get_agent_module_id($self->{'dbh'}, $if_name.'_ifOperStatus', $agent_id); + next if ($module_id > 0 && !$agent_learning); # Encode problematic characters. - $if_name = safe_input($if_name); $if_desc = safe_input($if_desc); # Interface status module. - $module_id = get_agent_module_id($self->{'dbh'}, "${if_name}_ifOperStatus", $agent_id); + $module_id = get_agent_module_id($self->{'dbh'}, $if_name.'_ifOperStatus', $agent_id); if ($module_id <= 0) { my %module = ('id_tipo_modulo' => 18, 'id_modulo' => 2, - 'nombre' => "${if_name}_ifOperStatus", + 'nombre' => safe_input($if_name)."_ifOperStatus", 'descripcion' => $if_desc, 'id_agente' => $agent_id, 'ip_target' => $device, @@ -781,11 +785,11 @@ sub PandoraFMS::Recon::Base::create_agent($$) { # Incoming traffic module. my $if_hc_in_octets = $self->snmp_get_value($device, "$PandoraFMS::Recon::Base::IFHCINOCTECTS.$if_index"); if (defined($if_hc_in_octets)) { - $module_id = get_agent_module_id($self->{'dbh'}, "${if_name}_ifHCInOctets", $agent_id); + $module_id = get_agent_module_id($self->{'dbh'}, $if_name.'_ifHCInOctets', $agent_id); if ($module_id <= 0) { my %module = ('id_tipo_modulo' => 16, 'id_modulo' => 2, - 'nombre' => "${if_name}_ifHCInOctets", + 'nombre' => safe_input($if_name)."_ifHCInOctets", 'descripcion' => 'The total number of octets received on the interface, including framing characters. This object is a 64-bit version of ifInOctets.', 'id_agente' => $agent_id, 'ip_target' => $device, @@ -816,11 +820,11 @@ sub PandoraFMS::Recon::Base::create_agent($$) { } # ifInOctets elsif (defined($self->snmp_get_value($device, "$PandoraFMS::Recon::Base::IFINOCTECTS.$if_index"))) { - $module_id = get_agent_module_id($self->{'dbh'}, "${if_name}_ifInOctets", $agent_id); + $module_id = get_agent_module_id($self->{'dbh'}, $if_name.'_ifInOctets', $agent_id); if ($module_id <= 0) { my %module = ('id_tipo_modulo' => 16, 'id_modulo' => 2, - 'nombre' => "${if_name}_ifInOctets", + 'nombre' => safe_input($if_name)."_ifInOctets", 'descripcion' => 'The total number of octets received on the interface, including framing characters.', 'id_agente' => $agent_id, 'ip_target' => $device, @@ -853,11 +857,11 @@ sub PandoraFMS::Recon::Base::create_agent($$) { # Outgoing traffic module. my $if_hc_out_octets = $self->snmp_get_value($device, "$PandoraFMS::Recon::Base::IFHCOUTOCTECTS.$if_index"); if (defined($if_hc_out_octets)) { - $module_id = get_agent_module_id($self->{'dbh'}, "${if_name}_ifHCOutOctets", $agent_id); + $module_id = get_agent_module_id($self->{'dbh'}, $if_name.'_ifHCOutOctets', $agent_id); if ($module_id <= 0) { my %module = ('id_tipo_modulo' => 16, 'id_modulo' => 2, - 'nombre' => "${if_name}_ifHCOutOctets", + 'nombre' => safe_input($if_name)."_ifHCOutOctets", 'descripcion' => 'The total number of octets received on the interface, including framing characters. This object is a 64-bit version of ifOutOctets.', 'id_agente' => $agent_id, 'ip_target' => $device, @@ -893,7 +897,7 @@ sub PandoraFMS::Recon::Base::create_agent($$) { if ($module_id <= 0) { my %module = ('id_tipo_modulo' => 16, 'id_modulo' => 2, - 'nombre' => "${if_name}_ifOutOctets", + 'nombre' => safe_input($if_name)."_ifOutOctets", 'descripcion' => 'The total number of octets received on the interface, including framing characters.', 'id_agente' => $agent_id, 'ip_target' => $device, diff --git a/pandora_server/lib/PandoraFMS/PluginTools.pm b/pandora_server/lib/PandoraFMS/PluginTools.pm index 54c0d106b9..a3806c7e60 100644 --- a/pandora_server/lib/PandoraFMS/PluginTools.pm +++ b/pandora_server/lib/PandoraFMS/PluginTools.pm @@ -31,8 +31,8 @@ use base 'Exporter'; our @ISA = qw(Exporter); # version: Defines actual version of Pandora Server for this module only -my $pandora_version = "7.0NG.734"; -my $pandora_build = "190516"; +my $pandora_version = "7.0NG.735"; +my $pandora_build = "190527"; our $VERSION = $pandora_version." ".$pandora_build; our %EXPORT_TAGS = ( 'all' => [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 35cf6f7d63..a75f57b68e 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -2,8 +2,8 @@ # Pandora FMS Server # %define name pandorafms_server -%define version 7.0NG.734 -%define release 190516 +%define version 7.0NG.735 +%define release 190527 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index adbaeb24d8..9b4eea12e0 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -2,8 +2,8 @@ # Pandora FMS Server # %define name pandorafms_server -%define version 7.0NG.734 -%define release 190516 +%define version 7.0NG.735 +%define release 190527 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 25a08d9b2f..f04c4c0b18 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -8,8 +8,8 @@ # This code is licensed under GPL 2.0 license. # ********************************************************************** -PI_VERSION="7.0NG.734" -PI_BUILD="190516" +PI_VERSION="7.0NG.735" +PI_BUILD="190527" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 92c0efc2d1..368d559c82 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.734 PS190516"; +my $version = "7.0NG.735 PS190527"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 0dee64af0d..a574d3fa54 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.734 PS190516"; +my $version = "7.0NG.735 PS190527"; # save program name for logging my $progname = basename($0); diff --git a/visual_console_client/src/Item.ts b/visual_console_client/src/Item.ts index 2b635627c0..7ad0f779d6 100644 --- a/visual_console_client/src/Item.ts +++ b/visual_console_client/src/Item.ts @@ -67,7 +67,7 @@ export interface ItemRemoveEvent { * @param labelPosition Raw value. */ const parseLabelPosition = ( - labelPosition: any // eslint-disable-line @typescript-eslint/no-explicit-any + labelPosition: unknown ): ItemProps["labelPosition"] => { switch (labelPosition) { case "up": diff --git a/visual_console_client/src/index.ts b/visual_console_client/src/index.ts index a7e8656d8d..8a414471a0 100644 --- a/visual_console_client/src/index.ts +++ b/visual_console_client/src/index.ts @@ -7,8 +7,12 @@ import "./main.css"; // CSS import. import VisualConsole from "./VisualConsole"; +import AsyncTaskManager from "./lib/AsyncTaskManager"; // Export the VisualConsole class to the global object. - // eslint-disable-next-line (window as any).VisualConsole = VisualConsole; + +// Export the AsyncTaskManager class to the global object. +// eslint-disable-next-line +(window as any).AsyncTaskManager = AsyncTaskManager; diff --git a/visual_console_client/src/items/Clock/index.ts b/visual_console_client/src/items/Clock/index.ts index 284871f827..52e0e65775 100644 --- a/visual_console_client/src/items/Clock/index.ts +++ b/visual_console_client/src/items/Clock/index.ts @@ -27,9 +27,7 @@ export type ClockProps = { * Extract a valid enum value from a raw unknown value. * @param clockType Raw value. */ -const parseClockType = ( - clockType: any // eslint-disable-line @typescript-eslint/no-explicit-any -): ClockProps["clockType"] => { +const parseClockType = (clockType: unknown): ClockProps["clockType"] => { switch (clockType) { case "analogic": case "digital": @@ -43,12 +41,9 @@ const parseClockType = ( * Extract a valid enum value from a raw unknown value. * @param clockFormat Raw value. */ -const parseClockFormat = ( - clockFormat: any // eslint-disable-line @typescript-eslint/no-explicit-any -): ClockProps["clockFormat"] => { +const parseClockFormat = (clockFormat: unknown): ClockProps["clockFormat"] => { switch (clockFormat) { case "datetime": - case "date": case "time": return clockFormat; default: diff --git a/visual_console_client/src/items/Percentile.ts b/visual_console_client/src/items/Percentile.ts index 78b8da2a03..4c93b86b1f 100644 --- a/visual_console_client/src/items/Percentile.ts +++ b/visual_console_client/src/items/Percentile.ts @@ -36,8 +36,9 @@ export type PercentileProps = { * Extract a valid enum value from a raw type value. * @param type Raw value. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function extractPercentileType(type: any): PercentileProps["percentileType"] { +function extractPercentileType( + type: unknown +): PercentileProps["percentileType"] { switch (type) { case "progress-bar": case "bubble": @@ -60,8 +61,7 @@ function extractPercentileType(type: any): PercentileProps["percentileType"] { * Extract a valid enum value from a raw value type value. * @param type Raw value. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function extractValueType(valueType: any): PercentileProps["valueType"] { +function extractValueType(valueType: unknown): PercentileProps["valueType"] { switch (valueType) { case "percent": case "value": diff --git a/visual_console_client/src/items/SimpleValue.ts b/visual_console_client/src/items/SimpleValue.ts index 8464881a61..7cc5e139af 100644 --- a/visual_console_client/src/items/SimpleValue.ts +++ b/visual_console_client/src/items/SimpleValue.ts @@ -31,9 +31,7 @@ export type SimpleValueProps = { * Extract a valid enum value from a raw value type. * @param valueType Raw value. */ -const parseValueType = ( - valueType: any // eslint-disable-line @typescript-eslint/no-explicit-any -): SimpleValueProps["valueType"] => { +const parseValueType = (valueType: unknown): SimpleValueProps["valueType"] => { switch (valueType) { case "string": case "image": @@ -48,7 +46,7 @@ const parseValueType = ( * @param processValue Raw value. */ const parseProcessValue = ( - processValue: any // eslint-disable-line @typescript-eslint/no-explicit-any + processValue: unknown ): SimpleValueProps["processValue"] => { switch (processValue) { case "none": diff --git a/visual_console_client/src/items/StaticGraph.ts b/visual_console_client/src/items/StaticGraph.ts index 0e713dc5f3..899d54ec70 100644 --- a/visual_console_client/src/items/StaticGraph.ts +++ b/visual_console_client/src/items/StaticGraph.ts @@ -25,7 +25,7 @@ export type StaticGraphProps = { * @param showLastValueTooltip Raw value. */ const parseShowLastValueTooltip = ( - showLastValueTooltip: any // eslint-disable-line @typescript-eslint/no-explicit-any + showLastValueTooltip: unknown ): StaticGraphProps["showLastValueTooltip"] => { switch (showLastValueTooltip) { case "default": diff --git a/visual_console_client/src/lib/AsyncTaskManager.ts b/visual_console_client/src/lib/AsyncTaskManager.ts new file mode 100644 index 0000000000..5ad261194b --- /dev/null +++ b/visual_console_client/src/lib/AsyncTaskManager.ts @@ -0,0 +1,172 @@ +import TypedEvent, { Disposable, Listener } from "../TypedEvent"; + +interface Cancellable { + cancel(): void; +} + +type AsyncTaskStatus = "waiting" | "started" | "cancelled" | "finished"; +type AsyncTaskInitiator = (done: () => void) => Cancellable; + +/** + * Defines an async task which can be started and cancelled. + * It's possible to observe the status changes of the task. + */ +class AsyncTask { + private readonly taskInitiator: AsyncTaskInitiator; + private cancellable: Cancellable = { cancel: () => {} }; + private _status: AsyncTaskStatus = "waiting"; + + // Event manager for status change events. + private readonly statusChangeEventManager = new TypedEvent(); + // List of references to clean the event listeners. + private readonly disposables: Disposable[] = []; + + public constructor(taskInitiator: AsyncTaskInitiator) { + this.taskInitiator = taskInitiator; + } + + /** + * Public setter of the `status` property. + * @param status. + */ + public set status(status: AsyncTaskStatus) { + this._status = status; + this.statusChangeEventManager.emit(status); + } + + /** + * Public accessor of the `status` property. + * @return status. + */ + public get status() { + return this._status; + } + + /** + * Start the async task. + */ + public init(): void { + this.cancellable = this.taskInitiator(() => { + this.status = "finished"; + }); + this.status = "started"; + } + + /** + * Cancel the async task. + */ + public cancel(): void { + this.cancellable.cancel(); + this.status = "cancelled"; + } + + /** + * Add an event handler to the status change. + * @param listener Function which is going to be executed when the status changes. + */ + public onStatusChange(listener: Listener): Disposable { + /* + * The '.on' function returns a function which will clean the event + * listener when executed. We store all the 'dispose' functions to + * call them when the item should be cleared. + */ + const disposable = this.statusChangeEventManager.on(listener); + this.disposables.push(disposable); + + return disposable; + } +} + +/** + * Wrap an async task into another which will execute that task indefinitely + * every time the tash finnish and the chosen period ends. + * Will last until cancellation. + * + * @param task Async task to execute. + * @param period Time in milliseconds to wait until the next async esecution. + * + * @return A new async task. + */ +function asyncPeriodic(task: AsyncTask, period: number): AsyncTask { + return new AsyncTask(() => { + let ref: number | null = null; + + task.onStatusChange(status => { + if (status === "finished") { + ref = window.setTimeout(() => { + task.init(); + }, period); + } + }); + + task.init(); + + return { + cancel: () => { + if (ref) clearTimeout(ref); + task.cancel(); + } + }; + }); +} + +/** + * Manages a list of async tasks. + */ +export default class AsyncTaskManager { + private tasks: { [identifier: string]: AsyncTask } = {}; + + /** + * Adds an async task to the manager. + * + * @param identifier Unique identifier. + * @param taskInitiator Function to initialize the async task. + * Should return a structure to cancel the task. + * @param period Optional period to repeat the task indefinitely. + */ + public add( + identifier: string, + taskInitiator: AsyncTaskInitiator, + period: number = 0 + ): AsyncTask { + if (this.tasks[identifier] && this.tasks[identifier].status === "started") { + this.tasks[identifier].cancel(); + } + + const asyncTask = + period > 0 + ? asyncPeriodic(new AsyncTask(taskInitiator), period) + : new AsyncTask(taskInitiator); + + this.tasks[identifier] = asyncTask; + + return this.tasks[identifier]; + } + + /** + * Starts an async task. + * + * @param identifier Unique identifier. + */ + public init(identifier: string) { + if ( + this.tasks[identifier] && + (this.tasks[identifier].status === "waiting" || + this.tasks[identifier].status === "cancelled" || + this.tasks[identifier].status === "finished") + ) { + this.tasks[identifier].init(); + } + } + + /** + * Cancel a running async task. + * + * @param identifier Unique identifier. + */ + public cancel(identifier: string) { + if (this.tasks[identifier] && this.tasks[identifier].status === "started") { + this.tasks[identifier].cancel(); + } + } +} diff --git a/visual_console_client/src/lib.ts b/visual_console_client/src/lib/index.ts similarity index 94% rename from visual_console_client/src/lib.ts rename to visual_console_client/src/lib/index.ts index 57b4f1c221..1a04ca74af 100644 --- a/visual_console_client/src/lib.ts +++ b/visual_console_client/src/lib/index.ts @@ -6,7 +6,7 @@ import { WithModuleProps, LinkedVisualConsoleProps, LinkedVisualConsolePropsStatus -} from "./types"; +} from "../types"; /** * Return a number or a default value from a raw value. @@ -14,8 +14,7 @@ import { * @param defaultValue Default value to use if we cannot extract a valid number. * @return A valid number or the default value. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function parseIntOr(value: any, defaultValue: T): number | T { +export function parseIntOr(value: unknown, defaultValue: T): number | T { if (typeof value === "number") return value; if (typeof value === "string" && value.length > 0 && !isNaN(parseInt(value))) return parseInt(value); @@ -28,8 +27,7 @@ export function parseIntOr(value: any, defaultValue: T): number | T { * @param defaultValue Default value to use if we cannot extract a valid number. * @return A valid number or the default value. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function parseFloatOr(value: any, defaultValue: T): number | T { +export function parseFloatOr(value: unknown, defaultValue: T): number | T { if (typeof value === "number") return value; if ( typeof value === "string" && @@ -55,8 +53,10 @@ export function stringIsEmpty(value?: string | null): boolean { * @param defaultValue Default value to use if we cannot extract a non empty string. * @return A non empty string or the default value. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function notEmptyStringOr(value: any, defaultValue: T): string | T { +export function notEmptyStringOr( + value: unknown, + defaultValue: T +): string | T { return typeof value === "string" && value.length > 0 ? value : defaultValue; } @@ -65,8 +65,7 @@ export function notEmptyStringOr(value: any, defaultValue: T): string | T { * @param value Raw value from which we will try to extract the boolean. * @return A valid boolean value. false by default. */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export function parseBoolean(value: any): boolean { +export function parseBoolean(value: unknown): boolean { if (typeof value === "boolean") return value; else if (typeof value === "number") return value > 0; else if (typeof value === "string") return value === "1" || value === "true"; diff --git a/visual_console_client/src/lib.spec.ts b/visual_console_client/src/lib/spec.ts similarity index 99% rename from visual_console_client/src/lib.spec.ts rename to visual_console_client/src/lib/spec.ts index 3330773be7..ca86e2f499 100644 --- a/visual_console_client/src/lib.spec.ts +++ b/visual_console_client/src/lib/spec.ts @@ -8,7 +8,7 @@ import { humanDate, humanTime, replaceMacros -} from "./lib"; +} from "."; describe("function parseIntOr", () => { it("should retrieve valid int or a default value", () => {