'.$table_adv_parent.$table_adv_module_mode.$table_adv_cascade;
if ($new_agent) {
@@ -788,7 +788,7 @@ if ($new_agent) {
$table_adv_options .= '
+
'.$table_adv_gis.$table_adv_agent_icon.$table_adv_url.$table_adv_quiet.$table_adv_status.$table_adv_remote.$table_adv_safe.'
';
diff --git a/pandora_console/godmode/agentes/agent_wizard.snmp_interfaces_explorer.php b/pandora_console/godmode/agentes/agent_wizard.snmp_interfaces_explorer.php
index b08dc62c4f..2dca9353ac 100644
--- a/pandora_console/godmode/agentes/agent_wizard.snmp_interfaces_explorer.php
+++ b/pandora_console/godmode/agentes/agent_wizard.snmp_interfaces_explorer.php
@@ -23,7 +23,6 @@ $idAgent = (int) get_parameter('id_agente', 0);
$ipAgent = db_get_value('direccion', 'tagente', 'id_agente', $idAgent);
check_login();
-
$ip_target = (string) get_parameter('ip_target', $ipAgent);
$use_agent = get_parameter('use_agent');
$snmp_community = (string) get_parameter('snmp_community', 'public');
@@ -469,6 +468,9 @@ if (enterprise_installed()) {
if ($row['server_type'] != 13) {
$s_type = ' (Standard)';
} else {
+ // Check if satellite server has remote configuration enabled
+ $satellite_remote = config_agents_has_remote_configuration($id_agent);
+ $id_satellite = $row['id_server'];
$s_type = ' (Satellite)';
}
@@ -477,7 +479,17 @@ if (enterprise_installed()) {
}
$table->data[1][2] = '
'.__('Server to execute command').' ';
-$table->data[1][3] = html_print_select($servers_to_exec, 'server_to_exec', $server_to_exec, '', '', '', true);
+$table->data[1][2] .= '
'.ui_print_help_tip(__('In order to use remote executions you need to enable remote execution in satellite server'), true, 'images/tip_help.png', false, 'display:').' ';
+$table->data[1][4] = html_print_select(
+ $servers_to_exec,
+ 'server_to_exec',
+ $server_to_exec,
+ 'satellite_remote_warn('.$id_satellite.','.$satellite_remote.')
+',
+ '',
+ '',
+ true
+);
$snmp_versions['1'] = 'v. 1';
$snmp_versions['2'] = 'v. 2';
@@ -607,8 +619,12 @@ ui_require_jquery_file('bgiframe');
/* */
diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php
index 22410b0e23..d5f6f1fcfd 100644
--- a/pandora_console/godmode/agentes/configurar_agente.php
+++ b/pandora_console/godmode/agentes/configurar_agente.php
@@ -1213,7 +1213,7 @@ if ($update_module || $create_module) {
$max_timeout = (int) get_parameter('max_timeout');
$max_retries = (int) get_parameter('max_retries');
- $min = (int) get_parameter_post('min');
+ $min = (int) get_parameter('min');
$max = (int) get_parameter('max');
$interval = (int) get_parameter('module_interval', $intervalo);
$ff_interval = (int) get_parameter('module_ff_interval');
diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php
index 9e7ce18c4e..ba5ac4f2be 100644
--- a/pandora_console/godmode/agentes/modificar_agente.php
+++ b/pandora_console/godmode/agentes/modificar_agente.php
@@ -163,7 +163,7 @@ echo '
';
echo __('Group').' ';
$own_info = get_user_info($config['id_user']);
-if (!$own_info['is_admin'] && check_acl($config['id_user'], 0, 'AW')) {
+if (!$own_info['is_admin'] && !check_acl($config['id_user'], 0, 'AR') && !check_acl($config['id_user'], 0, 'AW')) {
$return_all_group = false;
} else {
$return_all_group = true;
@@ -680,7 +680,7 @@ if ($agents !== false) {
}
echo '';
- ui_pagination($total_agents, "index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&group_id=$ag_group&search=$search&sort_field=$sortField&sort=$sort&disabled=$disabled&os=$os", $offset, 0, false, 'offset', true, 'pagination-bottom');
+ ui_pagination($total_agents, "index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&group_id=$ag_group&recursion=$recursion&search=$search&sort_field=$sortField&sort=$sort&disabled=$disabled&os=$os", $offset);
echo "";
} else {
ui_print_info_message(['no_close' => true, 'message' => __('There are no defined agents') ]);
diff --git a/pandora_console/godmode/agentes/module_manager_editor.php b/pandora_console/godmode/agentes/module_manager_editor.php
index b340761265..13c313892a 100644
--- a/pandora_console/godmode/agentes/module_manager_editor.php
+++ b/pandora_console/godmode/agentes/module_manager_editor.php
@@ -267,10 +267,10 @@ if ($id_agent_module) {
$cron_interval = explode(' ', $module['cron_interval']);
if (isset($cron_interval[4])) {
$minute_from = $cron_interval[0];
- $min = explode('-', $minute_from);
- $minute_from = $min[0];
- if (isset($min[1])) {
- $minute_to = $min[1];
+ $minute = explode('-', $minute_from);
+ $minute_from = $minute[0];
+ if (isset($minute[1])) {
+ $minute_to = $minute[1];
}
$hour_from = $cron_interval[1];
diff --git a/pandora_console/godmode/agentes/module_manager_editor_network.php b/pandora_console/godmode/agentes/module_manager_editor_network.php
index 306e5f9804..c0a6181a8e 100644
--- a/pandora_console/godmode/agentes/module_manager_editor_network.php
+++ b/pandora_console/godmode/agentes/module_manager_editor_network.php
@@ -506,45 +506,5 @@ $(document).ready (function () {
});
});
-// Show the SNMP browser window
-function snmpBrowserWindow () {
-
- // Keep elements in the form and the SNMP browser synced
- $('#text-target_ip').val($('#text-ip_target').val());
- $('#text-community').val($('#text-snmp_community').val());
- $('#snmp_browser_version').val($('#snmp_version').val());
- $('#text-snmp3_browser_auth_user').val($('#text-snmp3_auth_user').val());
- $('#snmp3_browser_security_level').val($('#snmp3_security_level').val());
- $('#snmp3_browser_auth_method').val($('#snmp3_auth_method').val());
- $('#password-snmp3_browser_auth_pass').val($('#password-snmp3_auth_pass').val());
- $('#snmp3_browser_privacy_method').val($('#snmp3_privacy_method').val());
- $('#password-snmp3_browser_privacy_pass').val($('#password-snmp3_privacy_pass').val());
-
- $("#snmp_browser_container").show().dialog ({
- title: '',
- resizable: true,
- draggable: true,
- modal: true,
- overlay: {
- opacity: 0.5,
- background: "black"
- },
- width: 920,
- height: 500
- });
-}
-
-// Set the form OID to the value selected in the SNMP browser
-function setOID () {
-
- if($('#snmp_browser_version').val() == '3'){
- $('#text-snmp_oid').val($('#table1-0-1').text());
- } else {
- $('#text-snmp_oid').val($('#snmp_selected_oid').text());
- }
-
- // Close the SNMP browser
- $('.ui-dialog-titlebar-close').trigger('click');
-}
diff --git a/pandora_console/godmode/agentes/planned_downtime.list.php b/pandora_console/godmode/agentes/planned_downtime.list.php
index 961ea1f7d0..49a72f125d 100755
--- a/pandora_console/godmode/agentes/planned_downtime.list.php
+++ b/pandora_console/godmode/agentes/planned_downtime.list.php
@@ -52,7 +52,7 @@ if ($migrate_malformed) {
// Header.
ui_print_page_header(
- __('Planned Downtime'),
+ __('Scheduled Downtime'),
'images/gm_monitoring.png',
false,
'planned_downtime',
@@ -136,9 +136,6 @@ $table_form = new StdClass();
$table_form->class = 'databox filters';
$table_form->width = '100%';
$table_form->rowstyle = [];
-$table_form->rowstyle[0] = 'background-color: #f9faf9;';
-$table_form->rowstyle[1] = 'background-color: #f9faf9;';
-$table_form->rowstyle[2] = 'background-color: #f9faf9;';
$table_form->data = [];
$row = [];
diff --git a/pandora_console/godmode/events/custom_events.php b/pandora_console/godmode/events/custom_events.php
index bfb0e8c64d..fb4b6f9ab1 100644
--- a/pandora_console/godmode/events/custom_events.php
+++ b/pandora_console/godmode/events/custom_events.php
@@ -113,6 +113,8 @@ $fields_available['instructions'] = __('Instructions');
$fields_available['server_name'] = __('Server Name');
$fields_available['data'] = __('Data');
$fields_available['module_status'] = __('Module Status');
+$fields_available['mini_severity'] = __('Severity mini');
+
// Remove fields already selected.
foreach ($fields_available as $key => $available) {
@@ -124,7 +126,7 @@ foreach ($fields_available as $key => $available) {
$table->data[0][0] = ''.__('Fields available').' ';
$table->data[1][0] = html_print_select($fields_available, 'fields_available[]', true, '', '', 0, true, true, false, '', false, 'width: 300px');
$table->data[1][1] = ''.html_print_image(
- 'images/darrowright.png',
+ 'images/darrowright_green.png',
true,
[
'id' => 'right',
@@ -132,7 +134,7 @@ $table->data[1][1] = ' '.html_print_image(
]
).' ';
$table->data[1][1] .= ''.html_print_image(
- 'images/darrowleft.png',
+ 'images/darrowleft_green.png',
true,
[
'id' => 'left',
diff --git a/pandora_console/godmode/events/events.php b/pandora_console/godmode/events/events.php
index c937ad281c..72ae001fe1 100644
--- a/pandora_console/godmode/events/events.php
+++ b/pandora_console/godmode/events/events.php
@@ -50,17 +50,10 @@ if (check_acl($config['id_user'], 0, 'PM')) {
'text' => ' '.html_print_image('images/event_responses.png', true, ['title' => __('Event responses')]).' ',
];
- if (!is_metaconsole()) {
- $buttons['fields'] = [
- 'active' => false,
- 'text' => ''.html_print_image('images/custom_columns.png', true, ['title' => __('Custom fields')]).' ',
- ];
- } else {
- $buttons['fields'] = [
- 'active' => false,
- 'text' => ''.html_print_image('images/custom_columns.png', true, ['title' => __('Custom fields')]).' ',
- ];
- }
+ $buttons['fields'] = [
+ 'active' => false,
+ 'text' => ''.html_print_image('images/custom_columns.png', true, ['title' => __('Custom fields')]).' ',
+ ];
}
switch ($section) {
diff --git a/pandora_console/godmode/groups/credential_store.php b/pandora_console/godmode/groups/credential_store.php
new file mode 100644
index 0000000000..9a822dc986
--- /dev/null
+++ b/pandora_console/godmode/groups/credential_store.php
@@ -0,0 +1,632 @@
+ 'noaccess'];
+ }
+
+ include 'general/noaccess.php';
+ return;
+}
+
+// Required files.
+ui_require_css_file('credential_store');
+require_once $config['homedir'].'/include/functions_credential_store.php';
+require_once $config['homedir'].'/include/functions_io.php';
+
+if (is_ajax()) {
+ $draw = get_parameter('draw', 0);
+ $filter = get_parameter('filter', []);
+ $get_key = get_parameter('get_key', 0);
+ $new_form = get_parameter('new_form', 0);
+ $new_key = get_parameter('new_key', 0);
+ $update_key = get_parameter('update_key', 0);
+ $delete_key = get_parameter('delete_key', 0);
+
+ if ($new_form) {
+ echo print_inputs();
+ exit;
+ }
+
+ if ($delete_key) {
+ $identifier = get_parameter('identifier', null);
+
+ if (empty($identifier)) {
+ ajax_msg('error', __('identifier cannot be empty'));
+ }
+
+ if (db_process_sql_delete(
+ 'tcredential_store',
+ ['identifier' => $identifier]
+ ) === false
+ ) {
+ ajax_msg('error', $config['dbconnection']->error, true);
+ } else {
+ ajax_msg('result', $identifier, true);
+ }
+ }
+
+ if ($update_key) {
+ $data = get_parameter('values', null);
+
+ if ($data === null || !is_array($data)) {
+ echo json_encode(['error' => __('Invalid parameters, please retry')]);
+ exit;
+ }
+
+ $values = [];
+ foreach ($data as $key => $value) {
+ if ($key == 'identifier') {
+ $identifier = base64_decode($value);
+ } else if ($key == 'product') {
+ $product = base64_decode($value);
+ } else {
+ $values[$key] = base64_decode($value);
+ }
+ }
+
+ if (empty($identifier)) {
+ ajax_msg('error', __('identifier cannot be empty'));
+ }
+
+ if (empty($product)) {
+ ajax_msg('error', __('product cannot be empty'));
+ }
+
+ if (db_process_sql_update(
+ 'tcredential_store',
+ $values,
+ ['identifier' => $identifier]
+ ) === false
+ ) {
+ ajax_msg('error', $config['dbconnection']->error);
+ } else {
+ ajax_msg('result', $identifier);
+ }
+
+ exit;
+ }
+
+ if ($new_key) {
+ $data = get_parameter('values', null);
+
+ if ($data === null || !is_array($data)) {
+ echo json_encode(['error' => __('Invalid parameters, please retry')]);
+ exit;
+ }
+
+ $values = [];
+ foreach ($data as $key => $value) {
+ $values[$key] = base64_decode($value);
+ if ($key == 'identifier') {
+ $values[$key] = preg_replace('/\s+/', '-', trim($values[$key]));
+ }
+ }
+
+ $identifier = $values['identifier'];
+
+ if (empty($identifier)) {
+ ajax_msg('error', __('identifier cannot be empty'));
+ }
+
+ if (empty($values['product'])) {
+ ajax_msg('error', __('product cannot be empty'));
+ }
+
+ if (db_process_sql_insert('tcredential_store', $values) === false) {
+ ajax_msg('error', $config['dbconnection']->error);
+ } else {
+ ajax_msg('result', $identifier);
+ }
+
+ exit;
+ }
+
+ if ($get_key) {
+ $identifier = get_parameter('identifier', null);
+
+ $key = get_key($identifier);
+ echo print_inputs($key);
+
+ exit;
+ }
+
+ if ($draw) {
+ // Datatables offset, limit and order.
+ $start = get_parameter('start', 0);
+ $length = get_parameter('length', $config['block_size']);
+ $order = get_datatable_order(true);
+ try {
+ ob_start();
+
+ $fields = [
+ 'cs.*',
+ 'tg.nombre as `group`',
+ ];
+
+ // Retrieve data.
+ $data = credentials_get_all(
+ // Fields.
+ $fields,
+ // Filter.
+ $filter,
+ // Offset.
+ $start,
+ // Limit.
+ $length,
+ // Order.
+ $order['direction'],
+ // Sort field.
+ $order['field']
+ );
+
+ // Retrieve counter.
+ $count = credentials_get_all(
+ 'count',
+ $filter
+ );
+
+ if ($data) {
+ $data = array_reduce(
+ $data,
+ function ($carry, $item) {
+ // Transforms array of arrays $data into an array
+ // of objects, making a post-process of certain fields.
+ $tmp = (object) $item;
+ $tmp->username = io_safe_output($tmp->username);
+
+ if (empty($tmp->group)) {
+ $tmp->group = __('All');
+ } else {
+ $tmp->group = io_safe_output($tmp->group);
+ }
+
+ $carry[] = $tmp;
+ return $carry;
+ }
+ );
+ }
+
+ // Datatables format: RecordsTotal && recordsfiltered.
+ echo json_encode(
+ [
+ 'data' => $data,
+ 'recordsTotal' => $count,
+ 'recordsFiltered' => $count,
+ ]
+ );
+ // Capture output.
+ $response = ob_get_clean();
+ } catch (Exception $e) {
+ return json_encode(['error' => $e->getMessage()]);
+ }
+
+ // If not valid, show error with issue.
+ json_decode($response);
+ if (json_last_error() == JSON_ERROR_NONE) {
+ // If valid dump.
+ echo $response;
+ } else {
+ echo json_encode(
+ ['error' => $response]
+ );
+ }
+
+
+ exit;
+ }
+
+ exit;
+}
+
+// Datatables list.
+try {
+ $columns = [
+ 'group',
+ 'identifier',
+ 'product',
+ 'username',
+ 'options',
+ ];
+
+ $column_names = [
+ __('Group'),
+ __('Identifier'),
+ __('Product'),
+ __('User'),
+ [
+ 'text' => __('Options'),
+ 'class' => 'action_buttons',
+ ],
+ ];
+
+ $table_id = 'keystore';
+ // Load datatables user interface.
+ ui_print_datatable(
+ [
+ 'id' => $table_id,
+ 'class' => 'info_table',
+ 'style' => 'width: 100%',
+ 'columns' => $columns,
+ 'column_names' => $column_names,
+ 'ajax_url' => 'godmode/groups/credential_store',
+ 'ajax_postprocess' => 'process_datatables_item(item)',
+ 'no_sortable_columns' => [-1],
+ 'order' => [
+ 'field' => 'identifier',
+ 'direction' => 'asc',
+ ],
+ 'search_button_class' => 'sub filter float-right',
+ 'form' => [
+ 'inputs' => [
+ [
+ 'label' => __('Group'),
+ 'type' => 'select',
+ 'id' => 'filter_id_group',
+ 'name' => 'filter_id_group',
+ 'options' => users_get_groups_for_select(
+ $config['id_user'],
+ 'AR',
+ true,
+ true,
+ false
+ ),
+ ],
+ [
+ 'label' => __('Free search'),
+ 'type' => 'text',
+ 'class' => 'mw250px',
+ 'id' => 'free_search',
+ 'name' => 'free_search',
+ ],
+ ],
+ ],
+ ]
+ );
+} catch (Exception $e) {
+ echo $e->getMessage();
+}
+
+// Auxiliar div.
+$new = '
';
+$details = '
';
+$aux = '
';
+
+
+echo $new.$details.$aux;
+
+// Create button.
+echo '';
+html_print_submit_button(
+ __('Add key'),
+ 'create',
+ false,
+ 'class="sub next"'
+);
+echo '
';
+
+?>
+
+
diff --git a/pandora_console/godmode/groups/group_list.php b/pandora_console/godmode/groups/group_list.php
index ee61cdaf79..8cb3c106c1 100644
--- a/pandora_console/godmode/groups/group_list.php
+++ b/pandora_console/godmode/groups/group_list.php
@@ -1,20 +1,36 @@
$v) {
$agents[$keys_prefix.$k] = $v;
unset($agents[$k]);
if ($all_agents) {
- // Unserialize to get the status
+ // Unserialize to get the status.
if ($serialized && is_metaconsole()) {
$agent_info = explode($serialized_separator, $k);
$agent_disabled = db_get_value_filter(
@@ -174,7 +193,8 @@ if (is_ajax()) {
['id_agente' => $agent_info[1]]
);
} else if (!$serialized && is_metaconsole()) {
- // Cannot retrieve the disabled status. Mark all as not disabled
+ // Cannot retrieve the disabled status.
+ // Mark all as not disabled.
$agent_disabled = 0;
} else {
$agent_disabled = db_get_value_filter(
@@ -226,11 +246,13 @@ if (! check_acl($config['id_user'], 0, 'PM')) {
}
$sec = defined('METACONSOLE') ? 'advanced' : 'gagente';
-$url_tree = "index.php?sec=$sec&sec2=godmode/groups/group_list&tab=tree";
-$url_groups = "index.php?sec=$sec&sec2=godmode/groups/group_list&tab=groups";
+$url_credbox = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=credbox';
+$url_tree = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=tree';
+$url_groups = 'index.php?sec='.$sec.'&sec2=godmode/groups/group_list&tab=groups';
+
$buttons['tree'] = [
'active' => false,
- 'text' => "".html_print_image(
+ 'text' => ' '.html_print_image(
'images/gm_massive_operations.png',
true,
[
@@ -241,7 +263,7 @@ $buttons['tree'] = [
$buttons['groups'] = [
'active' => false,
- 'text' => " ".html_print_image(
+ 'text' => ' '.html_print_image(
'images/group.png',
true,
[
@@ -250,21 +272,38 @@ $buttons['groups'] = [
).' ',
];
+$buttons['credbox'] = [
+ 'active' => false,
+ 'text' => ''.html_print_image(
+ 'images/key.png',
+ true,
+ [
+ 'title' => __('Credential Store'),
+ ]
+ ).' ',
+];
+
$tab = (string) get_parameter('tab', 'groups');
-// Marks correct tab
+$title = __('Groups defined in %s', get_product_name());
+// Marks correct tab.
switch ($tab) {
case 'tree':
$buttons['tree']['active'] = true;
break;
+ case 'credbox':
+ $buttons['credbox']['active'] = true;
+ $title = __('Credential store');
+ break;
+
case 'groups':
default:
$buttons['groups']['active'] = true;
break;
}
-// Header
+// Header.
if (defined('METACONSOLE')) {
agents_meta_print_header();
echo '';
@@ -272,7 +311,7 @@ if (defined('METACONSOLE')) {
echo '
';
} else {
ui_print_page_header(
- __('Groups defined in %s', get_product_name()),
+ $title,
'images/group.png',
false,
'group_list_tab',
@@ -281,12 +320,19 @@ if (defined('METACONSOLE')) {
);
}
+// Load credential store view before parse list-tree forms.
+if ($tab == 'credbox') {
+ include_once __DIR__.'/credential_store.php';
+ // Stop script.
+ return;
+}
+
$create_group = (bool) get_parameter('create_group');
$update_group = (bool) get_parameter('update_group');
$delete_group = (bool) get_parameter('delete_group');
$pure = get_parameter('pure', 0);
-// Create group
+// Create group.
if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$name = (string) get_parameter('name');
$icon = (string) get_parameter('icon');
@@ -301,7 +347,7 @@ if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$check = db_get_value('nombre', 'tgrupo', 'nombre', $name);
$propagate = (bool) get_parameter('propagate');
- // Check if name field is empty
+ // Check if name field is empty.
if ($name != '') {
if (!$check) {
$values = [
@@ -328,12 +374,11 @@ if (($create_group) && (check_acl($config['id_user'], 0, 'PM'))) {
ui_print_error_message(__('Each group must have a different name'));
}
} else {
- // $result = false;
ui_print_error_message(__('Group must have a name'));
}
}
-// Update group
+// Update group.
if ($update_group) {
$id_group = (int) get_parameter('id_group');
$name = (string) get_parameter('name');
@@ -349,49 +394,35 @@ if ($update_group) {
$contact = (string) get_parameter('contact');
$other = (string) get_parameter('other');
- // Check if name field is empty
+ // Check if name field is empty.
if ($name != '') {
- switch ($config['dbtype']) {
- case 'mysql':
- $sql = sprintf(
- 'UPDATE tgrupo SET nombre = "%s",
- icon = "%s", disabled = %d, parent = %d, custom_id = "%s", propagate = %d, id_skin = %d, description = "%s", contact = "%s", other = "%s", password = "%s"
- WHERE id_grupo = %d',
- $name,
- empty($icon) ? '' : substr($icon, 0, -4),
- !$alerts_enabled,
- $id_parent,
- $custom_id,
- $propagate,
- $skin,
- $description,
- $contact,
- $other,
- $group_pass,
- $id_group
- );
- break;
-
- case 'postgresql':
- case 'oracle':
- $sql = sprintf(
- 'UPDATE tgrupo SET nombre = \'%s\',
- icon = \'%s\', disabled = %d, parent = %d, custom_id = \'%s\', propagate = %d, id_skin = %d, description = \'%s\', contact = \'%s\', other = \'%s\'
- WHERE id_grupo = %d',
- $name,
- substr($icon, 0, -4),
- !$alerts_enabled,
- $id_parent,
- $custom_id,
- $propagate,
- $skin,
- $description,
- $contact,
- $other,
- $id_group
- );
- break;
- }
+ $sql = sprintf(
+ 'UPDATE tgrupo
+ SET nombre = "%s",
+ icon = "%s",
+ disabled = %d,
+ parent = %d,
+ custom_id = "%s",
+ propagate = %d,
+ id_skin = %d,
+ description = "%s",
+ contact = "%s",
+ other = "%s",
+ password = "%s"
+ WHERE id_grupo = %d',
+ $name,
+ empty($icon) ? '' : substr($icon, 0, -4),
+ !$alerts_enabled,
+ $id_parent,
+ $custom_id,
+ $propagate,
+ $skin,
+ $description,
+ $contact,
+ $other,
+ $group_pass,
+ $id_group
+ );
$result = db_process_sql($sql);
} else {
@@ -405,7 +436,7 @@ if ($update_group) {
}
}
-// Delete group
+// Delete group.
if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
$id_group = (int) get_parameter('id_group');
@@ -445,7 +476,14 @@ if (($delete_group) && (check_acl($config['id_user'], 0, 'PM'))) {
}
}
+
+// Credential store is loaded previously in this document to avoid
+// process group tree - list forms.
if ($tab == 'tree') {
+ /*
+ * Group tree view.
+ */
+
echo html_print_image(
'images/spinner.gif',
true,
@@ -456,6 +494,10 @@ if ($tab == 'tree') {
);
echo "
";
} else {
+ /*
+ * Group list view.
+ */
+
$acl = '';
$search_name = '';
$offset = (int) get_parameter('offset', 0);
@@ -463,17 +505,22 @@ if ($tab == 'tree') {
$block_size = $config['block_size'];
if (!empty($search)) {
- $search_name = "AND t.nombre LIKE '%$search%'";
+ $search_name = 'AND t.nombre LIKE "%'.$search.'%"';
}
if (!users_can_manage_group_all('AR')) {
$user_groups_acl = users_get_groups(false, 'AR');
$groups_acl = implode(',', $user_groups_ACL);
if (empty($groups_acl)) {
- return ui_print_info_message(['no_close' => true, 'message' => __('There are no defined groups') ]);
+ return ui_print_info_message(
+ [
+ 'no_close' => true,
+ 'message' => __('There are no defined groups'),
+ ]
+ );
}
- $acl = "AND t.id_grupo IN ($groups_acl)";
+ $acl = 'AND t.id_grupo IN ('.$groups_acl.')';
}
$form = "';
+ $filter .= '
';
$filter = ui_toggle(
$filter,
__('Filter'),
@@ -3220,8 +3234,10 @@ function ui_print_datatable(array $parameters)
$.extend(data, {
filter: values,'."\n";
- foreach ($parameters['ajax_data'] as $k => $v) {
- $js .= $k.':'.json_encode($v).",\n";
+ if (is_array($parameters['ajax_data'])) {
+ foreach ($parameters['ajax_data'] as $k => $v) {
+ $js .= $k.':'.json_encode($v).",\n";
+ }
}
$js .= 'page: "'.$parameters['ajax_url'].'"
diff --git a/pandora_console/include/functions_users.php b/pandora_console/include/functions_users.php
index 3b4af210d0..d461ca9754 100755
--- a/pandora_console/include/functions_users.php
+++ b/pandora_console/include/functions_users.php
@@ -293,7 +293,7 @@ function users_get_groups(
}
// Per-group permissions.
else {
- $query = 'SELECT * FROM tgrupo ORDER BY parent,id_grupo DESC';
+ $query = 'SELECT * FROM tgrupo ORDER BY nombre';
$raw_groups = db_get_all_rows_sql($query);
$query = sprintf(
diff --git a/pandora_console/include/graphs/flot/pandora.flot.js b/pandora_console/include/graphs/flot/pandora.flot.js
index 38b7f75f1c..f7af997508 100644
--- a/pandora_console/include/graphs/flot/pandora.flot.js
+++ b/pandora_console/include/graphs/flot/pandora.flot.js
@@ -869,7 +869,7 @@ function pandoraFlotSlicebar(
var datas = new Array();
- for (i = 0; i < values.length; i++) {
+ for (var i = 0; i < values.length; i++) {
var serie = values[i].split(separator);
var aux = new Array();
@@ -1938,6 +1938,8 @@ function pandoraFlotArea(
switch (type) {
case "line":
case 2:
+ stacked = null;
+ filled_s = false;
break;
case 3:
stacked = "stack";
diff --git a/pandora_console/include/graphs/functions_flot.php b/pandora_console/include/graphs/functions_flot.php
index 4492da7834..8e32673b48 100644
--- a/pandora_console/include/graphs/functions_flot.php
+++ b/pandora_console/include/graphs/functions_flot.php
@@ -279,6 +279,12 @@ function flot_area_graph(
// Trick to get translated string from javascript.
$return .= html_print_input_hidden('unknown_text', __('Unknown'), true);
+ // To use the js document ready event or not. Default true.
+ $document_ready = true;
+ if (isset($params['document_ready']) === true) {
+ $document_ready = $params['document_ready'];
+ }
+
$values = json_encode($array_data);
$legend = json_encode($legend);
@@ -295,9 +301,28 @@ function flot_area_graph(
}
$return .= "';
// Parent layer.
@@ -428,11 +453,9 @@ function flot_pie_chart(
include_javascript_dependencies_flot_graph();
$return .= "';
return $return;
@@ -508,11 +531,9 @@ function flot_custom_pie_chart(
$colors = implode($separator, $temp_colors);
$return .= "';
return $return;
@@ -608,10 +629,8 @@ function flot_hcolumn_chart($graph_data, $width, $height, $water_mark, $font='',
// Javascript code
$return .= "';
return $return;
@@ -701,7 +720,6 @@ function flot_vcolumn_chart($graph_data, $width, $height, $color, $legend, $long
// Javascript code
$return .= "';
return $return;
@@ -887,9 +904,7 @@ function flot_slicesbar_graph(
// Javascript code
$return .= "';
diff --git a/pandora_console/include/help/clippy/module_unknow.php b/pandora_console/include/help/clippy/module_unknow.php
index 28656c9ba2..d3a6245032 100644
--- a/pandora_console/include/help/clippy/module_unknow.php
+++ b/pandora_console/include/help/clippy/module_unknow.php
@@ -32,7 +32,7 @@ function clippy_module_unknow()
$return_tours['tours']['module_unknow']['steps'] = [];
$return_tours['tours']['module_unknow']['steps'][] = [
'init_step_context' => true,
- 'intro' => ''.''.''.__('You have unknown modules in this agent.').' '.' '.''.''.__('Unknown modules are modules which receive data normally at least in one occassion, but at this time are not receving data. Please check our troubleshoot help page to help you determine why you have unknown modules.').ui_print_help_icon('context_module_unknow', true, '', 'images/help.png').' '.' '.'
',
+ 'intro' => ''.''.''.__('You have unknown modules in this agent.').' '.' '.''.''.__('Unknown modules are modules which receive data normally at least in one occassion, but at this time are not receving data. Please check our troubleshoot help page to help you determine why you have unknown modules.').' '.' '.'
',
];
$return_tours['tours']['module_unknow']['conf'] = [];
$return_tours['tours']['module_unknow']['conf']['autostart'] = false;
diff --git a/pandora_console/include/javascript/jquery.pandora.js b/pandora_console/include/javascript/jquery.pandora.js
index 9e0b3447af..ed75400386 100644
--- a/pandora_console/include/javascript/jquery.pandora.js
+++ b/pandora_console/include/javascript/jquery.pandora.js
@@ -1,386 +1,405 @@
(function($) {
- $.fn.check = function () {
- return this.each (function () {
- this.checked = true;
- });};
+ $.fn.check = function() {
+ return this.each(function() {
+ this.checked = true;
+ });
+ };
- $.fn.uncheck = function () {
- return this.each (function () {
- this.checked = false;
- });};
+ $.fn.uncheck = function() {
+ return this.each(function() {
+ this.checked = false;
+ });
+ };
- $.fn.enable = function () {
- return $(this).removeAttr ("disabled");
- };
+ $.fn.enable = function() {
+ return $(this).removeAttr("disabled");
+ };
- $.fn.disable = function () {
- return $(this).attr ("disabled", "disabled");
- };
+ $.fn.disable = function() {
+ return $(this).attr("disabled", "disabled");
+ };
- $.fn.pulsate = function () {
- var i = 0;
- for (i = 0; i <= 2; i++) {
- $(this).fadeOut ("slow").fadeIn ("slow");
- }
- };
+ $.fn.pulsate = function() {
+ var i = 0;
+ for (i = 0; i <= 2; i++) {
+ $(this)
+ .fadeOut("slow")
+ .fadeIn("slow");
+ }
+ };
- $.fn.showMessage = function (msg) {
- return $(this).hide ().empty ()
- // here, previously .text (msg)
- .html (msg)
- .slideDown ();
- };
-}) (jQuery);
+ $.fn.showMessage = function(msg) {
+ return (
+ $(this)
+ .hide()
+ .empty()
+ // here, previously .text (msg)
+ .html(msg)
+ .slideDown()
+ );
+ };
+})(jQuery);
-$(document).ready (function () {
- $("a#show_messages_dialog").click (function () {
- jQuery.post ("ajax.php",
- {
- "page": "operation/messages/message_list"
- },
- function (data, status) {
- $("#dialog_messages").hide ()
- .empty ()
- .append (data)
- .dialog ({
- title: $("a#show_messages_dialog").attr ("title"),
- resizable: false,
- modal: true,
- overlay: {
- opacity: 0.5,
- background: "black"
- },
- width: 700,
- height: 300
- }).show ();
- },
- "html"
- );
+$(document).ready(function() {
+ $("a#show_messages_dialog").click(function() {
+ jQuery.post(
+ "ajax.php",
+ {
+ page: "operation/messages/message_list"
+ },
+ function(data, status) {
+ $("#dialog_messages")
+ .hide()
+ .empty()
+ .append(data)
+ .dialog({
+ title: $("a#show_messages_dialog").attr("title"),
+ resizable: false,
+ modal: true,
+ overlay: {
+ opacity: 0.5,
+ background: "black"
+ },
+ width: 700,
+ height: 300
+ })
+ .show();
+ },
+ "html"
+ );
- return false;
- });
+ return false;
+ });
- $("a.show_systemalert_dialog").click (function () {
- $('body').append( "
" );
- $("#opacidad").css('opacity', 0.5);
+ $("a.show_systemalert_dialog").click(function() {
+ $("body").append(
+ "
"
+ );
+ $("#opacidad").css("opacity", 0.5);
- jQuery.post ("ajax.php",
- {
- "page": "operation/system_alert"},
- function (data, status) {
- $("#alert_messages").show();
- $("#alert_messages").empty ().append (data);
- $("#alert_messages").css('opacity', 1);
+ jQuery.post(
+ "ajax.php",
+ {
+ page: "operation/system_alert"
+ },
+ function(data, status) {
+ $("#alert_messages").show();
+ $("#alert_messages")
+ .empty()
+ .append(data);
+ $("#alert_messages").css("opacity", 1);
+ },
+ "html"
+ );
+ });
- },
- "html"
- );
- });
-
- $("a.modalpopup").click (function () {
- var elem = $(this).attr("id");
- $('body').append( "
" );
- $("#opacidad").css('opacity', 0.5);
+ $("a.modalpopup").click(function() {
+ var elem = $(this).attr("id");
+ $("body").append(
+ "
"
+ );
+ $("#opacidad").css("opacity", 0.5);
- jQuery.post ("ajax.php",
- {
- "page": "general/alert_enterprise",
- "message": elem
- },
- function (data, status) {
- $("#alert_messages").show();
- $("#alert_messages").empty ().append (data);
- $("#alert_messages").css('opacity', 1);
- },
- "html"
- );
- return false;
- });
+ jQuery.post(
+ "ajax.php",
+ {
+ page: "general/alert_enterprise",
+ message: elem
+ },
+ function(data, status) {
+ $("#alert_messages").show();
+ $("#alert_messages")
+ .empty()
+ .append(data);
+ $("#alert_messages").css("opacity", 1);
+ },
+ "html"
+ );
+ return false;
+ });
- // Creacion de ventana modal y botones
- $(".publienterprise").click (function () {
- var elem = $(this).attr("id");
- $('body').append( "
" );
- $("#opacidad").css('opacity', 0.5);
+ // Creacion de ventana modal y botones
+ $(".publienterprise").click(function() {
+ var elem = $(this).attr("id");
+ $("body").append(
+ "
"
+ );
+ $("#opacidad").css("opacity", 0.5);
- jQuery.post ("ajax.php",
- {
- "page": "general/alert_enterprise",
- "message": elem
- },
- function (data, status) {
- $("#alert_messages").show();
- $("#alert_messages").empty ().append (data);
- $("#alert_messages").css('opacity', 1);
- },
- "html"
- );
- return false;
- });
-
-
- $(".publienterprisehide").click (function () {
- var elem = $(this).attr("id");
- $('body').append( "
" );
- $("#opacidad").css('opacity', 0.5);
+ jQuery.post(
+ "ajax.php",
+ {
+ page: "general/alert_enterprise",
+ message: elem
+ },
+ function(data, status) {
+ $("#alert_messages").show();
+ $("#alert_messages")
+ .empty()
+ .append(data);
+ $("#alert_messages").css("opacity", 1);
+ },
+ "html"
+ );
+ return false;
+ });
- jQuery.post ("ajax.php",
- {
- "page": "general/alert_enterprise",
- "message": elem
- },
- function (data, status) {
- $("#alert_messages").show();
- $("#alert_messages").empty ().append (data);
- $("#alert_messages").css('opacity', 1);
- },
- "html"
- );
- return false;
- });
+ $(".publienterprisehide").click(function() {
+ var elem = $(this).attr("id");
+ $("body").append(
+ "
"
+ );
+ $("#opacidad").css("opacity", 0.5);
+ jQuery.post(
+ "ajax.php",
+ {
+ page: "general/alert_enterprise",
+ message: elem
+ },
+ function(data, status) {
+ $("#alert_messages").show();
+ $("#alert_messages")
+ .empty()
+ .append(data);
+ $("#alert_messages").css("opacity", 1);
+ },
+ "html"
+ );
+ return false;
+ });
+ if ($("#license_error_msg_dialog").length) {
+ if (typeof process_login_ok == "undefined") process_login_ok = 0;
- if ($('#license_error_msg_dialog').length) {
- if (typeof(process_login_ok) == "undefined")
- process_login_ok = 0;
+ if (typeof show_error_license == "undefined") show_error_license = 0;
- if (typeof(show_error_license) == "undefined")
- show_error_license = 0;
+ if (process_login_ok || show_error_license) {
+ $("#license_error_msg_dialog").dialog({
+ dialogClass: "no-close",
+ closeOnEscape: false,
+ resizable: false,
+ draggable: true,
+ modal: true,
+ height: 470,
+ width: 850,
+ overlay: {
+ opacity: 0.5,
+ background: "black"
+ },
+ open: function() {
+ var remaining = 30;
- if (process_login_ok || show_error_license) {
+ // Timeout counter.
+ var count = function() {
+ if (remaining > 0) {
+ $("#license_error_remaining").text(remaining);
+ remaining -= 1;
+ } else {
+ $("#license_error_remaining").hide();
+ $("#ok_buttom").show();
+ clearInterval(count);
+ }
+ };
- $( "#license_error_msg_dialog" ).dialog({
- dialogClass: "no-close",
- closeOnEscape: false,
- resizable: false,
- draggable: true,
- modal: true,
- height: 450,
- width: 850,
- overlay: {
- opacity: 0.5,
- background: "black"
- },
- open: function() {
- var remaining = 30;
+ setInterval(count, 1000);
+ }
+ });
- // Timeout counter.
- var count = function() {
- if (remaining > 0) {
- $("#license_error_remaining").text(remaining);
- remaining -= 1;
- } else {
- $("#license_error_remaining").hide();
- $("#ok_buttom").show();
- clearInterval(count);
- }
- }
+ $("#submit-hide-license-error-msg").click(function() {
+ $("#license_error_msg_dialog").dialog("close");
+ });
+ }
+ }
- setInterval(count, 1000);
- }
- });
+ if ($("#msg_change_password").length) {
+ $("#msg_change_password").dialog({
+ resizable: false,
+ draggable: true,
+ modal: true,
+ height: 450,
+ width: 620,
+ overlay: {
+ opacity: 0.5,
+ background: "black"
+ }
+ });
+ }
- $("#submit-hide-license-error-msg").click (function () {
- $("#license_error_msg_dialog" ).dialog('close')
- });
+ if ($("#login_blocked").length) {
+ $("#login_blocked").dialog({
+ resizable: true,
+ draggable: true,
+ modal: true,
+ height: 200,
+ width: 520,
+ overlay: {
+ opacity: 0.5,
+ background: "black"
+ }
+ });
+ }
- }
- }
+ if ($("#login_correct_pass").length) {
+ $("#login_correct_pass").dialog({
+ resizable: true,
+ draggable: true,
+ modal: true,
+ height: 200,
+ width: 520,
+ overlay: {
+ opacity: 0.5,
+ background: "black"
+ }
+ });
+ }
+ forced_title_callback();
- if ($('#msg_change_password').length) {
+ $(document).on("scroll", function() {
+ if (
+ document.documentElement.scrollTop != 0 ||
+ document.body.scrollTop != 0
+ ) {
+ if ($("#head").css("position") == "fixed") {
+ if ($("#menu").css("position") == "fixed") {
+ $("#menu").css("top", "80px");
+ } else {
+ $("#menu").css("top", "60px");
+ }
+ } else {
+ if ($("#menu").css("position") == "fixed") {
+ $("#menu").css("top", "20px");
+ } else {
+ $("#menu").css("top", "80px");
+ }
+ }
+ } else {
+ if ($("#head").css("position") == "fixed") {
+ if ($("#menu").css("position") == "fixed") {
+ $("#menu").css("top", "80px");
+ } else {
+ $("#menu").css("top", "60px");
+ }
+ } else {
+ if ($("#menu").css("position") == "fixed") {
+ $("#menu").css("top", "80px");
+ } else {
+ $("#menu").css("top", "80px");
+ }
+ }
+ }
- $( "#msg_change_password" ).dialog({
- resizable: false,
- draggable: true,
- modal: true,
- height: 350,
- width: 620,
- overlay: {
- opacity: 0.5,
- background: "black"
- }
- });
+ // if((document.documentElement.scrollTop != 0 || document.body.scrollTop != 0) && $('#menu').css('position') =='fixed'){
+ // if($('#head').css('position') =='fixed'){
+ // $('#menu').css('top','80px');
+ // }
+ // else{
+ // $('#menu').css('top','20px');
+ // }
+ // }
+ // else{
+ // if($('#head').css('position') =='fixed'){
+ // if(document.documentElement.scrollTop != 0 || document.body.scrollTop != 0){
+ // $('#menu').css('top','60px');
+ // }else{
+ // $('#menu').css('top','80px');
+ // }
+ //
+ // }
+ // else{
+ // $('#menu').css('top','60px');
+ // }
+ // }
+ });
- }
-
- if ($('#login_blocked').length) {
-
- $( "#login_blocked" ).dialog({
- resizable: true,
- draggable: true,
- modal: true,
- height: 200,
- width: 520,
- overlay: {
- opacity: 0.5,
- background: "black"
- }
- });
-
- }
-
- if ($('#login_correct_pass').length) {
-
- $( "#login_correct_pass" ).dialog({
- resizable: true,
- draggable: true,
- modal: true,
- height: 200,
- width: 520,
- overlay: {
- opacity: 0.5,
- background: "black"
- }
- });
-
- }
-
- forced_title_callback();
-
-
- $(document).on("scroll", function(){
-
- if(document.documentElement.scrollTop != 0 || document.body.scrollTop != 0){
- if($('#head').css('position') =='fixed'){
- if($('#menu').css('position') =='fixed'){
- $('#menu').css('top','80px');
- } else {
- $('#menu').css('top','60px');
- }
- } else {
- if($('#menu').css('position') =='fixed'){
- $('#menu').css('top','20px');
- } else {
- $('#menu').css('top','80px');
- }
- }
- } else {
- if($('#head').css('position') =='fixed'){
- if($('#menu').css('position') =='fixed'){
- $('#menu').css('top','80px');
- } else {
- $('#menu').css('top','60px');
- }
- } else {
- if($('#menu').css('position') =='fixed'){
- $('#menu').css('top','80px');
- } else {
- $('#menu').css('top','80px');
- }
- }
- }
-
- // if((document.documentElement.scrollTop != 0 || document.body.scrollTop != 0) && $('#menu').css('position') =='fixed'){
- // if($('#head').css('position') =='fixed'){
- // $('#menu').css('top','80px');
- // }
- // else{
- // $('#menu').css('top','20px');
- // }
- // }
- // else{
- // if($('#head').css('position') =='fixed'){
- // if(document.documentElement.scrollTop != 0 || document.body.scrollTop != 0){
- // $('#menu').css('top','60px');
- // }else{
- // $('#menu').css('top','80px');
- // }
- //
- // }
- // else{
- // $('#menu').css('top','60px');
- // }
- // }
- });
-
- $("#alert_messages").draggable();
- $("#alert_messages").css({'left':+parseInt(screen.width/2)-parseInt($("#alert_messages").css('width'))/2+'px'});
-
+ $("#alert_messages").draggable();
+ $("#alert_messages").css({
+ left:
+ +parseInt(screen.width / 2) -
+ parseInt($("#alert_messages").css("width")) / 2 +
+ "px"
+ });
});
-
-
-
function forced_title_callback() {
- // Forced title code
- $('body').on('mouseenter', '.forced_title', function() {
- ///////////////////////////////////////////
- // Put the layer in the left-top corner to fill it
- ///////////////////////////////////////////
- $('#forced_title_layer').css('left', 0);
- $('#forced_title_layer').css('top', 0);
+ // Forced title code
+ $("body").on("mouseenter", ".forced_title", function() {
+ ///////////////////////////////////////////
+ // Put the layer in the left-top corner to fill it
+ ///////////////////////////////////////////
+ $("#forced_title_layer").css("left", 0);
+ $("#forced_title_layer").css("top", 0);
- ///////////////////////////////////////////
- // Get info of the image
- ///////////////////////////////////////////
+ ///////////////////////////////////////////
+ // Get info of the image
+ ///////////////////////////////////////////
- var img_top = $(this).offset().top;
- var img_width = $(this).width();
- var img_height = $(this).height();
- var img_id = $(this).attr('id');
- var img_left_mid = $(this).offset().left + (img_width / 2);
+ var img_top = $(this).offset().top;
+ var img_width = $(this).width();
+ var img_height = $(this).height();
+ var img_id = $(this).attr("id");
+ var img_left_mid = $(this).offset().left + img_width / 2;
- ///////////////////////////////////////////
- // Put title in the layer
- ///////////////////////////////////////////
+ ///////////////////////////////////////////
+ // Put title in the layer
+ ///////////////////////////////////////////
- // If the '.forced_title' element has 'use_title_for_force_title' = 1
- // into their 'data' prop, the element title will be used for the
- // content.
- if ($(this).data("use_title_for_force_title")) {
- var title = $(this).data("title");
- }
- else {
- var title = $('#forced_title_'+img_id).html();
- }
+ // If the '.forced_title' element has 'use_title_for_force_title' = 1
+ // into their 'data' prop, the element title will be used for the
+ // content.
+ if ($(this).data("use_title_for_force_title")) {
+ var title = $(this).data("title");
+ } else {
+ var title = $("#forced_title_" + img_id).html();
+ }
- $('#forced_title_layer').html(title);
+ $("#forced_title_layer").html(title);
- ///////////////////////////////////////////
- // Get info of the layer
- ///////////////////////////////////////////
+ ///////////////////////////////////////////
+ // Get info of the layer
+ ///////////////////////////////////////////
- var layer_width = $('#forced_title_layer').width();
- var layer_height = $('#forced_title_layer').height();
+ var layer_width = $("#forced_title_layer").width();
+ var layer_height = $("#forced_title_layer").height();
- ///////////////////////////////////////////
- // Obtain the new position of the layer
- ///////////////////////////////////////////
+ ///////////////////////////////////////////
+ // Obtain the new position of the layer
+ ///////////////////////////////////////////
- // Jquery doesnt know the padding of the layer
- var layer_padding = 4;
+ // Jquery doesnt know the padding of the layer
+ var layer_padding = 4;
- // Deduct padding of both sides
- var layer_top = img_top - layer_height - (layer_padding * 2) - 5;
- if (layer_top < 0) {
- layer_top = img_top + img_height + (layer_padding * 2);
- }
+ // Deduct padding of both sides
+ var layer_top = img_top - layer_height - layer_padding * 2 - 5;
+ if (layer_top < 0) {
+ layer_top = img_top + img_height + layer_padding * 2;
+ }
- // Deduct padding of one side
- var layer_left = img_left_mid - (layer_width / 2) - layer_padding;
- if (layer_left < 0) {
- layer_left = 0;
- }
+ // Deduct padding of one side
+ var layer_left = img_left_mid - layer_width / 2 - layer_padding;
+ if (layer_left < 0) {
+ layer_left = 0;
+ }
- var real_layer_width = layer_width + (layer_padding * 2) + 5;
- var layer_right = layer_left + real_layer_width;
- var screen_width = $(window).width();
- if (screen_width < layer_right) {
- layer_left = screen_width - real_layer_width;
- }
+ var real_layer_width = layer_width + layer_padding * 2 + 5;
+ var layer_right = layer_left + real_layer_width;
+ var screen_width = $(window).width();
+ if (screen_width < layer_right) {
+ layer_left = screen_width - real_layer_width;
+ }
- ///////////////////////////////////////////
- // Set the layer position and show
- ///////////////////////////////////////////
+ ///////////////////////////////////////////
+ // Set the layer position and show
+ ///////////////////////////////////////////
- $('#forced_title_layer').css('left', layer_left);
- $('#forced_title_layer').css('top', layer_top);
- $('#forced_title_layer').show();
- });
- $('body').on('mouseout', '.forced_title', function () {
- $('#forced_title_layer').hide().empty();
- });
+ $("#forced_title_layer").css("left", layer_left);
+ $("#forced_title_layer").css("top", layer_top);
+ $("#forced_title_layer").show();
+ });
+ $("body").on("mouseout", ".forced_title", function() {
+ $("#forced_title_layer")
+ .hide()
+ .empty();
+ });
}
-
diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js
index d0a83bd6e8..94dadb6fbb 100644
--- a/pandora_console/include/javascript/pandora_events.js
+++ b/pandora_console/include/javascript/pandora_events.js
@@ -231,7 +231,6 @@ function get_response(response_id) {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: false,
- timeout: 10000,
dataType: "json",
success: function(data) {
response = data;
@@ -255,7 +254,6 @@ function get_response_params(response_id) {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: false,
- timeout: 10000,
dataType: "json",
success: function(data) {
response_params = data;
@@ -279,7 +277,6 @@ function get_response_description(response_id) {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: false,
- timeout: 10000,
dataType: "html",
success: function(data) {
response_description = data;
@@ -305,7 +302,6 @@ function get_event_name(event_id, meta, history) {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: false,
- timeout: 10000,
dataType: "html",
success: function(data) {
name = data;
@@ -349,7 +345,6 @@ function get_response_target(
type: "POST",
url: $("#hidden-ajax_file").val(),
async: false,
- timeout: 10000,
dataType: "html",
success: function(data) {
target = data;
@@ -394,7 +389,6 @@ function perform_response(target, response_id) {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: true,
- timeout: 10000,
dataType: "html",
success: function(data) {
var out = data.replace(/[\n|\r]/g, " ");
@@ -424,7 +418,6 @@ function perform_response_massive(target, response_id, out_iterator) {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: true,
- timeout: 10000,
dataType: "html",
success: function(data) {
var out = data.replace(/[\n|\r]/g, " ");
@@ -460,7 +453,6 @@ function event_change_status(event_ids) {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: true,
- timeout: 10000,
dataType: "html",
success: function(data) {
$("#button-status_button").removeAttr("disabled");
@@ -499,7 +491,6 @@ function event_change_owner() {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: true,
- timeout: 10000,
dataType: "html",
success: function(data) {
$("#button-owner_button").removeAttr("disabled");
@@ -553,13 +544,11 @@ function event_comment() {
type: "POST",
url: $("#hidden-ajax_file").val(),
async: true,
- timeout: 10000,
dataType: "html",
success: function(data) {
$("#button-comment_button").removeAttr("disabled");
- $("#response_loading").show();
- dt_events.draw(false);
- show_event_dialog(current_event, "comments", data);
+ $("#response_loading").hide();
+ $("#link_comments").click();
}
});
@@ -681,7 +670,6 @@ function update_event(table, id_evento, type, event_rep, row) {
// Update events matching current filters and id_evento selected.
$.ajax({
async: true,
- timeout: 10000,
type: "POST",
url: $("#hidden-ajax_file").val(),
data: {
@@ -700,7 +688,7 @@ function update_event(table, id_evento, type, event_rep, row) {
var diff_s = diff_g / 1000;
if (processed >= $(".chk_val:checked").length) {
// If operation takes less than 2 seconds, redraw.
- if (diff_s < 2) {
+ if (diff_s < 2 || $(".chk_val:checked").length > 1) {
redraw = true;
}
if (redraw) {
@@ -722,6 +710,7 @@ function validate_event(table, id_evento, event_rep, row) {
var button = document.getElementById("val-" + id_evento);
if (!button) {
// Button does not exist. Ignore.
+ processed += 1;
return;
}
@@ -734,6 +723,7 @@ function in_process_event(table, id_evento, event_rep, row) {
var button = document.getElementById("proc-" + id_evento);
if (!button) {
// Button does not exist. Ignore.
+ processed += 1;
return;
}
@@ -752,6 +742,7 @@ function delete_event(table, id_evento, event_rep, row) {
var button = document.getElementById("del-" + id_evento);
if (!button) {
// Button does not exist. Ignore.
+ processed += 1;
return;
}
diff --git a/pandora_console/include/javascript/pandora_modules.js b/pandora_console/include/javascript/pandora_modules.js
index 0487923b38..049bb9e96b 100644
--- a/pandora_console/include/javascript/pandora_modules.js
+++ b/pandora_console/include/javascript/pandora_modules.js
@@ -1223,3 +1223,42 @@ function get_explanation_recon_script(id, id_rt, url) {
taskManager.addTask(xhr);
}
+
+// Filter modules in a select (bulk operations)
+function filterByText(selectbox, textbox, textNoData) {
+ return selectbox.each(function() {
+ var select = selectbox;
+ var options = [];
+ $(select)
+ .find("option")
+ .each(function() {
+ options.push({ value: $(this).val(), text: $(this).text() });
+ });
+ $(select).data("options", options);
+ $(textbox).bind("change keyup", function() {
+ var options = $(select)
+ .empty()
+ .scrollTop(0)
+ .data("options");
+ var search = $(this).val();
+ var regex = new RegExp(search, "gi");
+ $.each(options, function(i) {
+ var option = options[i];
+ if (option.text.match(regex) !== null) {
+ $(select).append(
+ $("")
+ .text(option.text)
+ .val(option.value)
+ );
+ }
+ });
+ if ($(select)[0].length == 0) {
+ $(select).append(
+ $(" ")
+ .text(textNoData)
+ .val(textNoData)
+ );
+ }
+ });
+ });
+}
diff --git a/pandora_console/include/javascript/pandora_snmp_browser.js b/pandora_console/include/javascript/pandora_snmp_browser.js
index ee75eac71f..dbe8121a64 100644
--- a/pandora_console/include/javascript/pandora_snmp_browser.js
+++ b/pandora_console/include/javascript/pandora_snmp_browser.js
@@ -417,3 +417,50 @@ function checkSNMPVersion() {
$("#snmp3_browser_options").css("display", "none");
}
}
+
+// Show the SNMP browser window
+function snmpBrowserWindow() {
+ // Keep elements in the form and the SNMP browser synced
+ $("#text-target_ip").val($("#text-ip_target").val());
+ $("#text-community").val($("#text-snmp_community").val());
+ $("#snmp_browser_version").val($("#snmp_version").val());
+ $("#text-snmp3_browser_auth_user").val($("#text-snmp3_auth_user").val());
+ $("#snmp3_browser_security_level").val($("#snmp3_security_level").val());
+ $("#snmp3_browser_auth_method").val($("#snmp3_auth_method").val());
+ $("#password-snmp3_browser_auth_pass").val(
+ $("#password-snmp3_auth_pass").val()
+ );
+ $("#snmp3_browser_privacy_method").val($("#snmp3_privacy_method").val());
+ $("#password-snmp3_browser_privacy_pass").val(
+ $("#password-snmp3_privacy_pass").val()
+ );
+
+ checkSNMPVersion();
+
+ $("#snmp_browser_container")
+ .show()
+ .dialog({
+ title: "",
+ resizable: true,
+ draggable: true,
+ modal: true,
+ overlay: {
+ opacity: 0.5,
+ background: "black"
+ },
+ width: 920,
+ height: 500
+ });
+}
+
+// Set the form OID to the value selected in the SNMP browser
+function setOID() {
+ if ($("#snmp_browser_version").val() == "3") {
+ $("#text-snmp_oid").val($("#table1-0-1").text());
+ } else {
+ $("#text-snmp_oid").val($("#snmp_selected_oid").text());
+ }
+
+ // Close the SNMP browser
+ $(".ui-dialog-titlebar-close").trigger("click");
+}
diff --git a/pandora_console/include/javascript/pandora_visual_console.js b/pandora_console/include/javascript/pandora_visual_console.js
index bedc6538f4..6a726a1d8e 100755
--- a/pandora_console/include/javascript/pandora_visual_console.js
+++ b/pandora_console/include/javascript/pandora_visual_console.js
@@ -123,7 +123,7 @@ function createVisualConsole(
try {
visualConsole = new VisualConsole(container, props, items);
// VC Item clicked.
- visualConsole.onClick(function(e) {
+ visualConsole.onItemClick(function(e) {
// Override the link to another VC if it isn't on remote console.
if (
e.data &&
@@ -139,6 +139,94 @@ function createVisualConsole(
updateVisualConsole(e.data.linkedLayoutId, updateInterval);
}
});
+ // VC Item moved.
+ visualConsole.onItemMoved(function(e) {
+ var id = e.item.props.id;
+ var data = {
+ x: e.newPosition.x,
+ y: e.newPosition.y,
+ type: e.item.props.type
+ };
+ var taskId = "visual-console-item-move-" + id;
+
+ // Persist the new position.
+ asyncTaskManager
+ .add(taskId, function(done) {
+ var abortable = updateVisualConsoleItem(
+ baseUrl,
+ visualConsole.props.id,
+ id,
+ data,
+ function(error, data) {
+ // if (!error && !data) return;
+ if (error || !data) {
+ console.log(
+ "[ERROR]",
+ "[VISUAL-CONSOLE-CLIENT]",
+ "[API]",
+ error ? error.message : "Invalid response"
+ );
+
+ // Move the element to its initial position.
+ e.item.move(e.prevPosition.x, e.prevPosition.y);
+ }
+
+ done();
+ }
+ );
+
+ return {
+ cancel: function() {
+ abortable.abort();
+ }
+ };
+ })
+ .init();
+ });
+ // VC Item resized.
+ visualConsole.onItemResized(function(e) {
+ var id = e.item.props.id;
+ var data = {
+ width: e.newSize.width,
+ height: e.newSize.height,
+ type: e.item.props.type
+ };
+ var taskId = "visual-console-item-resize-" + id;
+
+ // Persist the new size.
+ asyncTaskManager
+ .add(taskId, function(done) {
+ var abortable = updateVisualConsoleItem(
+ baseUrl,
+ visualConsole.props.id,
+ id,
+ data,
+ function(error, data) {
+ // if (!error && !data) return;
+ if (error || !data) {
+ console.log(
+ "[ERROR]",
+ "[VISUAL-CONSOLE-CLIENT]",
+ "[API]",
+ error ? error.message : "Invalid response"
+ );
+
+ // Resize the element to its initial Size.
+ e.item.resize(e.prevSize.width, e.prevSize.height);
+ }
+
+ done();
+ }
+ );
+
+ return {
+ cancel: function() {
+ abortable.abort();
+ }
+ };
+ })
+ .init();
+ });
if (updateInterval != null && updateInterval > 0) {
// Start an interval to update the Visual Console.
@@ -266,6 +354,75 @@ function loadVisualConsoleData(baseUrl, vcId, callback) {
};
}
+/**
+ * Fetch a Visual Console's structure and its items.
+ * @param {string} baseUrl Base URL to build the API path.
+ * @param {number} vcId Identifier of the Visual Console.
+ * @param {number} vcItemId Identifier of the Visual Console's item.
+ * @param {Object} data Data we want to save.
+ * @param {function} callback Function to be executed on request success or fail.
+ * @return {Object} Cancellable. Object which include and .abort([statusText]) function.
+ */
+// eslint-disable-next-line no-unused-vars
+function updateVisualConsoleItem(baseUrl, vcId, vcItemId, data, callback) {
+ // var apiPath = baseUrl + "/include/rest-api";
+ var apiPath = baseUrl + "/ajax.php";
+ var jqXHR = null;
+
+ // Cancel the ajax requests.
+ var abort = function(textStatus) {
+ if (textStatus == null) textStatus = "abort";
+
+ // -- XMLHttpRequest.readyState --
+ // Value State Description
+ // 0 UNSENT Client has been created. open() not called yet.
+ // 4 DONE The operation is complete.
+
+ if (jqXHR.readyState !== 0 && jqXHR.readyState !== 4)
+ jqXHR.abort(textStatus);
+ };
+
+ // Failed request handler.
+ var handleFail = function(jqXHR, textStatus, errorThrown) {
+ abort();
+ // Manually aborted or not.
+ if (textStatus === "abort") {
+ callback();
+ } else {
+ var error = new Error(errorThrown);
+ error.request = jqXHR;
+ callback(error);
+ }
+ };
+
+ // Function which handle success case.
+ var handleSuccess = function(data) {
+ callback(null, data);
+ };
+
+ // Visual Console container request.
+ jqXHR = jQuery
+ // .get(apiPath + "/visual-consoles/" + vcId, null, "json")
+ .get(
+ apiPath,
+ {
+ page: "include/rest-api/index",
+ updateVisualConsoleItem: 1,
+ visualConsoleId: vcId,
+ visualConsoleItemId: vcItemId,
+ data: data
+ },
+ "json"
+ )
+ .done(handleSuccess)
+ .fail(handleFail);
+
+ // Abortable.
+ return {
+ abort: abort
+ };
+}
+
// TODO: Delete the functions below when you can.
/**************************************
These functions require jQuery library
diff --git a/pandora_console/include/rest-api/index.php b/pandora_console/include/rest-api/index.php
index 10f87488c7..1aa8bfb5a9 100644
--- a/pandora_console/include/rest-api/index.php
+++ b/pandora_console/include/rest-api/index.php
@@ -13,6 +13,7 @@ use Models\VisualConsole\Container as VisualConsole;
$visualConsoleId = (int) get_parameter('visualConsoleId');
$getVisualConsole = (bool) get_parameter('getVisualConsole');
$getVisualConsoleItems = (bool) get_parameter('getVisualConsoleItems');
+$updateVisualConsoleItem = (bool) get_parameter('updateVisualConsoleItem');
// Check groups can access user.
$aclUserGroups = [];
@@ -44,6 +45,21 @@ if ($getVisualConsole === true) {
} else if ($getVisualConsoleItems === true) {
$vcItems = VisualConsole::getItemsFromDB($visualConsoleId, $aclUserGroups);
echo '['.implode($vcItems, ',').']';
+} else if ($updateVisualConsoleItem === true) {
+ $visualConsoleId = (integer) get_parameter('visualConsoleId');
+ $visualConsoleItemId = (integer) get_parameter('visualConsoleItemId');
+ $data = get_parameter('data');
+
+ $class = VisualConsole::getItemClass($data['type']);
+
+ $item_data = [];
+ $item_data['id'] = $visualConsoleItemId;
+ $item_data['id_layout'] = $visualConsoleId;
+
+ $item = $class::fromDB($item_data);
+ $result = $item->save($data);
+
+ echo json_encode($result);
}
exit;
diff --git a/pandora_console/include/rest-api/models/Model.php b/pandora_console/include/rest-api/models/Model.php
index 78ef90468e..cebdb3d0d7 100644
--- a/pandora_console/include/rest-api/models/Model.php
+++ b/pandora_console/include/rest-api/models/Model.php
@@ -47,6 +47,30 @@ abstract class Model
abstract protected function decode(array $data): array;
+ /**
+ * Return a valid representation of a record in database.
+ *
+ * @param array $data Input data.
+ *
+ * @return array Data structure representing a record in database.
+ *
+ * @abstract
+ */
+ abstract protected function encode(array $data): array;
+
+
+ /**
+ * Insert or update an item in the database
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return boolean The modeled element data structure stored into the DB.
+ *
+ * @abstract
+ */
+ abstract public function save(array $data=[]);
+
+
/**
* Constructor of the model. It won't be public. The instances
* will be created through factories which start with from*.
@@ -62,6 +86,12 @@ abstract class Model
}
+ public function setData(array $data)
+ {
+ $this->data = $data;
+ }
+
+
/**
* Instance the class with the unknown input data.
*
@@ -69,7 +99,7 @@ abstract class Model
*
* @return self Instance of the model.
*/
- public static function fromArray(array $data)
+ public static function fromArray(array $data): self
{
// The reserved word static refers to the invoked class at runtime.
return new static($data);
diff --git a/pandora_console/include/rest-api/models/VisualConsole/Container.php b/pandora_console/include/rest-api/models/VisualConsole/Container.php
index 91c650c404..9ad437ed5b 100644
--- a/pandora_console/include/rest-api/models/VisualConsole/Container.php
+++ b/pandora_console/include/rest-api/models/VisualConsole/Container.php
@@ -92,6 +92,37 @@ final class Container extends Model
}
+ /**
+ * Return a valid representation of a record in database.
+ *
+ * @param array $data Input data.
+ *
+ * @return array Data structure representing a record in database.
+ *
+ * @overrides Model::encode.
+ */
+ protected function encode(array $data): array
+ {
+ $result = [];
+ return $result;
+ }
+
+
+ /**
+ * Insert or update an item in the database
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return boolean The modeled element data structure stored into the DB.
+ *
+ * @overrides Model::save.
+ */
+ public function save(array $data=[]): bool
+ {
+ return true;
+ }
+
+
/**
* Extract a group Id value.
*
diff --git a/pandora_console/include/rest-api/models/VisualConsole/Item.php b/pandora_console/include/rest-api/models/VisualConsole/Item.php
index 617b48e517..3105233b31 100644
--- a/pandora_console/include/rest-api/models/VisualConsole/Item.php
+++ b/pandora_console/include/rest-api/models/VisualConsole/Item.php
@@ -240,7 +240,7 @@ class Item extends CachedModel
private static function extractX(array $data): int
{
return static::parseIntOr(
- static::issetInArray($data, ['x', 'pos_x']),
+ static::issetInArray($data, ['x', 'pos_x', 'posX', 'startX']),
0
);
}
@@ -256,7 +256,7 @@ class Item extends CachedModel
private static function extractY(array $data): int
{
return static::parseIntOr(
- static::issetInArray($data, ['y', 'pos_y']),
+ static::issetInArray($data, ['y', 'pos_y', 'posY', 'startY']),
0
);
}
@@ -272,7 +272,7 @@ class Item extends CachedModel
private static function extractAclGroupId(array $data)
{
return static::parseIntOr(
- static::issetInArray($data, ['id_group', 'aclGroupId']),
+ static::issetInArray($data, ['id_group', 'aclGroupId', 'idGroup']),
null
);
}
@@ -288,7 +288,7 @@ class Item extends CachedModel
private static function extractParentId(array $data)
{
return static::parseIntOr(
- static::issetInArray($data, ['parentId', 'parent_item']),
+ static::issetInArray($data, ['parentId', 'parent_item', 'parentItem']),
null
);
}
@@ -304,7 +304,7 @@ class Item extends CachedModel
private static function extractIsOnTop(array $data): bool
{
return static::parseBool(
- static::issetInArray($data, ['isOnTop', 'show_on_top'])
+ static::issetInArray($data, ['isOnTop', 'show_on_top', 'showOnTop'])
);
}
@@ -319,7 +319,7 @@ class Item extends CachedModel
private static function extractIsLinkEnabled(array $data): bool
{
return static::parseBool(
- static::issetInArray($data, ['isLinkEnabled', 'enable_link'])
+ static::issetInArray($data, ['isLinkEnabled', 'enable_link', 'enableLink'])
);
}
@@ -376,7 +376,23 @@ class Item extends CachedModel
private static function extractAgentId(array $data)
{
return static::parseIntOr(
- static::issetInArray($data, ['agentId', 'id_agent', 'id_agente']),
+ static::issetInArray($data, ['agentId', 'id_agent', 'id_agente', 'idAgent', 'idAgente']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract a custom id graph value.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Valid identifier of an agent.
+ */
+ private static function extractIdCustomGraph(array $data)
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['id_custom_graph', 'idCustomGraph', 'customGraphId']),
null
);
}
@@ -398,6 +414,9 @@ class Item extends CachedModel
'moduleId',
'id_agente_modulo',
'id_modulo',
+ 'idModulo',
+ 'idAgenteModulo',
+ 'idAgentModule',
]
),
null
@@ -1187,4 +1206,468 @@ class Item extends CachedModel
}
+ /**
+ * Return a valid representation of a record in database.
+ *
+ * @param array $data Input data.
+ *
+ * @return array Data structure representing a record in database.
+ *
+ * @overrides Model::encode.
+ */
+ protected function encode(array $data): array
+ {
+ $result = [];
+
+ $id = static::getId($data);
+ if ($id) {
+ $result['id'] = $id;
+ }
+
+ $id_layout = static::getIdLayout($data);
+ if ($id_layout) {
+ $result['id_layout'] = $id_layout;
+ }
+
+ $pos_x = static::parseIntOr(
+ static::issetInArray($data, ['x', 'pos_x', 'posX']),
+ null
+ );
+ if ($pos_x !== null) {
+ $result['pos_x'] = $pos_x;
+ }
+
+ $pos_y = static::parseIntOr(
+ static::issetInArray($data, ['y', 'pos_y', 'posY']),
+ null
+ );
+ if ($pos_y !== null) {
+ $result['pos_y'] = $pos_y;
+ }
+
+ $height = static::getHeight($data);
+ if ($height !== null) {
+ $result['height'] = $height;
+ }
+
+ $width = static::getWidth($data);
+ if ($width !== null) {
+ $result['width'] = $width;
+ }
+
+ $label = static::extractLabel($data);
+ if ($label !== null) {
+ $result['label'] = $label;
+ }
+
+ $image = static::getImageSrc($data);
+ if ($image !== null) {
+ $result['image'] = $image;
+ }
+
+ $type = static::parseIntOr(
+ static::issetInArray($data, ['type']),
+ null
+ );
+ if ($type !== null) {
+ $result['type'] = $type;
+ }
+
+ $period = static::parseIntOr(
+ static::issetInArray($data, ['period', 'maxTime']),
+ null
+ );
+ if ($period !== null) {
+ $result['period'] = $period;
+ }
+
+ $id_agente_modulo = static::extractModuleId($data);
+ if ($id_agente_modulo !== null) {
+ $result['id_agente_modulo'] = $id_agente_modulo;
+ }
+
+ $id_agent = static::extractAgentId($data);
+ if ($id_agent !== null) {
+ $result['id_agent'] = $id_agent;
+ }
+
+ $id_layout_linked = static::parseIntOr(
+ static::issetInArray($data, ['linkedLayoutId', 'id_layout_linked', 'idLayoutLinked']),
+ null
+ );
+ if ($id_layout_linked !== null) {
+ $result['id_layout_linked'] = $id_layout_linked;
+ }
+
+ $parent_item = static::extractParentId($data);
+ if ($parent_item !== null) {
+ $result['parent_item'] = $parent_item;
+ }
+
+ $enable_link = static::issetInArray($data, ['isLinkEnabled', 'enable_link', 'enableLink']);
+ if ($enable_link !== null) {
+ $result['enable_link'] = static::parseBool($enable_link);
+ }
+
+ $id_metaconsole = static::extractMetaconsoleId($data);
+ if ($id_metaconsole !== null) {
+ $result['id_metaconsole'] = $id_metaconsole;
+ }
+
+ $id_group = static::extractAclGroupId($data);
+ if ($id_group !== null) {
+ $result['id_group'] = $id_group;
+ }
+
+ $id_custom_graph = static::extractIdCustomGraph($data);
+ if ($id_custom_graph !== null) {
+ $result['id_custom_graph'] = $id_custom_graph;
+ }
+
+ $border_width = static::getBorderWidth($data);
+ if ($border_width !== null) {
+ $result['border_width'] = $border_width;
+ }
+
+ $type_graph = static::getTypeGraph($data);
+ if ($type_graph !== null) {
+ $result['type_graph'] = $type_graph;
+ }
+
+ $label_position = static::notEmptyStringOr(
+ static::issetInArray($data, ['labelPosition', 'label_position']),
+ null
+ );
+ if ($label_position !== null) {
+ $result['label_position'] = $label_position;
+ }
+
+ $border_color = static::getBorderColor($data);
+ if ($border_color !== null) {
+ $result['border_color'] = $border_color;
+ }
+
+ $fill_color = static::getFillColor($data);
+ if ($fill_color !== null) {
+ $result['fill_color'] = $fill_color;
+ }
+
+ $show_statistics = static::issetInArray($data, ['showStatistics', 'show_statistics']);
+ if ($show_statistics !== null) {
+ $result['show_statistics'] = static::parseBool($show_statistics);
+ }
+
+ $linked_layout_node_id = static::parseIntOr(
+ static::issetInArray(
+ $data,
+ [
+ 'linkedLayoutAgentId',
+ 'linked_layout_node_id',
+ ]
+ ),
+ null
+ );
+ if ($linked_layout_node_id !== null) {
+ $result['linked_layout_node_id'] = $linked_layout_node_id;
+ }
+
+ $linked_layout_status_type = static::notEmptyStringOr(
+ static::issetInArray($data, ['linkedLayoutStatusType', 'linked_layout_status_type']),
+ null
+ );
+ if ($linked_layout_status_type !== null) {
+ $result['linked_layout_status_type'] = $linked_layout_status_type;
+ }
+
+ $id_layout_linked_weight = static::parseIntOr(
+ static::issetInArray($data, ['linkedLayoutStatusTypeWeight', 'id_layout_linked_weight']),
+ null
+ );
+ if ($id_layout_linked_weight !== null) {
+ $result['id_layout_linked_weight'] = $id_layout_linked_weight;
+ }
+
+ $linked_layout_status_as_service_warning = static::parseIntOr(
+ static::issetInArray(
+ $data,
+ [
+ 'linkedLayoutStatusTypeWarningThreshold',
+ 'linked_layout_status_as_service_warning',
+ ]
+ ),
+ null
+ );
+ if ($linked_layout_status_as_service_warning !== null) {
+ $result['linked_layout_status_as_service_warning'] = $linked_layout_status_as_service_warning;
+ }
+
+ $linked_layout_status_as_service_critical = static::parseIntOr(
+ static::issetInArray(
+ $data,
+ [
+ 'linkedLayoutStatusTypeCriticalThreshold',
+ 'linked_layout_status_as_service_critical',
+ ]
+ ),
+ null
+ );
+ if ($linked_layout_status_as_service_critical !== null) {
+ $result['linked_layout_status_as_service_critical'] = $linked_layout_status_as_service_critical;
+ }
+
+ $element_group = static::parseIntOr(
+ static::issetInArray($data, ['elementGroup', 'element_group']),
+ null
+ );
+ if ($element_group !== null) {
+ $result['element_group'] = $element_group;
+ }
+
+ $show_on_top = static::issetInArray($data, ['isOnTop', 'show_on_top', 'showOnTop']);
+ if ($show_on_top !== null) {
+ $result['show_on_top'] = static::parseBool($show_on_top);
+ }
+
+ $clock_animation = static::notEmptyStringOr(
+ static::issetInArray($data, ['clockType', 'clock_animation', 'clockAnimation']),
+ null
+ );
+ if ($clock_animation !== null) {
+ $result['clock_animation'] = $clock_animation;
+ }
+
+ $time_format = static::notEmptyStringOr(
+ static::issetInArray($data, ['clockFormat', 'time_format', 'timeFormat']),
+ null
+ );
+ if ($time_format !== null) {
+ $result['time_format'] = $time_format;
+ }
+
+ $timezone = static::notEmptyStringOr(
+ static::issetInArray($data, ['timezone', 'timeZone', 'time_zone', 'clockTimezone']),
+ null
+ );
+ if ($timezone !== null) {
+ $result['timezone'] = $timezone;
+ }
+
+ $show_last_value = static::parseIntOr(
+ static::issetInArray($data, ['show_last_value', 'showLastValue']),
+ null
+ );
+ if ($show_last_value !== null) {
+ $result['show_last_value'] = $show_last_value;
+ }
+
+ $cache_expiration = static::parseIntOr(
+ static::issetInArray($data, ['cache_expiration', 'cacheExpiration']),
+ null
+ );
+ if ($cache_expiration !== null) {
+ $result['cache_expiration'] = $cache_expiration;
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Extract item id.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item id. 0 by default.
+ */
+ private static function getId(array $data): int
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['id', 'itemId']),
+ 0
+ );
+ }
+
+
+ /**
+ * Extract layout id.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item id. 0 by default.
+ */
+ private static function getIdLayout(array $data): int
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['id_layout', 'idLayout', 'layoutId']),
+ 0
+ );
+ }
+
+
+ /**
+ * Extract item width.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item width. 0 by default.
+ */
+ private static function getWidth(array $data)
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['width', 'endX']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract item height.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item height. 0 by default.
+ */
+ private static function getHeight(array $data)
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['height', 'endY']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract a image src value.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return mixed String representing the image url (not empty) or null.
+ */
+ protected static function getImageSrc(array $data)
+ {
+ $imageSrc = static::notEmptyStringOr(
+ static::issetInArray($data, ['image', 'imageSrc', 'backgroundColor', 'backgroundType', 'valueType']),
+ null
+ );
+
+ return $imageSrc;
+ }
+
+
+ /**
+ * Extract a border width value.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Valid border width.
+ */
+ private static function getBorderWidth(array $data)
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['border_width', 'borderWidth']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract a type graph value.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return string One of 'vertical' or 'horizontal'. 'vertical' by default.
+ */
+ private static function getTypeGraph(array $data)
+ {
+ return static::notEmptyStringOr(
+ static::issetInArray($data, ['typeGraph', 'type_graph', 'graphType']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract a border color value.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return mixed String representing the border color (not empty) or null.
+ */
+ private static function getBorderColor(array $data)
+ {
+ return static::notEmptyStringOr(
+ static::issetInArray($data, ['borderColor', 'border_color', 'gridColor', 'color', 'legendBackgroundColor']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract a fill color value.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return mixed String representing the fill color (not empty) or null.
+ */
+ private static function getFillColor(array $data)
+ {
+ return static::notEmptyStringOr(
+ static::issetInArray($data, ['fillColor', 'fill_color', 'labelColor']),
+ null
+ );
+ }
+
+
+ /**
+ * Insert or update an item in the database
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return boolean The modeled element data structure stored into the DB.
+ *
+ * @overrides Model::save.
+ */
+ public function save(array $data=[]): bool
+ {
+ if (empty($data)) {
+ return false;
+ }
+
+ $dataModelEncode = $this->encode($this->toArray());
+ $dataEncode = $this->encode($data);
+
+ $save = \array_merge($dataModelEncode, $dataEncode);
+
+ if (!empty($save)) {
+ if (empty($save['id'])) {
+ // Insert.
+ $result = \db_process_sql_insert('tlayout_data', $save);
+ if ($result) {
+ $item = static::fromDB(['id' => $result]);
+ }
+ } else {
+ // Update.
+ $result = \db_process_sql_update('tlayout_data', $save, ['id' => $save['id']]);
+ // Invalidate the item's cache.
+ if ($result !== false && $result > 0) {
+ db_process_sql_delete(
+ 'tvisual_console_elements_cache',
+ [
+ 'vc_item_id' => (int) $save['id'],
+ ]
+ );
+
+ $item = static::fromDB(['id' => $save['id']]);
+ // Update the model.
+ if (!empty($item)) {
+ $this->setData($item->toArray());
+ }
+ }
+ }
+ }
+
+ return (bool) $result;
+ }
+
+
}
diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php b/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php
index fd6f64b4cb..4b177c30b2 100644
--- a/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php
+++ b/pandora_console/include/rest-api/models/VisualConsole/Items/Line.php
@@ -206,4 +206,203 @@ final class Line extends Model
}
+ /**
+ * Return a valid representation of a record in database.
+ *
+ * @param array $data Input data.
+ *
+ * @return array Data structure representing a record in database.
+ *
+ * @overrides Model::encode.
+ */
+ protected function encode(array $data): array
+ {
+ $result = [];
+
+ $id = static::getId($data);
+ if ($id) {
+ $result['id'] = $id;
+ }
+
+ $id_layout = static::getIdLayout($data);
+ if ($id_layout) {
+ $result['id_layout'] = $id_layout;
+ }
+
+ $pos_x = static::parseIntOr(
+ static::issetInArray($data, ['x', 'pos_x', 'posX']),
+ null
+ );
+ if ($pos_x !== null) {
+ $result['pos_x'] = $pos_x;
+ }
+
+ $pos_y = static::parseIntOr(
+ static::issetInArray($data, ['y', 'pos_y', 'posY']),
+ null
+ );
+ if ($pos_y !== null) {
+ $result['pos_y'] = $pos_y;
+ }
+
+ $height = static::getHeight($data);
+ if ($height !== null) {
+ $result['height'] = $height;
+ }
+
+ $width = static::getWidth($data);
+ if ($width !== null) {
+ $result['width'] = $width;
+ }
+
+ $type = static::parseIntOr(
+ static::issetInArray($data, ['type']),
+ null
+ );
+ if ($type !== null) {
+ $result['type'] = $type;
+ }
+
+ $border_width = static::getBorderWidth($data);
+ if ($border_width !== null) {
+ $result['border_width'] = $border_width;
+ }
+
+ $border_color = static::extractBorderColor($data);
+ if ($border_color !== null) {
+ $result['border_color'] = $border_color;
+ }
+
+ $show_on_top = static::issetInArray($data, ['isOnTop', 'show_on_top', 'showOnTop']);
+ if ($show_on_top !== null) {
+ $result['show_on_top'] = static::parseBool($show_on_top);
+ }
+
+ return $result;
+ }
+
+
+ /**
+ * Extract item id.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item id. 0 by default.
+ */
+ private static function getId(array $data): int
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['id', 'itemId']),
+ 0
+ );
+ }
+
+
+ /**
+ * Extract layout id.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item id. 0 by default.
+ */
+ private static function getIdLayout(array $data): int
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['id_layout', 'idLayout', 'layoutId']),
+ 0
+ );
+ }
+
+
+ /**
+ * Extract item width.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item width. 0 by default.
+ */
+ private static function getWidth(array $data)
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['width', 'endX']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract item height.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Item height. 0 by default.
+ */
+ private static function getHeight(array $data)
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['height', 'endY']),
+ null
+ );
+ }
+
+
+ /**
+ * Extract a border width value.
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return integer Valid border width.
+ */
+ private static function getBorderWidth(array $data)
+ {
+ return static::parseIntOr(
+ static::issetInArray($data, ['border_width', 'borderWidth']),
+ null
+ );
+ }
+
+
+ /**
+ * Insert or update an item in the database
+ *
+ * @param array $data Unknown input data structure.
+ *
+ * @return boolean The modeled element data structure stored into the DB.
+ *
+ * @overrides Model::save.
+ */
+ public function save(array $data=[]): bool
+ {
+ $data_model = $this->encode($this->toArray());
+ $newData = $this->encode($data);
+
+ $save = \array_merge($data_model, $newData);
+
+ if (!empty($save)) {
+ if (empty($save['id'])) {
+ // Insert.
+ $result = \db_process_sql_insert('tlayout_data', $save);
+ } else {
+ // Update.
+ $result = \db_process_sql_update('tlayout_data', $save, ['id' => $save['id']]);
+ }
+ }
+
+ // Update the model.
+ if ($result) {
+ if (empty($save['id'])) {
+ $item = static::fromDB(['id' => $result]);
+ } else {
+ $item = static::fromDB(['id' => $save['id']]);
+ }
+
+ if (!empty($item)) {
+ $this->setData($item->toArray());
+ }
+ }
+
+ return (bool) $result;
+ }
+
+
}
diff --git a/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php b/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php
index a9c16d0866..a804e29b02 100644
--- a/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php
+++ b/pandora_console/include/rest-api/models/VisualConsole/Items/ModuleGraph.php
@@ -211,13 +211,14 @@ final class ModuleGraph extends Item
$params = [
'period' => $period,
- 'width' => $data['width'],
+ 'width' => (int) $data['width'],
'height' => ($data['height'] - 30),
'title' => '',
'unit_name' => null,
'show_alerts' => false,
'only_image' => $imageOnly,
'vconsole' => true,
+ 'document_ready' => false,
'backgroundColor' => $backgroundType,
];
@@ -244,7 +245,7 @@ final class ModuleGraph extends Item
'agent_module_id' => $moduleId,
'period' => $period,
'show_events' => false,
- 'width' => $data['width'],
+ 'width' => (int) $data['width'],
'height' => ($data['height'] - 30),
'title' => \modules_get_agentmodule_name($moduleId),
'unit' => \modules_get_unit($moduleId),
@@ -253,6 +254,7 @@ final class ModuleGraph extends Item
'backgroundColor' => $backgroundType,
'type_graph' => $graphType,
'vconsole' => true,
+ 'document_ready' => false,
];
$data['html'] = \grafico_modulo_sparse($params);
diff --git a/pandora_console/include/styles/agent_manager.css b/pandora_console/include/styles/agent_manager.css
index a5e80a64ee..8b3e0db4f7 100644
--- a/pandora_console/include/styles/agent_manager.css
+++ b/pandora_console/include/styles/agent_manager.css
@@ -119,8 +119,8 @@ a#qr_code_agent_view {
border-bottom-right-radius: 0px;
}
-.adv_right,
-.adv_left,
+.agent_av_opt_right,
+.agent_av_opt_left,
.secondary_groups_list {
flex: 1;
}
@@ -150,8 +150,8 @@ a#qr_code_agent_view {
margin: 1em;
}
-.adv_left input,
-.adv_left select {
+.agent_av_opt_left input,
+.agent_av_opt_left select {
width: 100%;
}
diff --git a/pandora_console/include/styles/credential_store.css b/pandora_console/include/styles/credential_store.css
new file mode 100644
index 0000000000..aa77985188
--- /dev/null
+++ b/pandora_console/include/styles/credential_store.css
@@ -0,0 +1,12 @@
+#info_key .flex-row,
+#new_key .flex-row {
+ margin: 1em auto;
+ max-width: 80%;
+}
+
+#info_key input,
+#info_key select,
+#new_key input,
+#new_key select {
+ width: 60%;
+}
diff --git a/pandora_console/include/styles/discovery-hint.css b/pandora_console/include/styles/discovery-hint.css
new file mode 100644
index 0000000000..8247b26c96
--- /dev/null
+++ b/pandora_console/include/styles/discovery-hint.css
@@ -0,0 +1,10 @@
+/*
+ * Discovery show help css
+ */
+li.discovery:not(:first-child) > a:hover {
+ color: #000;
+}
+
+li.discovery:not(:first-child) div.data_container:not(:hover) {
+ box-shadow: 2px 2px 10px #80ba27;
+}
diff --git a/pandora_console/include/styles/discovery.css b/pandora_console/include/styles/discovery.css
index b8da30aede..82b022050f 100644
--- a/pandora_console/include/styles/discovery.css
+++ b/pandora_console/include/styles/discovery.css
@@ -2,6 +2,10 @@
* Discovery css global
*/
+ul.bigbuttonlist {
+ min-height: 200px;
+}
+
li.discovery {
display: inline-block;
float: left;
@@ -261,3 +265,8 @@ a.tip {
.discovery_interval_select_width {
width: 90%;
}
+
+a.ext_link {
+ margin-left: 1em;
+ font-size: 8pt;
+}
diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css
index ff0d8ba9ac..fa1aac2e66 100644
--- a/pandora_console/include/styles/events.css
+++ b/pandora_console/include/styles/events.css
@@ -96,14 +96,12 @@ table.dataTable tbody td {
}
.sorting_desc {
- background: url(http://localhost/pandora_console/images/sort_down_green.png)
- no-repeat;
+ background: url(../../images/sort_down_green.png) no-repeat;
background-position-x: left;
background-position-y: center;
}
.sorting_asc {
- background: url(http://localhost/pandora_console/images/sort_up_green.png)
- no-repeat;
+ background: url(../../images/sort_up_green.png) no-repeat;
background-position-x: left;
background-position-y: center;
}
diff --git a/pandora_console/include/styles/firts_task.css b/pandora_console/include/styles/firts_task.css
index c3650d2a8e..be75dd632d 100755
--- a/pandora_console/include/styles/firts_task.css
+++ b/pandora_console/include/styles/firts_task.css
@@ -78,3 +78,7 @@ div.new_task_cluster > div {
#fuerte {
font-size: 12px;
}
+
+.flex-row-baseline * {
+ margin-right: 1em;
+}
diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css
index aaefa3cdce..35fb445970 100644
--- a/pandora_console/include/styles/js/jquery-ui_custom.css
+++ b/pandora_console/include/styles/js/jquery-ui_custom.css
@@ -15,9 +15,11 @@
margin: 0;
display: inherit;
text-align: center;
- padding: 0.4em 0em;
+ padding: 0.4em 33px 0.4em 12px;
height: 30px;
position: relative;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
/*center ui dialog center*/
diff --git a/pandora_console/include/styles/login.css b/pandora_console/include/styles/login.css
index 68fbb52122..8edd7d46c0 100644
--- a/pandora_console/include/styles/login.css
+++ b/pandora_console/include/styles/login.css
@@ -406,6 +406,8 @@ div.form_message_alert ul li input {
}
div.form_message_alert ul li label {
+ display: inline-block;
+ width: 145px;
font-size: 10pt;
padding-right: 20px;
}
diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css
index 06507058ee..679e01e0f4 100644
--- a/pandora_console/include/styles/pandora.css
+++ b/pandora_console/include/styles/pandora.css
@@ -502,6 +502,13 @@ select:-internal-list-box {
.no-text-imp {
font-size: 0 !important;
}
+.flex-content-right {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: flex-end;
+ align-content: flex-end;
+}
.flex-column {
display: flex;
flex-direction: column;
@@ -517,6 +524,12 @@ select:-internal-list-box {
justify-content: space-between;
align-content: center;
}
+.flex-row-baseline {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: baseline;
+}
.nowrap {
flex-wrap: nowrap;
@@ -1158,7 +1171,6 @@ div.title_line {
#menu_tab {
margin-right: 10px;
- min-width: 510px;
}
#menu_tab .mn,
@@ -3539,31 +3551,6 @@ div.div_groups_status {
}
*/
-/*
- * ---------------------------------------------------------------------
- * - VISUAL MAPS -
- * ---------------------------------------------------------------------
- */
-div#vc-controls {
- position: fixed;
- top: 30px;
- right: 20px;
-}
-
-div#vc-controls div.vc-title,
-div#vc-controls div.vc-refr {
- margin-top: 6px;
- margin-left: 3px;
- margin-right: 3px;
-}
-div#vc-controls div.vc-refr > div {
- display: inline;
-}
-div#vc-controls img.vc-qr {
- margin-top: 6px;
- margin-left: 8px;
- margin-right: 8px;
-}
div.simple_value > span.text > p,
div.simple_value > span.text > p > span > strong,
div.simple_value > span.text > p > strong,
@@ -5803,3 +5790,32 @@ div#status_pie {
align-items: center;
grid-template-columns: 50px auto;
}
+
+/* Table for show more info in events and config menu in modules graphs. (This class exists in events.css too) */
+.table_modal_alternate {
+ border-spacing: 0px;
+ text-align: left;
+}
+
+table.table_modal_alternate tr:nth-child(odd) td {
+ background-color: #ffffff;
+}
+
+table.table_modal_alternate tr:nth-child(even) td {
+ background-color: #f9f9f9;
+ border-top: 1px solid #e0e0e0;
+ border-bottom: 1px solid #e0e0e0;
+}
+
+table.table_modal_alternate tr td {
+ height: 33px;
+ max-height: 33px;
+ min-height: 33px;
+}
+
+table.table_modal_alternate tr td:first-child {
+ width: 35%;
+ font-weight: bold;
+ padding-left: 20px;
+}
+/* END - Table for show more info in events and config menu in modules graphs */
diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css
index 3d2f63098c..c3e1deb94c 100644
--- a/pandora_console/include/styles/tables.css
+++ b/pandora_console/include/styles/tables.css
@@ -190,7 +190,8 @@
}
.info_table > tbody > tr:hover {
- background-color: #eee;
+ /* This !important is necessary to overwrite the white background of tables with less than 5 rows. */
+ background-color: #eee !important;
}
.info_.profile_list > thead > tr > th > a.tip {
@@ -312,3 +313,31 @@ a.pandora_pagination.current:hover {
border-color: #b6b6b6;
cursor: default;
}
+
+/* Default datatable filter style */
+.datatable_filter.content {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+}
+.datatable_filter.content label {
+ margin-right: 1em;
+}
+.datatable_filter.content li {
+ flex: 1 1 auto;
+ margin: 1em auto;
+}
+.sorting_desc {
+ background: url(../../images/sort_down_green.png) no-repeat;
+ background-position-x: left;
+ background-position-y: center;
+ cursor: pointer;
+}
+.sorting_asc {
+ background: url(../../images/sort_up_green.png) no-repeat;
+ background-position-x: left;
+ background-position-y: center;
+ cursor: pointer;
+}
diff --git a/pandora_console/include/styles/visual_maps.css b/pandora_console/include/styles/visual_maps.css
index 6e09ffcaf0..ee2e6dc49b 100644
--- a/pandora_console/include/styles/visual_maps.css
+++ b/pandora_console/include/styles/visual_maps.css
@@ -3,6 +3,37 @@
* - VISUAL MAPS -
* ---------------------------------------------------------------------
*/
+
+div#vc-controls {
+ position: fixed;
+ top: 30px;
+ right: 20px;
+}
+
+div#vc-controls div.vc-title,
+div#vc-controls div.vc-refr {
+ margin-top: 15px;
+ margin-left: 3px;
+ margin-right: 3px;
+}
+div#vc-controls div.vc-refr > div {
+ display: inline;
+}
+div#vc-controls img.vc-qr {
+ margin-top: 12px;
+ margin-left: 8px;
+ margin-right: 8px;
+}
+
+.visual-console-edit-controls {
+ display: flex;
+ justify-content: flex-end;
+}
+
+.visual-console-edit-controls > span {
+ margin: 4px;
+}
+
input.vs_button_ghost {
background-color: transparent;
border: 1px solid #82b92e;
diff --git a/pandora_console/include/visual-console-client/vc.main.css b/pandora_console/include/visual-console-client/vc.main.css
index 3798cfd8c4..16ecacd33c 100644
--- a/pandora_console/include/visual-console-client/vc.main.css
+++ b/pandora_console/include/visual-console-client/vc.main.css
@@ -13,22 +13,38 @@
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;
}
.visual-console-item.is-editing {
- border: 2px dashed #33ccff;
+ border: 2px dashed #b2b2b2;
-webkit-transform: translateX(-2px) translateY(-2px);
- transform: translateX(-2px) translateY(-2px);
+ transform: translateX(-2px) translateY(-2px);
+ cursor: move;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.visual-console-item.is-editing > .resize-draggable {
+ float: right;
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ width: 15px;
+ height: 15px;
+ background: url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJDYXBhXzEiIAoJeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiAKCXhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjE1cHgiIGhlaWdodD0iMTVweCIgdmlld0JveD0iMCAwIDE1IDE1IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxNSAxNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Cgk8bGluZSBmaWxsPSJub25lIiBzdHJva2U9IiNCMkIyQjIiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHgxPSIwLjU2MiIgeTE9IjM2LjMxNyIgeDI9IjE0LjIzMSIgeTI9IjIyLjY0OCIvPgoJPGxpbmUgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQjJCMkIyIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiB4MT0iNC45NzEiIHkxPSIzNi41OTUiIHgyPSIxNC40MDkiIHkyPSIyNy4xNTUiLz4KCTxsaW5lIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0IyQjJCMiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgeDE9IjEwLjAxNyIgeTE9IjM2LjQzMyIgeDI9IjE0LjIzMSIgeTI9IjMyLjIxOCIvPgoJPGcgaWQ9ImpHRWVLbl8xXyI+CgoJCTxpbWFnZSBvdmVyZmxvdz0idmlzaWJsZSIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjM3IiBpZD0iakdFZUtuIiB4bGluazpocmVmPSJkYXRhOmltYWdlL2pwZWc7YmFzZTY0LC85ai80QUFRU2taSlJnQUJBZ0VBU0FCSUFBRC83QUFSUkhWamEza0FBUUFFQUFBQUhnQUEvKzRBSVVGa2IySmxBR1RBQUFBQUFRTUEKRUFNQ0F3WUFBQUdSQUFBQnN3QUFBZ0wvMndDRUFCQUxDd3NNQ3hBTURCQVhEdzBQRnhzVUVCQVVHeDhYRnhjWEZ4OGVGeG9hR2hvWApIaDRqSlNjbEl4NHZMek16THk5QVFFQkFRRUJBUUVCQVFFQkFRRUFCRVE4UEVSTVJGUklTRlJRUkZCRVVHaFFXRmhRYUpob2FIQm9hCkpqQWpIaDRlSGlNd0t5NG5KeWN1S3pVMU1EQTFOVUJBUDBCQVFFQkFRRUJBUUVCQVFQL0NBQkVJQUNZQUx3TUJJZ0FDRVFFREVRSC8KeEFCNUFBRUJBUUVCQUFBQUFBQUFBQUFBQUFBQUFRUUNCZ0VCQUFBQUFBQUFBQUFBQUFBQUFBQUFBQkFBQVFRREFBQUFBQUFBQUFBQQpBQUFBQVFBeEFnTVFNQklSQUFFQkJnVUZBUUFBQUFBQUFBQUFBQUVDQUJFaFFXRURFQ0J4a1JJd01ZRXlFd1FTQVFBQUFBQUFBQUFBCkFBQUFBQUFBQURELzJnQU1Bd0VBQWhFREVRQUFBUGZBUzV6VFpUa0dQclVMWlFBQUQvL2FBQWdCQWdBQkJRRFQvOW9BQ0FFREFBRUYKQU5QLzJnQUlBUUVBQVFVQXpKZzJTUUJDMmQwdzJiWlN2Vk5jNW9NdUF1UXVBdVJwLzlvQUNBRUNBZ1kvQUIvLzJnQUlBUU1DQmo4QQpILy9hQUFnQkFRRUdQd0RFNlpYbUFZcXR3c0pCSEk5MUdsTXFudlQrZTM3UUwxa1MwYjdYQndBRHJWb1FDUlhHZTVhZTVhZTVhZms5CkgvL1oiIHRyYW5zZm9ybT0ibWF0cml4KDEgMCAwIDEgLTQ2Ljg3NSAtOS44OTA2KSI+CgkJPC9pbWFnZT4KCTwvZz4KCTxsaW5lIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0IyQjJCMiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgeDE9IjEzLjQ4MyIgeTE9IjAuNjQ0IiB4Mj0iMC44MjgiIHkyPSIxMy4zMDEiLz4KCTxsaW5lIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0IyQjJCMiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgeDE9IjEzLjczNCIgeTE9IjUuMTQxIiB4Mj0iNS4zMjUiIHkyPSIxMy41NDkiLz4KCTxsaW5lIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0IyQjJCMiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgeDE9IjE0LjIzMSIgeTE9IjkuMzg4IiB4Mj0iOS44MDYiIHkyPSIxMy44MTMiLz4KPC9zdmc+Cg==);
+ cursor: se-resize;
}
@font-face {
@@ -44,17 +60,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 {
@@ -84,17 +100,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 0c9d921370..d52e239f93 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,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;;AAEA;EACE,0BAA0B;EAC1B,oDAA4C;UAA5C,4CAA4C;AAC9C;;ACpBA;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\n.visual-console-item.is-editing {\n border: 2px dashed #33ccff;\n transform: translateX(-2px) translateY(-2px);\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
+{"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;;AAEA;EACE,0BAA0B;EAC1B,oDAA4C;UAA5C,4CAA4C;EAC5C,YAAY;EACZ,yBAAiB;KAAjB,sBAAiB;MAAjB,qBAAiB;UAAjB,iBAAiB;AACnB;;AAEA;EACE,YAAY;EACZ,kBAAkB;EAClB,QAAQ;EACR,SAAS;EACT,WAAW;EACX,YAAY;EACZ,yCAAoC;EACpC,iBAAiB;AACnB;;ACjCA;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\n.visual-console-item.is-editing {\n border: 2px dashed #b2b2b2;\n transform: translateX(-2px) translateY(-2px);\n cursor: move;\n user-select: none;\n}\n\n.visual-console-item.is-editing > .resize-draggable {\n float: right;\n position: absolute;\n right: 0;\n bottom: 0;\n width: 15px;\n height: 15px;\n background: url(./resize-handle.svg);\n cursor: se-resize;\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 3c8d75097f..aa7de676c0 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,"j",function(){return r}),n.d(e,"i",function(){return s}),n.d(e,"o",function(){return o}),n.d(e,"g",function(){return a}),n.d(e,"h",function(){return c}),n.d(e,"k",function(){return u}),n.d(e,"n",function(){return h}),n.d(e,"f",function(){return p}),n.d(e,"e",function(){return _}),n.d(e,"d",function(){return f}),n.d(e,"l",function(){return d}),n.d(e,"a",function(){return y}),n.d(e,"b",function(){return m}),n.d(e,"c",function(){return b}),n.d(e,"m",function(){return g});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.m)([{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,this._metadata)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"meta",{get:function(){return s({},this._metadata)},set:function(t){var e=this._metadata;this._metadata=t,this.render(this.itemProps,e)},enumerable:!0,configurable:!0}),t.prototype.shouldBeUpdated=function(t,e){return t!==e},t.prototype.render=function(t,e){void 0===t&&(t=null),void 0===e&&(e=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 n=this.labelElementRef.innerHTML,i=this.createLabelDomElement().innerHTML;if(n!==i&&(this.labelElementRef.innerHTML=i),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 r=this.createContainerDomElement();r.innerHTML=this.elementRef.innerHTML;for(var s=this.elementRef.attributes,o=0;o0?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 g=document.createElementNS(t,"g");g.setAttribute("class","mark"),g.setAttribute("transform","translate(50 50)");var v=document.createElementNS(t,"line");v.setAttribute("x1","36"),v.setAttribute("y1","0"),v.setAttribute("x2","46"),v.setAttribute("y2","0"),v.setAttribute("stroke",i),v.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"),g.append(v,x),b.append(g);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 j=document.createElementNS(t,"line");j.setAttribute("class","minute-hand-a"),j.setAttribute("x1","0"),j.setAttribute("y1","0"),j.setAttribute("x2","40"),j.setAttribute("y2","0"),j.setAttribute("stroke",o),j.setAttribute("stroke-width","2"),j.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 P=document.createElementNS(t,"circle");P.setAttribute("r","3"),P.setAttribute("fill",s),k.append(j,M,P);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),P=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.m)([{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),g=b/m,v=b/y;Math.abs(g-1)>1e-6&&(this._+="L"+(t+g*l)+","+(e+g*u)),this._+="A"+r+","+r+",0,0,"+ +(u*p>l*_)+","+(this._x1=t+v*a)+","+(this._y1=e+v*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 gt(t){return t&&t.padAngle}function vt(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,g=d-_,v=b*b+g*g,x=r-s,E=p*d-f*_,O=(g<0?-1:1)*lt(ot(0,x*x*v-E*E)),w=(E*g-b*O)/v,T=(-E*b-g*O)/v,A=(E*g+b*O)/v,k=(-E*b+g*O)/v,j=w-y,M=T-m,P=A-y,S=k-m;return j*j+M*M>P*P+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=gt,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,g=_,v=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)),j=k,M=k;if(A>ut){var P=ft(A/h*ct(T)),S=ft(A/p*ct(T));(O-=2*P)>ut?(x+=P*=y?1:-1,E-=P):(O=0,x=E=(_+f)/2),(w-=2*S)>ut?(g+=S*=y?1:-1,v-=S):(w=0,g=v=(_+f)/2)}var I=p*st(g),N=p*ct(g),D=h*st(E),L=h*ct(E);if(k>ut){var R,C=p*st(v),B=p*ct(v),z=h*st(x),W=h*ct(x);if(d1?0:u<-1?ht:Math.acos(u))/2),F=lt(R[0]*R[0]+R[1]*R[1]);j=at(k,(h-F)/(q-1)),M=at(k,(p-F)/(q+1))}}w>ut?M>ut?(m=vt(z,W,I,N,p,M,y),b=vt(C,B,D,L,p,M,y),a.moveTo(m.cx+m.x01,m.cy+m.y01),Mut&&O>ut?j>ut?(m=vt(D,L,C,B,h,-j,y),b=vt(I,N,z,W,h,-j,y),a.lineTo(m.cx+m.x01,m.cy+m.y01),j0)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 Ft(t){this._context=t}function Vt(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.j)(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 V(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 j(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,s=t.props.y+(t.elementRef.clientHeight-t.labelElementRef.clientHeight)/2,o=e.props.x+e.elementRef.clientWidth/2,a=e.props.y+(e.elementRef.clientHeight-e.labelElementRef.clientHeight)/2,c=new B(R({id:0,type:13,startX:i,startY:s,endX:o,endY:a,width:0,height:0,lineWidth:this.props.relationLineWidth,color:"#CCCCCC"}),Object(r.d)({receivedAt:new Date}));return this.relations[n]=c,c.elementRef.style.zIndex="0",this.containerRef.append(c.elementRef),c},t.prototype.onClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.enableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!0})})},t.prototype.disableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!1})})},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}]);
+!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,"m",function(){return r}),n.d(e,"l",function(){return s}),n.d(e,"r",function(){return o}),n.d(e,"j",function(){return a}),n.d(e,"k",function(){return c}),n.d(e,"n",function(){return u}),n.d(e,"q",function(){return h}),n.d(e,"i",function(){return p}),n.d(e,"h",function(){return _}),n.d(e,"g",function(){return f}),n.d(e,"o",function(){return d}),n.d(e,"d",function(){return m}),n.d(e,"e",function(){return y}),n.d(e,"f",function(){return b}),n.d(e,"p",function(){return v}),n.d(e,"c",function(){return x}),n.d(e,"a",function(){return w}),n.d(e,"b",function(){return O});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&&id||y+r+m.width-b>u.width||r===x&&y<0&&i>f+x+c,A=h0&&h
_||g+s+m.height-b>u.height||s===E&&g<0&&h>p+E+l;(e=O?0:T?x:y+r)<0&&(e=0),(n=A?0:k?E:g+s)<0&&(n=0),o=i,a=h,e===r&&n===s||(w(e,n),v(e,n),r=e,s=n)},T=function(){r=0,s=0,o=0,a=0,document.removeEventListener("mousemove",O),document.removeEventListener("mouseup",T),t.draggable=i,document.body.style.userSelect="auto"},A=function(e){e.stopPropagation(),t.draggable=!1,r=t.offsetLeft,s=t.offsetTop,o=e.pageX,a=e.pageY,c=e.offsetX,l=e.offsetY,u=n.getBoundingClientRect(),h=E(n),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=t.getBoundingClientRect(),y=window.getComputedStyle(t).borderWidth||"0",b=2*Number.parseInt(y),document.addEventListener("mousemove",O),document.addEventListener("mouseup",T),document.body.style.userSelect="none"};return t.addEventListener("mousedown",A),function(){t.removeEventListener("mousedown",A),T()}}function O(t,e){var n=document.createElement("div");n.className="resize-draggable",t.appendChild(n);var i=t.parentElement,r=t.draggable,s=0,o=0,a=0,c=0,l=0,u=i.getBoundingClientRect(),h=E(i),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=E(t),y=m.top,b=m.left,v=window.getComputedStyle(t).borderWidth||"0",w=Number.parseInt(v),O=x(32,function(t,n){return e(t,n)}),T=g(16,function(t,n){return e(t,n)}),A=function(t){var e=s+(t.pageX-a),n=o+(t.pageY-c);e===s&&n===o||eb+(s-l)||(e<15?e=15:e+b-w/2>=d&&(e=d-b),n<15?n=15:n+y-w/2>=_&&(n=_-y),T(e,n),O(e,n),s=e,o=n,a=t.pageX,c=t.pageY)},k=function(){s=0,o=0,a=0,c=0,l=0,0,document.removeEventListener("mousemove",A),document.removeEventListener("mouseup",k),t.draggable=r,document.body.style.userSelect="auto"};return n.addEventListener("mousedown",function(e){e.stopPropagation(),t.draggable=!1;var n=t.getBoundingClientRect(),r=n.width,v=n.height;s=r,o=v,a=e.pageX,c=e.pageY,l=e.offsetX,e.offsetY,u=i.getBoundingClientRect(),h=E(i),p=h.top,_=p+u.height,f=h.left,d=f+u.width,m=E(t),y=m.top,b=m.left,document.addEventListener("mousemove",A),document.addEventListener("mouseup",k),document.body.style.userSelect="none"}),function(){n.remove(),k()}}},function(t,e,n){"use strict";n.d(e,"b",function(){return a});var i=n(0),r=n(2),s=function(){return(s=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0){var i=e.labelElementRef.getBoundingClientRect(),r=i.width,s=i.height;switch(e.props.labelPosition){case"up":case"down":n-=s;break;case"left":case"right":t-=r}}e.resizeElement(t,n),e.debouncedResizementSave(t,n)})},t.prototype.stopResizementListener=function(){this.removeResizement&&(this.removeResizement(),this.removeResizement=null)},t.prototype.createContainerDomElement=function(){var t,e=this;return this.props.isLinkEnabled?(t=document.createElement("a"),this.props.link&&(t.href=this.props.link)):t=document.createElement("div"),t.className="visual-console-item",t.style.zIndex=this.props.isOnTop?"2":"1",t.style.left=this.props.x+"px",t.style.top=this.props.y+"px",t.addEventListener("click",function(t){e.meta.editMode?(t.preventDefault(),t.stopPropagation()):e.clickEventManager.emit({data:e.props,nativeEvent:t})}),this.meta.editMode&&(t.classList.add("is-editing"),this.initMovementListener(t),this.initResizementListener(t)),this.meta.isFetching&&t.classList.add("is-fetching"),this.meta.isUpdating&&t.classList.add("is-updating"),t},t.prototype.createLabelDomElement=function(){var t=document.createElement("div");t.className="visual-console-item-label";var e=this.getLabelWithMacrosReplaced();if(e.length>0){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.p)([{macro:"_date_",value:Object(i.e)(new Date)},{macro:"_time_",value:Object(i.f)(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,this._metadata)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"meta",{get:function(){return s({},this._metadata)},set:function(t){this.setMeta(t)},enumerable:!0,configurable:!0}),t.prototype.setMeta=function(t){var e=this._metadata;this._metadata=t,this.render(this.itemProps,e)},t.prototype.shouldBeUpdated=function(t,e){return t!==e},t.prototype.render=function(t,e){void 0===t&&(t=null),void 0===e&&(e=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 n=this.labelElementRef.innerHTML,i=this.createLabelDomElement().innerHTML;if(n!==i&&(this.labelElementRef.innerHTML=i),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 r=this.createContainerDomElement();r.innerHTML=this.elementRef.innerHTML;for(var s=this.elementRef.attributes,o=0;o0?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){if(this.childElementRef.style.width=t>0?t+"px":null,this.childElementRef.style.height=e>0?e+"px":null,this.props.label&&this.props.label.length>0){var n=this.labelElementRef.getElementsByTagName("table"),i=n.length>0?n.item(0):null;if(i)switch(this.props.labelPosition){case"up":case"down":i.style.width=t>0?t+"px":null;break;case"left":case"right":i.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.onMoved=function(t){var e=this.movedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onResized=function(t){var e=this.resizedEventManager.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 y=document.createElementNS(t,"text");y.setAttribute("text-anchor","middle"),y.setAttribute("font-size","8"),y.setAttribute("transform","translate(30 50) rotate(90)"),y.setAttribute("fill",i),y.textContent=m,f.append(y)}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 w=document.createElementNS(t,"line");w.setAttribute("y1","0"),w.setAttribute("y2","0"),w.setAttribute("stroke",i),w.setAttribute("transform","translate(50 50) rotate("+6*E+")"),E%5==0?(w.setAttribute("x1","38"),w.setAttribute("x2","46"),w.setAttribute("stroke-width",E%15==0?"2":"1")):(w.setAttribute("x1","42"),w.setAttribute("x2","46"),w.setAttribute("stroke-width","0.5")),b.append(w)}var O=document.createElementNS(t,"g");O.setAttribute("class","hour-hand"),O.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"),O.append(T,A);var k=document.createElementNS(t,"g");k.setAttribute("class","minute-hand"),k.setAttribute("transform","translate(50 50)");var M=document.createElementNS(t,"line");M.setAttribute("class","minute-hand-a"),M.setAttribute("x1","0"),M.setAttribute("y1","0"),M.setAttribute("x2","40"),M.setAttribute("y2","0"),M.setAttribute("stroke",o),M.setAttribute("stroke-width","2"),M.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 P=document.createElementNS(t,"circle");P.setAttribute("r","3"),P.setAttribute("fill",s),k.append(M,j,P);var S=document.createElementNS(t,"g");S.setAttribute("class","second-hand"),S.setAttribute("transform","translate(50 50)");var L=document.createElementNS(t,"line");L.setAttribute("x1","0"),L.setAttribute("y1","0"),L.setAttribute("x2","46"),L.setAttribute("y2","0"),L.setAttribute("stroke",a),L.setAttribute("stroke-width","1"),L.setAttribute("stroke-linecap","round");var R=document.createElementNS(t,"circle");R.setAttribute("r","2"),R.setAttribute("fill",a),S.append(L,R);var N=document.createElementNS(t,"circle");N.setAttribute("cx","50"),N.setAttribute("cy","50"),N.setAttribute("r","0.3"),N.setAttribute("fill",s);var I=this.getOriginDate(),D=I.getSeconds(),C=I.getMinutes(),z=6*D,B=6*C+D/60*6,W=30*I.getHours()+C/60*30;if(O.setAttribute("transform","translate(50 50) rotate("+W+")"),k.setAttribute("transform","translate(50 50) rotate("+B+")"),S.setAttribute("transform","translate(50 50) rotate("+z+")"),_.append(f,b,O,k,S,N),_.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.e)(I,"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.e)(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.f)(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),P=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),N=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)}}(),I=function(){return(I=Object.assign||function(t){for(var e,n=1,i=arguments.length;n0&&(n=Object(r.p)([{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),Y=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+_*_,m=Math.sqrt(f),y=Math.sqrt(h),b=r*Math.tan((Z-Math.acos((f+h-d)/(2*m*y)))/2),v=b/y,g=b/m;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 mt(t){return t.outerRadius}function yt(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,m=(p+f)/2,y=(_+d)/2,b=f-p,v=d-_,g=b*b+v*v,x=r-s,E=p*d-f*_,w=(v<0?-1:1)*lt(ot(0,x*x*g-E*E)),O=(E*v-b*w)/g,T=(-E*b-v*w)/g,A=(E*v+b*w)/g,k=(-E*b+v*w)/g,M=O-m,j=T-y,P=A-m,S=k-y;return M*M+j*j>P*P+S*S&&(O=A,T=k),{cx:O,cy:T,x01:-u,y01:-h,x11:O*(r/x-1),y11:T*(r/x-1)}}var xt=function(){var t=dt,e=mt,n=nt(0),i=null,r=yt,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-_),m=f>_;if(a||(a=c=et()),put)if(d>_t-ut)a.moveTo(p*st(_),p*ct(_)),a.arc(0,0,p,_,f,!m),h>ut&&(a.moveTo(h*st(f),h*ct(f)),a.arc(0,0,h,f,_,m));else{var y,b,v=_,g=f,x=_,E=f,w=d,O=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)),M=k,j=k;if(A>ut){var P=ft(A/h*ct(T)),S=ft(A/p*ct(T));(w-=2*P)>ut?(x+=P*=m?1:-1,E-=P):(w=0,x=E=(_+f)/2),(O-=2*S)>ut?(v+=S*=m?1:-1,g-=S):(O=0,v=g=(_+f)/2)}var L=p*st(v),R=p*ct(v),N=h*st(E),I=h*ct(E);if(k>ut){var D,C=p*st(g),z=p*ct(g),B=h*st(x),W=h*ct(x);if(d1?0:u<-1?ht:Math.acos(u))/2),F=lt(D[0]*D[0]+D[1]*D[1]);M=at(k,(h-F)/(q-1)),j=at(k,(p-F)/(q+1))}}O>ut?j>ut?(y=gt(B,W,L,R,p,j,m),b=gt(C,z,N,I,p,j,m),a.moveTo(y.cx+y.x01,y.cy+y.y01),jut&&w>ut?M>ut?(y=gt(N,I,C,z,h,-M,m),b=gt(L,R,B,W,h,-M,m),a.lineTo(y.cx+y.x01,y.cy+y.y01),M0)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 Lt(t,e)}return n.beta=function(e){return t(+e)},n})(.85);function Rt(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 Nt(t,e){this._context=t,this._k=(1-e)/6}Nt.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:Rt(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:Rt(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 Nt(t,e)}return n.tension=function(e){return t(+e)},n})(0);function It(t,e){this._context=t,this._k=(1-e)/6}It.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:Rt(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 It(t,e)}return n.tension=function(e){return t(+e)},n})(0);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(){(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:Rt(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 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 zt(t,e){this._context=t,this._alpha=e}zt.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 zt(t,e):new Nt(t,0)}return n.alpha=function(e){return t(+e)},n})(.5);function Bt(t,e){this._context=t,this._alpha=e}Bt.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 Bt(t,e):new It(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 Dt(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 Ft(t){this._context=t}function Vt(t){this._context=new Xt(t)}function Xt(t){this._context=t}function Yt(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.onMoved(i.handleElementMovement),e.onResized(i.handleElementResizement),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.m)(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 V(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 L(t);case 13:return D(t);case 14:return Object(Y.b)(t);case 17:return Object(oe.b)(t);case 18:return Object(ae.a)(t);case 19:return M(t);case 20:return y(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,s=t.props.y+(t.elementRef.clientHeight-t.labelElementRef.clientHeight)/2,o=e.props.x+e.elementRef.clientWidth/2,a=e.props.y+(e.elementRef.clientHeight-e.labelElementRef.clientHeight)/2,c=new z(D({id:0,type:13,startX:i,startY:s,endX:o,endY:a,width:0,height:0,lineWidth:this.props.relationLineWidth,color:"#CCCCCC"}),Object(r.g)({receivedAt:new Date}));return this.relations[n]=c,c.elementRef.style.zIndex="0",this.containerRef.append(c.elementRef),c},t.prototype.onItemClick=function(t){var e=this.clickEventManager.on(t);return this.disposables.push(e),e},t.prototype.onItemMoved=function(t){var e=this.movedEventManager.on(t);return this.disposables.push(e),e},t.prototype.onItemResized=function(t){var e=this.resizedEventManager.on(t);return this.disposables.push(e),e},t.prototype.enableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!0})}),this.containerRef.classList.add("is-editing")},t.prototype.disableEditMode=function(){this.elements.forEach(function(t){t.meta=_e({},t.meta,{editMode:!1})}),this.containerRef.classList.remove("is-editing")},t}(),me=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 ye=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 me(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 me(e),n):new me(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=ye}]);
//# 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 4c7ba46882..b39960805d 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/index.ts","webpack:///./src/Item.ts","webpack:///./src/lib/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","itemMetaDecoder","receivedAt","Date","Number","getTime","error","Error","editMode","isFromCache","isFetching","isUpdating","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","metadata","this","clickEventManager","_lib_TypedEvent__WEBPACK_IMPORTED_MODULE_1__","removeEventManager","disposables","itemProps","_metadata","elementRef","createContainerDomElement","labelElementRef","createLabelDomElement","childElementRef","createDomElement","append","resizeElement","changeLabelPosition","box","_this","document","createElement","href","className","style","zIndex","left","top","addEventListener","e","meta","preventDefault","stopPropagation","emit","nativeEvent","element","getLabelWithMacrosReplaced","table","row","emptyRow1","emptyRow2","cell","innerHTML","textAlign","updateDomElement","newProps","prevProps","shouldBeUpdated","render","newMetadata","prevMetadata","prevMeta","positionChanged","moveElement","sizeChanged","oldLabelHtml","newLabelHtml","container","attrs","attributes","nodeName","setAttributeNode","parentNode","replaceChild","classList","add","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","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","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","console","log","message","buildRelations","map","updateElements","itemIds","decodeProps","backgroundImage","elements","parent_1","child","addRelationLine","itemId","ids","childId","getRelationLine","identifier","parent","clientWidth","clientHeight","enableEditMode","disableEditMode","AsyncTaskManager_AsyncTask","AsyncTask","taskInitiator","cancellable","cancel","_status","statusChangeEventManager","status","init","onStatusChange","AsyncTaskManager","tasks","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 AnyObject,\n Position,\n Size,\n WithAgentProps,\n WithModuleProps,\n LinkedVisualConsoleProps,\n LinkedVisualConsolePropsStatus,\n UnknownObject,\n ItemMeta\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 * Return a valid date or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid date.\n * @param defaultValue Default value to use if we cannot extract a valid date.\n * @return A valid date or the default value.\n */\nexport function parseDateOr(value: unknown, defaultValue: T): Date | T {\n if (value instanceof Date) return value;\n else if (typeof value === \"number\") return new Date(value * 1000);\n else if (\n typeof value === \"string\" &&\n !Number.isNaN(new Date(value).getTime())\n )\n return new Date(value);\n else return defaultValue;\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: AnyObject): 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: AnyObject): 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: AnyObject): 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: AnyObject): 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: AnyObject\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 * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the item's meta properties.\n */\nexport function itemMetaDecoder(data: UnknownObject): ItemMeta | never {\n const receivedAt = parseDateOr(data.receivedAt, null);\n if (receivedAt === null) throw new TypeError(\"invalid meta structure\");\n\n let error = null;\n if (data.error instanceof Error) error = data.error;\n else if (typeof data.error === \"string\") error = new Error(data.error);\n\n return {\n receivedAt,\n error,\n editMode: parseBoolean(data.editMode),\n isFromCache: parseBoolean(data.isFromCache),\n isFetching: false,\n isUpdating: false\n };\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 {\n Position,\n Size,\n AnyObject,\n WithModuleProps,\n ItemMeta\n} from \"./lib/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 \"./lib/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: AnyObject;\n nativeEvent: Event;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemRemoveEvent {\n // data: Props;\n data: AnyObject;\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: AnyObject): 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 // Metadata of the item.\n private _metadata: ItemMeta;\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, metadata: ItemMeta) {\n this.itemProps = props;\n this._metadata = metadata;\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.addEventListener(\"click\", e => {\n if (this.meta.editMode) {\n e.preventDefault();\n e.stopPropagation();\n } else {\n this.clickEventManager.emit({ data: this.props, nativeEvent: e });\n }\n });\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))\n this.render(prevProps, this._metadata);\n }\n\n /**\n * Public accessor of the `meta` property.\n * @return Properties.\n */\n public get meta(): ItemMeta {\n return { ...this._metadata }; // Return a copy.\n }\n\n /**\n * Public setter of the `meta` property.\n * If the new meta are different enough than the\n * stored meta, a render would be fired.\n * @param newProps\n */\n public set meta(newMetadata: ItemMeta) {\n const prevMetadata = this._metadata;\n // Update the internal meta.\n this._metadata = newMetadata;\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(prevMetadata, newMetadata))\n this.render(this.itemProps, prevMetadata);\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(\n prevProps: Props | null = null,\n prevMeta: ItemMeta | null = null\n ): 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 // Change metadata related things.\n if (!prevMeta || prevMeta.editMode !== this.meta.editMode) {\n if (this.meta.editMode) {\n this.elementRef.classList.add(\"is-editing\");\n } else {\n this.elementRef.classList.remove(\"is-editing\");\n }\n }\n if (!prevMeta || prevMeta.isFetching !== this.meta.isFetching) {\n if (this.meta.isFetching) {\n this.elementRef.classList.add(\"is-fetching\");\n } else {\n this.elementRef.classList.remove(\"is-fetching\");\n }\n }\n if (!prevMeta || prevMeta.isUpdating !== this.meta.isUpdating) {\n if (this.meta.isUpdating) {\n this.elementRef.classList.add(\"is-updating\");\n } else {\n this.elementRef.classList.remove(\"is-updating\");\n }\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 { AnyObject, WithModuleProps } from \"../lib/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: AnyObject\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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 { AnyObject, WithModuleProps } from \"../lib/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(data: AnyObject): 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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 AnyObject\n} from \"../lib/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: AnyObject\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, AnyObject } from \"../lib/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: AnyObject): 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 AnyObject\n} from \"../lib/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: AnyObject\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, AnyObject } from \"../lib/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: AnyObject): 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: AnyObject): 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 {\n LinkedVisualConsoleProps,\n AnyObject,\n Size,\n ItemMeta\n} from \"../../lib/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: AnyObject): 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, meta: ItemMeta) {\n // Call the superclass constructor.\n super(props, meta);\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 { AnyObject } from \"../lib/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: AnyObject): 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 { AnyObject, Position, Size, ItemMeta } from \"../lib/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: AnyObject): 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, meta: ItemMeta) {\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 {\n ...props,\n ...Line.extractBoxSizeAndPosition(props)\n },\n meta\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, AnyObject } from \"../lib/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: AnyObject): 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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 { AnyObject } from \"../lib/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: AnyObject): 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 { AnyObject, Size } from \"./lib/types\";\nimport {\n parseBoolean,\n sizePropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n itemMetaDecoder\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 \"./lib/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: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n const meta = itemMetaDecoder(data);\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return new StaticGraph(staticGraphPropsDecoder(data), meta);\n case ItemType.MODULE_GRAPH:\n return new ModuleGraph(moduleGraphPropsDecoder(data), meta);\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), meta);\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), meta);\n case ItemType.LABEL:\n return new Label(labelPropsDecoder(data), meta);\n case ItemType.ICON:\n return new Icon(iconPropsDecoder(data), meta);\n case ItemType.SERVICE:\n return new Service(servicePropsDecoder(data), meta);\n case ItemType.GROUP_ITEM:\n return new Group(groupPropsDecoder(data), meta);\n case ItemType.BOX_ITEM:\n return new Box(boxPropsDecoder(data), meta);\n case ItemType.LINE_ITEM:\n return new Line(linePropsDecoder(data), meta);\n case ItemType.AUTO_SLA_GRAPH:\n return new EventsHistory(eventsHistoryPropsDecoder(data), meta);\n case ItemType.DONUT_GRAPH:\n return new DonutGraph(donutGraphPropsDecoder(data), meta);\n case ItemType.BARS_GRAPH:\n return new BarsGraph(barsGraphPropsDecoder(data), meta);\n case ItemType.CLOCK:\n return new Clock(clockPropsDecoder(data), meta);\n case ItemType.COLOR_CLOUD:\n return new ColorCloud(colorCloudPropsDecoder(data), meta);\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: AnyObject) {\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: AnyObject\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: AnyObject,\n items: AnyObject[]\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: AnyObject[]): void {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n const itemIds = items\n .map(item => item.id || null)\n .filter(id => id != null) as number[];\n // Get the elements we should delete.\n const deletedIds = this.elementIds.filter(id => itemIds.indexOf(id) < 0);\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 itemMetaDecoder({\n receivedAt: new Date()\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 * Enable the edition mode.\n */\n public enableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: true };\n });\n }\n\n /**\n * Disable the edition mode.\n */\n public disableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: false };\n });\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
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/lib/index.ts","webpack:///./src/Item.ts","webpack:///./src/lib/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","itemMetaDecoder","receivedAt","Date","Number","getTime","error","Error","editMode","isFromCache","isFetching","isUpdating","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","throttle","delay","fn","last","args","_i","arguments","now","apply","debounce","timerRef","clearTimeout","setTimeout","getOffset","el","offsetLeft","offsetTop","scrollLeft","scrollTop","offsetParent","top","left","addMovementListener","element","onMoved","container","parentElement","isDraggable","draggable","lastX","lastY","lastMouseX","lastMouseY","mouseElementOffsetX","mouseElementOffsetY","containerBounds","getBoundingClientRect","containerOffset","containerTop","containerBottom","containerLeft","containerRight","elementBounds","borderWidth","getComputedStyle","borderFix","debouncedMovement","throttledMovement","handleMove","e","mouseX","pageX","mouseY","pageY","mouseDeltaX","mouseDeltaY","maxX","maxY","outOfBoundsLeft","outOfBoundsRight","outOfBoundsTop","outOfBoundsBottom","handleEnd","document","removeEventListener","body","style","userSelect","handleStart","stopPropagation","offsetX","offsetY","addEventListener","addResizementListener","onResized","resizeDraggable","createElement","className","appendChild","lastWidth","lastHeight","elementOffset","elementTop","elementLeft","debouncedResizement","throttledResizement","handleResize","remove","parseLabelPosition","labelPosition","itemBasePropsDecoder","type","label","_lib__WEBPACK_IMPORTED_MODULE_0__","isLinkEnabled","link","isOnTop","parentId","aclGroupId","VisualConsoleItem","props","metadata","_this","this","clickEventManager","_lib_TypedEvent__WEBPACK_IMPORTED_MODULE_1__","movedEventManager","resizedEventManager","removeEventManager","disposables","debouncedMovementSave","prevPosition","newPosition","positionChanged","move","emit","item","removeMovement","debouncedResizementSave","prevSize","newSize","sizeChanged","resize","removeResizement","itemProps","_metadata","elementRef","createContainerDomElement","labelElementRef","createLabelDomElement","childElementRef","createDomElement","append","resizeElement","changeLabelPosition","initMovementListener","moveElement","stopMovementListener","initResizementListener","labelWidth","labelHeight","stopResizementListener","box","href","zIndex","meta","preventDefault","nativeEvent","classList","add","getLabelWithMacrosReplaced","table","row","emptyRow1","emptyRow2","cell","innerHTML","textAlign","updateDomElement","newProps","prevProps","shouldBeUpdated","render","newMetadata","setMeta","prevMetadata","prevMeta","oldLabelHtml","newLabelHtml","attrs","attributes","nodeName","setAttributeNode","parentNode","replaceChild","forEach","disposable","dispose","ignored","position","flexDirection","tables","getElementsByTagName","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","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","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","timezone","_b","split","diameter","boxPropsDecoder","Box_assign","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","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","handleElementMovement","handleElementResizement","handleElementRemove","filter","clearRelations","containerRef","_props","backgroundURL","isFavorite","relationLineWidth","VisualConsole_assign","visualConsolePropsDecoder","sort","itemInstance","console","log","message","buildRelations","map","updateElements","itemIds","decodeProps","backgroundImage","elements","parent_1","child","addRelationLine","itemId","ids","childId","getRelationLine","identifier","parent","clientWidth","clientHeight","onItemClick","onItemMoved","onItemResized","enableEditMode","disableEditMode","AsyncTaskManager_AsyncTask","AsyncTask","taskInitiator","cancellable","cancel","_status","statusChangeEventManager","status","init","onStatusChange","AsyncTaskManager","tasks","asyncTask","task","ref","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 AnyObject,\n Position,\n Size,\n WithAgentProps,\n WithModuleProps,\n LinkedVisualConsoleProps,\n LinkedVisualConsolePropsStatus,\n UnknownObject,\n ItemMeta\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 * Return a valid date or a default value from a raw value.\n * @param value Raw value from which we will try to extract a valid date.\n * @param defaultValue Default value to use if we cannot extract a valid date.\n * @return A valid date or the default value.\n */\nexport function parseDateOr(value: unknown, defaultValue: T): Date | T {\n if (value instanceof Date) return value;\n else if (typeof value === \"number\") return new Date(value * 1000);\n else if (\n typeof value === \"string\" &&\n !Number.isNaN(new Date(value).getTime())\n )\n return new Date(value);\n else return defaultValue;\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: AnyObject): 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: AnyObject): 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: AnyObject): 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: AnyObject): 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: AnyObject\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 * Build a valid typed object from a raw object.\n * @param data Raw object.\n * @return An object representing the item's meta properties.\n */\nexport function itemMetaDecoder(data: UnknownObject): ItemMeta | never {\n const receivedAt = parseDateOr(data.receivedAt, null);\n if (receivedAt === null) throw new TypeError(\"invalid meta structure\");\n\n let error = null;\n if (data.error instanceof Error) error = data.error;\n else if (typeof data.error === \"string\") error = new Error(data.error);\n\n return {\n receivedAt,\n error,\n editMode: parseBoolean(data.editMode),\n isFromCache: parseBoolean(data.isFromCache),\n isFetching: false,\n isUpdating: false\n };\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\n/**\n * Create a function which will limit the rate of execution of\n * the selected function to one time for the selected interval.\n * @param delay Interval.\n * @param fn Function to be executed at a limited rate.\n */\nexport function throttle(delay: number, fn: (...args: T[]) => R) {\n let last = 0;\n return (...args: T[]) => {\n const now = Date.now();\n if (now - last < delay) return;\n last = now;\n return fn(...args);\n };\n}\n\n/**\n * Create a function which will call the selected function only\n * after the interval time has passed after its last execution.\n * @param delay Interval.\n * @param fn Function to be executed after the last call.\n */\nexport function debounce(delay: number, fn: (...args: T[]) => void) {\n let timerRef: number | null = null;\n return (...args: T[]) => {\n if (timerRef !== null) window.clearTimeout(timerRef);\n timerRef = window.setTimeout(() => {\n fn(...args);\n timerRef = null;\n }, delay);\n };\n}\n\n/**\n * Retrieve the offset of an element relative to the page.\n * @param el Node used to calculate the offset.\n */\nfunction getOffset(el: HTMLElement | null) {\n let x = 0;\n let y = 0;\n while (el && !Number.isNaN(el.offsetLeft) && !Number.isNaN(el.offsetTop)) {\n x += el.offsetLeft - el.scrollLeft;\n y += el.offsetTop - el.scrollTop;\n el = el.offsetParent as HTMLElement | null;\n }\n return { top: y, left: x };\n}\n\n/**\n * Add the grab & move functionality to a certain element inside it's container.\n *\n * @param element Element to move.\n * @param onMoved Function to execute when the element moves.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addMovementListener(\n element: HTMLElement,\n onMoved: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastX: Position[\"x\"] = 0;\n let lastY: Position[\"y\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementBounds = element.getBoundingClientRect();\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth) * 2;\n\n // Will run onMoved 32ms after its last execution.\n const debouncedMovement = debounce(32, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n // Will run onMoved one time max every 16ms.\n const throttledMovement = throttle(16, (x: Position[\"x\"], y: Position[\"y\"]) =>\n onMoved(x, y)\n );\n\n const handleMove = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let x = 0;\n let y = 0;\n\n const mouseX = e.pageX;\n const mouseY = e.pageY;\n const mouseDeltaX = mouseX - lastMouseX;\n const mouseDeltaY = mouseY - lastMouseY;\n\n const minX = 0;\n const maxX = containerBounds.width - elementBounds.width + borderFix;\n const minY = 0;\n const maxY = containerBounds.height - elementBounds.height + borderFix;\n\n const outOfBoundsLeft =\n mouseX < containerLeft ||\n (lastX === 0 &&\n mouseDeltaX > 0 &&\n mouseX < containerLeft + mouseElementOffsetX);\n const outOfBoundsRight =\n mouseX > containerRight ||\n mouseDeltaX + lastX + elementBounds.width - borderFix >\n containerBounds.width ||\n (lastX === maxX &&\n mouseDeltaX < 0 &&\n mouseX > containerLeft + maxX + mouseElementOffsetX);\n const outOfBoundsTop =\n mouseY < containerTop ||\n (lastY === 0 &&\n mouseDeltaY > 0 &&\n mouseY < containerTop + mouseElementOffsetY);\n const outOfBoundsBottom =\n mouseY > containerBottom ||\n mouseDeltaY + lastY + elementBounds.height - borderFix >\n containerBounds.height ||\n (lastY === maxY &&\n mouseDeltaY < 0 &&\n mouseY > containerTop + maxY + mouseElementOffsetY);\n\n if (outOfBoundsLeft) x = minX;\n else if (outOfBoundsRight) x = maxX;\n else x = mouseDeltaX + lastX;\n\n if (outOfBoundsTop) y = minY;\n else if (outOfBoundsBottom) y = maxY;\n else y = mouseDeltaY + lastY;\n\n if (x < 0) x = minX;\n if (y < 0) y = minY;\n\n // Store the last mouse coordinates.\n lastMouseX = mouseX;\n lastMouseY = mouseY;\n\n if (x === lastX && y === lastY) return;\n\n // Run the movement events.\n throttledMovement(x, y);\n debouncedMovement(x, y);\n\n // Store the coordinates of the element.\n lastX = x;\n lastY = y;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastX = 0;\n lastY = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleMove);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n lastX = element.offsetLeft;\n lastY = element.offsetTop;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementBounds = element.getBoundingClientRect();\n borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n borderFix = Number.parseInt(borderWidth) * 2;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleMove);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n element.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n element.removeEventListener(\"mousedown\", handleStart);\n handleEnd();\n };\n}\n\n/**\n * Add the grab & resize functionality to a certain element.\n *\n * @param element Element to move.\n * @param onResized Function to execute when the element is resized.\n *\n * @return A function which will clean the event handlers when executed.\n */\nexport function addResizementListener(\n element: HTMLElement,\n onResized: (x: Position[\"x\"], y: Position[\"y\"]) => void\n): Function {\n const minWidth = 15;\n const minHeight = 15;\n\n const resizeDraggable = document.createElement(\"div\");\n resizeDraggable.className = \"resize-draggable\";\n element.appendChild(resizeDraggable);\n\n // Container of the resizable element.\n const container = element.parentElement as HTMLElement;\n // Store the initial draggable state.\n const isDraggable = element.draggable;\n // Init the coordinates.\n let lastWidth: Size[\"width\"] = 0;\n let lastHeight: Size[\"height\"] = 0;\n let lastMouseX: Position[\"x\"] = 0;\n let lastMouseY: Position[\"y\"] = 0;\n let mouseElementOffsetX: Position[\"x\"] = 0;\n let mouseElementOffsetY: Position[\"y\"] = 0;\n // Init the bounds.\n let containerBounds = container.getBoundingClientRect();\n let containerOffset = getOffset(container);\n let containerTop = containerOffset.top;\n let containerBottom = containerTop + containerBounds.height;\n let containerLeft = containerOffset.left;\n let containerRight = containerLeft + containerBounds.width;\n let elementOffset = getOffset(element);\n let elementTop = elementOffset.top;\n let elementLeft = elementOffset.left;\n let borderWidth = window.getComputedStyle(element).borderWidth || \"0\";\n let borderFix = Number.parseInt(borderWidth);\n\n // Will run onResized 32ms after its last execution.\n const debouncedResizement = debounce(\n 32,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n // Will run onResized one time max every 16ms.\n const throttledResizement = throttle(\n 16,\n (width: Size[\"width\"], height: Size[\"height\"]) => onResized(width, height)\n );\n\n const handleResize = (e: MouseEvent) => {\n // Calculate the new element coordinates.\n let width = lastWidth + (e.pageX - lastMouseX);\n let height = lastHeight + (e.pageY - lastMouseY);\n\n if (width === lastWidth && height === lastHeight) return;\n\n if (\n width < lastWidth &&\n e.pageX > elementLeft + (lastWidth - mouseElementOffsetX)\n )\n return;\n\n if (width < minWidth) {\n // Minimum value.\n width = minWidth;\n } else if (width + elementLeft - borderFix / 2 >= containerRight) {\n // Limit the size to the container.\n width = containerRight - elementLeft;\n }\n if (height < minHeight) {\n // Minimum value.\n height = minHeight;\n } else if (height + elementTop - borderFix / 2 >= containerBottom) {\n // Limit the size to the container.\n height = containerBottom - elementTop;\n }\n\n // Run the movement events.\n throttledResizement(width, height);\n debouncedResizement(width, height);\n\n // Store the coordinates of the element.\n lastWidth = width;\n lastHeight = height;\n // Store the last mouse coordinates.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n };\n const handleEnd = () => {\n // Reset the positions.\n lastWidth = 0;\n lastHeight = 0;\n lastMouseX = 0;\n lastMouseY = 0;\n mouseElementOffsetX = 0;\n mouseElementOffsetY = 0;\n // Remove the move event.\n document.removeEventListener(\"mousemove\", handleResize);\n // Clean itself.\n document.removeEventListener(\"mouseup\", handleEnd);\n // Reset the draggable property to its initial state.\n element.draggable = isDraggable;\n // Reset the body selection property to a default state.\n document.body.style.userSelect = \"auto\";\n };\n const handleStart = (e: MouseEvent) => {\n e.stopPropagation();\n\n // Disable the drag temporarily.\n element.draggable = false;\n\n // Store the difference between the cursor and\n // the initial coordinates of the element.\n const { width, height } = element.getBoundingClientRect();\n lastWidth = width;\n lastHeight = height;\n // Store the mouse position.\n lastMouseX = e.pageX;\n lastMouseY = e.pageY;\n // Store the relative position between the mouse and the element.\n mouseElementOffsetX = e.offsetX;\n mouseElementOffsetY = e.offsetY;\n\n // Initialize the bounds.\n containerBounds = container.getBoundingClientRect();\n containerOffset = getOffset(container);\n containerTop = containerOffset.top;\n containerBottom = containerTop + containerBounds.height;\n containerLeft = containerOffset.left;\n containerRight = containerLeft + containerBounds.width;\n elementOffset = getOffset(element);\n elementTop = elementOffset.top;\n elementLeft = elementOffset.left;\n\n // Listen to the mouse movement.\n document.addEventListener(\"mousemove\", handleResize);\n // Listen to the moment when the mouse click is not pressed anymore.\n document.addEventListener(\"mouseup\", handleEnd);\n // Limit the mouse selection of the body.\n document.body.style.userSelect = \"none\";\n };\n\n // Event to listen the init of the movement.\n resizeDraggable.addEventListener(\"mousedown\", handleStart);\n\n // Returns a function to clean the event listeners.\n return () => {\n resizeDraggable.remove();\n handleEnd();\n };\n}\n","import {\n Position,\n Size,\n AnyObject,\n WithModuleProps,\n ItemMeta\n} from \"./lib/types\";\nimport {\n sizePropsDecoder,\n positionPropsDecoder,\n parseIntOr,\n parseBoolean,\n notEmptyStringOr,\n replaceMacros,\n humanDate,\n humanTime,\n addMovementListener,\n debounce,\n addResizementListener\n} from \"./lib\";\nimport TypedEvent, { Listener, Disposable } from \"./lib/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: AnyObject;\n nativeEvent: Event;\n}\n\n// FIXME: Fix type compatibility.\nexport interface ItemRemoveEvent {\n // data: Props;\n data: AnyObject;\n}\n\nexport interface ItemMovedEvent {\n item: VisualConsoleItem;\n prevPosition: Position;\n newPosition: Position;\n}\n\nexport interface ItemResizedEvent {\n item: VisualConsoleItem;\n prevSize: Size;\n newSize: Size;\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: AnyObject): 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 // Metadata of the item.\n private _metadata: ItemMeta;\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 moved events.\n private readonly movedEventManager = new TypedEvent();\n // Event manager for resized events.\n private readonly resizedEventManager = 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 // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedMovementSave = debounce(\n 500, // ms.\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n const prevPosition = {\n x: this.props.x,\n y: this.props.y\n };\n const newPosition = {\n x: x,\n y: y\n };\n\n if (!this.positionChanged(prevPosition, newPosition)) return;\n\n // Save the new position to the props.\n this.move(x, y);\n // Emit the movement event.\n this.movedEventManager.emit({\n item: this,\n prevPosition: prevPosition,\n newPosition: newPosition\n });\n }\n );\n // This property will store the function\n // to clean the movement listener.\n private removeMovement: Function | null = null;\n\n /**\n * Start the movement funtionality.\n * @param element Element to move inside its container.\n */\n private initMovementListener(element: HTMLElement): void {\n this.removeMovement = addMovementListener(\n element,\n (x: Position[\"x\"], y: Position[\"y\"]) => {\n // Move the DOM element.\n this.moveElement(x, y);\n // Run the save function.\n this.debouncedMovementSave(x, y);\n }\n );\n }\n /**\n * Stop the movement fun\n */\n private stopMovementListener(): void {\n if (this.removeMovement) {\n this.removeMovement();\n this.removeMovement = null;\n }\n }\n\n // This function will only run the 2nd arg function after the time\n // of the first arg have passed after its last execution.\n private debouncedResizementSave = debounce(\n 500, // ms.\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n const prevSize = {\n width: this.props.width,\n height: this.props.height\n };\n const newSize = {\n width: width,\n height: height\n };\n\n if (!this.sizeChanged(prevSize, newSize)) return;\n\n // Save the new position to the props.\n this.resize(width, height);\n // Emit the resizement event.\n this.resizedEventManager.emit({\n item: this,\n prevSize: prevSize,\n newSize: newSize\n });\n }\n );\n // This property will store the function\n // to clean the resizement listener.\n private removeResizement: Function | null = null;\n\n /**\n * Start the resizement funtionality.\n * @param element Element to move inside its container.\n */\n protected initResizementListener(element: HTMLElement): void {\n this.removeResizement = addResizementListener(\n element,\n (width: Size[\"width\"], height: Size[\"height\"]) => {\n // The label it's outside the item's size, so we need\n // to get rid of its size to get the real size of the\n // item's content.\n if (this.props.label && this.props.label.length > 0) {\n const {\n width: labelWidth,\n height: labelHeight\n } = this.labelElementRef.getBoundingClientRect();\n\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n height -= labelHeight;\n break;\n case \"left\":\n case \"right\":\n width -= labelWidth;\n break;\n }\n }\n\n // Move the DOM element.\n this.resizeElement(width, height);\n // Run the save function.\n this.debouncedResizementSave(width, height);\n }\n );\n }\n /**\n * Stop the resizement functionality.\n */\n private stopResizementListener(): void {\n if (this.removeResizement) {\n this.removeResizement();\n this.removeResizement = null;\n }\n }\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, metadata: ItemMeta) {\n this.itemProps = props;\n this._metadata = metadata;\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\") as HTMLAnchorElement;\n if (this.props.link) box.href = this.props.link;\n } else {\n box = document.createElement(\"div\") 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 // Init the click listener.\n box.addEventListener(\"click\", e => {\n if (this.meta.editMode) {\n e.preventDefault();\n e.stopPropagation();\n } else {\n this.clickEventManager.emit({ data: this.props, nativeEvent: e });\n }\n });\n\n // Metadata state.\n if (this.meta.editMode) {\n box.classList.add(\"is-editing\");\n // Init the movement listener.\n this.initMovementListener(box);\n // Init the resizement listener.\n this.initResizementListener(box);\n }\n if (this.meta.isFetching) {\n box.classList.add(\"is-fetching\");\n }\n if (this.meta.isUpdating) {\n box.classList.add(\"is-updating\");\n }\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))\n this.render(prevProps, this._metadata);\n }\n\n /**\n * Public accessor of the `meta` property.\n * @return Properties.\n */\n public get meta(): ItemMeta {\n return { ...this._metadata }; // Return a copy.\n }\n\n /**\n * Public setter of the `meta` property.\n * If the new meta are different enough than the\n * stored meta, a render would be fired.\n * @param newProps\n */\n public set meta(newMetadata: ItemMeta) {\n this.setMeta(newMetadata);\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n */\n protected setMeta(newMetadata: ItemMeta) {\n const prevMetadata = this._metadata;\n // Update the internal meta.\n this._metadata = newMetadata;\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(prevMetadata, newMetadata))\n this.render(this.itemProps, prevMetadata);\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(\n prevProps: Props | null = null,\n prevMeta: ItemMeta | null = null\n ): 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 // Change metadata related things.\n if (!prevMeta || prevMeta.editMode !== this.meta.editMode) {\n if (this.meta.editMode) {\n this.elementRef.classList.add(\"is-editing\");\n this.initMovementListener(this.elementRef);\n this.initResizementListener(this.elementRef);\n } else {\n this.elementRef.classList.remove(\"is-editing\");\n this.stopMovementListener();\n this.stopResizementListener();\n }\n }\n if (!prevMeta || prevMeta.isFetching !== this.meta.isFetching) {\n if (this.meta.isFetching) {\n this.elementRef.classList.add(\"is-fetching\");\n } else {\n this.elementRef.classList.remove(\"is-fetching\");\n }\n }\n if (!prevMeta || prevMeta.isUpdating !== this.meta.isUpdating) {\n if (this.meta.isUpdating) {\n this.elementRef.classList.add(\"is-updating\");\n } else {\n this.elementRef.classList.remove(\"is-updating\");\n }\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 if (this.props.label && this.props.label.length > 0) {\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\n if (table) {\n switch (this.props.labelPosition) {\n case \"up\":\n case \"down\":\n table.style.width = width > 0 ? `${width}px` : null;\n break;\n case \"left\":\n case \"right\":\n table.style.height = height > 0 ? `${height}px` : null;\n break;\n }\n }\n }\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 movement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onMoved(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.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * To add an event handler to the resizement of visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onResized(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.resizedEventManager.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 { AnyObject, WithModuleProps } from \"../lib/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: AnyObject\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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 { AnyObject, WithModuleProps } from \"../lib/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(data: AnyObject): 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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 /**\n * @override Item.initResizementListener. To disable the functionality.\n * Start the resizement funtionality.\n * @param element Element to move inside its container.\n */\n protected initResizementListener(): void {\n // No-Op. Disable the resizement functionality for this item.\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 scripts = element.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 AnyObject\n} from \"../lib/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: AnyObject\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, AnyObject } from \"../lib/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: AnyObject): 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 AnyObject\n} from \"../lib/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: AnyObject\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 protected resizeElement(width: number): void {\n super.resizeElement(width, width);\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, AnyObject } from \"../lib/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: AnyObject): 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: AnyObject): 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 {\n LinkedVisualConsoleProps,\n AnyObject,\n Size,\n ItemMeta\n} from \"../../lib/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: AnyObject): 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, meta: ItemMeta) {\n // Call the superclass constructor.\n super(props, meta);\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 { AnyObject } from \"../lib/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: AnyObject): 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 { AnyObject, Position, Size, ItemMeta } from \"../lib/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: AnyObject): 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, meta: ItemMeta) {\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 {\n ...props,\n ...Line.extractBoxSizeAndPosition(props)\n },\n {\n ...meta,\n editMode: false\n }\n );\n }\n\n /**\n * Clasic and protected version of the setter of the `meta` property.\n * Useful to override it from children classes.\n * @param newProps\n * @override Item.setMeta\n */\n public setMeta(newMetadata: ItemMeta) {\n super.setMeta({\n ...newMetadata,\n editMode: false\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, AnyObject } from \"../lib/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: AnyObject): 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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 AnyObject,\n WithModuleProps\n} from \"../lib/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: AnyObject\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 { AnyObject } from \"../lib/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: AnyObject): 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 { AnyObject, Size } from \"./lib/types\";\nimport {\n parseBoolean,\n sizePropsDecoder,\n parseIntOr,\n notEmptyStringOr,\n itemMetaDecoder\n} from \"./lib\";\nimport Item, {\n ItemType,\n ItemProps,\n ItemClickEvent,\n ItemRemoveEvent,\n ItemMovedEvent,\n ItemResizedEvent\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 \"./lib/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: AnyObject) {\n const type = parseIntOr(data.type, null);\n if (type == null) throw new TypeError(\"missing item type.\");\n\n const meta = itemMetaDecoder(data);\n\n switch (type as ItemType) {\n case ItemType.STATIC_GRAPH:\n return new StaticGraph(staticGraphPropsDecoder(data), meta);\n case ItemType.MODULE_GRAPH:\n return new ModuleGraph(moduleGraphPropsDecoder(data), meta);\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), meta);\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), meta);\n case ItemType.LABEL:\n return new Label(labelPropsDecoder(data), meta);\n case ItemType.ICON:\n return new Icon(iconPropsDecoder(data), meta);\n case ItemType.SERVICE:\n return new Service(servicePropsDecoder(data), meta);\n case ItemType.GROUP_ITEM:\n return new Group(groupPropsDecoder(data), meta);\n case ItemType.BOX_ITEM:\n return new Box(boxPropsDecoder(data), meta);\n case ItemType.LINE_ITEM:\n return new Line(linePropsDecoder(data), meta);\n case ItemType.AUTO_SLA_GRAPH:\n return new EventsHistory(eventsHistoryPropsDecoder(data), meta);\n case ItemType.DONUT_GRAPH:\n return new DonutGraph(donutGraphPropsDecoder(data), meta);\n case ItemType.BARS_GRAPH:\n return new BarsGraph(barsGraphPropsDecoder(data), meta);\n case ItemType.CLOCK:\n return new Clock(clockPropsDecoder(data), meta);\n case ItemType.COLOR_CLOUD:\n return new ColorCloud(colorCloudPropsDecoder(data), meta);\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: AnyObject) {\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: AnyObject\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 // Event manager for move events.\n private readonly movedEventManager = new TypedEvent();\n // Event manager for resize events.\n private readonly resizedEventManager = new TypedEvent();\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 * React to a movement on an element.\n * @param e Event object.\n */\n private handleElementMovement: (e: ItemMovedEvent) => void = e => {\n this.movedEventManager.emit(e);\n // console.log(`Moved element #${e.item.props.id}`, e);\n };\n\n /**\n * React to a resizement on an element.\n * @param e Event object.\n */\n private handleElementResizement: (e: ItemResizedEvent) => void = e => {\n this.resizedEventManager.emit(e);\n // console.log(`Resized element #${e.item.props.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: AnyObject,\n items: AnyObject[]\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.onMoved(this.handleElementMovement);\n itemInstance.onResized(this.handleElementResizement);\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: AnyObject[]): void {\n // Ensure the type cause Typescript doesn't know the filter removes null items.\n const itemIds = items\n .map(item => item.id || null)\n .filter(id => id != null) as number[];\n // Get the elements we should delete.\n const deletedIds = this.elementIds.filter(id => itemIds.indexOf(id) < 0);\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 itemMetaDecoder({\n receivedAt: new Date()\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 onItemClick(\n listener: Listener>\n ): 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 * Add an event handler to the movement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemMoved(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.movedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Add an event handler to the resizement of the visual console elements.\n * @param listener Function which is going to be executed when a linked console is moved.\n */\n public onItemResized(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.resizedEventManager.on(listener);\n this.disposables.push(disposable);\n\n return disposable;\n }\n\n /**\n * Enable the edition mode.\n */\n public enableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: true };\n });\n this.containerRef.classList.add(\"is-editing\");\n }\n\n /**\n * Disable the edition mode.\n */\n public disableEditMode(): void {\n this.elements.forEach(item => {\n item.meta = { ...item.meta, editMode: false };\n });\n this.containerRef.classList.remove(\"is-editing\");\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/install.php b/pandora_console/install.php
index 2e3074241c..56db55110d 100644
--- a/pandora_console/install.php
+++ b/pandora_console/install.php
@@ -128,8 +128,8 @@
'last_fired',
+ 'order' => 'ASC',
+ ];
+ break;
+
+ case 'down':
+ $selectLastFiredDown = $selected;
+ $order = [
+ 'field' => 'last_fired',
+ 'order' => 'DESC',
+ ];
+ break;
+ }
+ break;
+
default:
if ($print_agent) {
$selectDisabledUp = '';
@@ -300,6 +323,8 @@ switch ($sortField) {
$selectModuleDown = false;
$selectTemplateUp = false;
$selectTemplateDown = false;
+ $selectLastFiredUp = false;
+ $selectLastFiredDown = false;
$order = [
'field' => 'agent_module_name',
'order' => 'ASC',
@@ -313,6 +338,8 @@ switch ($sortField) {
$selectModuleDown = false;
$selectTemplateUp = false;
$selectTemplateDown = false;
+ $selectLastFiredUp = false;
+ $selectLastFiredDown = false;
$order = [
'field' => 'agent_module_name',
'order' => 'ASC',
@@ -449,6 +476,8 @@ $url_up_module = $url.'&sort_field=module&sort=up';
$url_down_module = $url.'&sort_field=module&sort=down';
$url_up_template = $url.'&sort_field=template&sort=up';
$url_down_template = $url.'&sort_field=template&sort=down';
+$url_up_lastfired = $url.'&sort_field=last_fired&sort=up';
+$url_down_lastfired = $url.'&sort_field=last_fired&sort=down';
$table = new stdClass();
$table->width = '100%';
@@ -494,6 +523,7 @@ if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) {
$table->head[3] .= ui_get_sorting_arrows($url_up_agente, $url_down_agente, $selectAgentUp, $selectAgentDown);
$table->head[4] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown);
$table->head[5] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown);
+ $table->head[7] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown);
}
} else {
if (!is_metaconsole()) {
@@ -528,6 +558,7 @@ if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) {
if (!is_metaconsole()) {
$table->head[3] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown);
$table->head[4] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown);
+ $table->head[6] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown);
}
}
} else {
@@ -562,6 +593,7 @@ if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) {
$table->head[3] .= ui_get_sorting_arrows($url_up_agente, $url_down_agente, $selectAgentUp, $selectAgentDown);
$table->head[4] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown);
$table->head[5] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown);
+ $table->head[6] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown);
}
} else {
if (!is_metaconsole()) {
@@ -592,6 +624,7 @@ if ($isFunctionPolicies !== ENTERPRISE_NOT_HOOK) {
if (!is_metaconsole()) {
$table->head[2] .= ui_get_sorting_arrows($url_up_module, $url_down_module, $selectModuleUp, $selectModuleDown);
$table->head[3] .= ui_get_sorting_arrows($url_up_template, $url_down_template, $selectTemplateUp, $selectTemplateDown);
+ $table->head[5] .= ui_get_sorting_arrows($url_up_lastfired, $url_down_lastfired, $selectLastFiredUp, $selectLastFiredDown);
}
}
}
diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php
index 5f7f29f916..b9b2a2128d 100644
--- a/pandora_console/operation/agentes/ver_agente.php
+++ b/pandora_console/operation/agentes/ver_agente.php
@@ -68,15 +68,16 @@ if (is_ajax()) {
if ($refresh_contact) {
$id_agente = get_parameter('id_agente', 0);
if ($id_agente > 0) {
- $d = db_get_row(
- 'tagente',
- 'id_agente',
- $id_agente
+ $last_contact = db_get_value_sql(
+ sprintf(
+ 'SELECT intervalo - (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(IF(ultimo_contacto > ultimo_contacto_remoto, ultimo_contacto, ultimo_contacto_remoto)))
+ FROM `tagente`
+ WHERE id_agente = %d ',
+ $id_agente
+ )
);
$progress = agents_get_next_contact($id_agente);
- $last_contact = floor(($d['intervalo'] * (100 - $progress) / 100));
-
if ($progress < 0 || $progress > 100) {
$progress = 100;
}
diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php
index 7e8ce16ec3..da7123e728 100644
--- a/pandora_console/operation/events/events.php
+++ b/pandora_console/operation/events/events.php
@@ -1,7 +1,6 @@
EVENT_NO_VALIDATED,
+ 'event_view_hr' => $config['event_view_hr'],
+ 'group_rep' => 1,
+ 'tag_with' => [],
+ 'tag_without' => [],
+ 'history' => false,
+];
+
+$fb64 = get_parameter('fb64', null);
+if (isset($fb64)) {
+ $filter = json_decode(base64_decode($fb64), true);
+} else {
+ $filter = get_parameter(
+ 'filter',
+ $default_filter
+ );
+}
+
+$id_group = get_parameter(
+ 'filter[id_group]',
+ $filter['id_group']
+);
+$event_type = get_parameter(
+ 'filter[event_type]',
+ $filter['event_type']
+);
+$severity = get_parameter(
+ 'filter[severity]',
+ $filter['severity']
+);
+$status = get_parameter(
+ 'filter[status]',
+ $filter['status']
+);
+$search = get_parameter(
+ 'filter[search]',
+ $filter['search']
+);
+$text_agent = get_parameter(
+ 'filter[text_agent]',
+ $filter['text_agent']
+);
+$id_agent = get_parameter(
+ 'filter[id_agent]',
+ $filter['id_agent']
+);
+$id_agent_module = get_parameter(
+ 'filter[id_agent_module]',
+ $filter['id_agent_module']
+);
+$pagination = get_parameter(
+ 'filter[pagination]',
+ $filter['pagination']
+);
+$event_view_hr = get_parameter(
+ 'filter[event_view_hr]',
+ $filter['event_view_hr']
+);
+$id_user_ack = get_parameter(
+ 'filter[id_user_ack]',
+ $filter['id_user_ack']
+);
+$group_rep = get_parameter(
+ 'filter[group_rep]',
+ $filter['group_rep']
+);
+$tag_with = get_parameter(
+ 'filter[tag_with]',
+ $filter['tag_with']
+);
+$tag_without = get_parameter(
+ 'filter[tag_without]',
+ $filter['tag_without']
+);
+$filter_only_alert = get_parameter(
+ 'filter[filter_only_alert]',
+ $filter['filter_only_alert']
+);
+$id_group_filter = get_parameter(
+ 'filter[id_group_filter]',
+ $filter['id_group_filter']
+);
+$date_from = get_parameter(
+ 'filter[date_from]',
+ $filter['date_from']
+);
+$date_to = get_parameter(
+ 'filter[date_to]',
+ $filter['date_to']
+);
+$source = get_parameter(
+ 'filter[source]',
+ $filter['source']
+);
+$id_extra = get_parameter(
+ 'filter[id_extra]',
+ $filter['id_extra']
+);
+$user_comment = get_parameter(
+ 'filter[user_comment]',
+ $filter['user_comment']
+);
+$history = get_parameter(
+ 'history',
+ $filter['history']
+);
+$section = get_parameter('section', false);
// Ajax responses.
if (is_ajax()) {
$get_events = get_parameter('get_events', 0);
- $filter = get_parameter('filter', []);
// Datatables offset, limit.
$start = get_parameter('start', 0);
$length = get_parameter('length', $config['block_size']);
@@ -123,6 +209,10 @@ if (is_ajax()) {
ob_start();
$order = get_datatable_order(true);
+ if (is_array($order) && $order['field'] == 'mini_severity') {
+ $order['field'] = 'te.criticity';
+ }
+
$fields = [
'te.id_evento',
'te.id_agente',
@@ -151,11 +241,17 @@ if (is_ajax()) {
'tg.nombre as group_name',
];
if (!is_metaconsole()) {
- $fields[] = 'am.nombre as id_agentmodule';
+ $fields[] = 'am.nombre as module_name';
+ $fields[] = 'am.id_agente_modulo as id_agentmodule';
+ $fields[] = 'ta.server_name as server_name';
+ } else {
+ $fields[] = 'ts.server_name as server_name';
}
$events = events_get_all(
+ // Fields.
$fields,
+ // Filter.
$filter,
// Offset.
$start,
@@ -164,7 +260,9 @@ if (is_ajax()) {
// Order.
$order['direction'],
// Sort field.
- $order['field']
+ $order['field'],
+ // History.
+ $history
);
$count = events_get_all(
'count',
@@ -181,6 +279,11 @@ if (is_ajax()) {
function ($carry, $item) {
$tmp = (object) $item;
$tmp->evento = io_safe_output($tmp->evento);
+ if ($tmp->module_name) {
+ $tmp->module_name = io_safe_output($tmp->module_name);
+ }
+
+ $tmp->agent_name = io_safe_output($tmp->agent_name);
$tmp->ack_utimestamp = ui_print_timestamp(
$tmp->ack_utimestamp,
true
@@ -191,6 +294,9 @@ if (is_ajax()) {
);
$tmp->data = format_numeric($tmp->data, 1);
+
+ $tmp->b64 = base64_encode(json_encode($tmp));
+
$carry[] = $tmp;
return $carry;
}
@@ -487,34 +593,34 @@ if ($pure) {
// Fullscreen.
$fullscreen['active'] = false;
- $fullscreen['text'] = '
'.html_print_image('images/full_screen.png', true, ['title' => __('Full screen')]).' ';
+ $fullscreen['text'] = '
'.html_print_image('images/full_screen.png', true, ['title' => __('Full screen')]).' ';
// Event list.
$list['active'] = false;
- $list['text'] = '
'.html_print_image('images/events_list.png', true, ['title' => __('Event list')]).' ';
+ $list['text'] = '
'.html_print_image('images/events_list.png', true, ['title' => __('Event list')]).' ';
// History event list.
$history_list['active'] = false;
- $history_list['text'] = '
'.html_print_image('images/books.png', true, ['title' => __('History event list')]).' ';
+ $history_list['text'] = '
'.html_print_image('images/books.png', true, ['title' => __('History event list')]).' ';
// RSS.
$rss['active'] = false;
- $rss['text'] = '
'.html_print_image('images/rss.png', true, ['title' => __('RSS Events')]).' ';
+ $rss['text'] = '
'.html_print_image('images/rss.png', true, ['title' => __('RSS Events')]).' ';
// Marquee.
$marquee['active'] = false;
- $marquee['text'] = '
'.html_print_image('images/heart.png', true, ['title' => __('Marquee display')]).' ';
+ $marquee['text'] = '
'.html_print_image('images/heart.png', true, ['title' => __('Marquee display')]).' ';
// CSV.
$csv['active'] = false;
- $csv['text'] = '
'.html_print_image('images/csv_mc.png', true, ['title' => __('Export to CSV file')]).' ';
+ $csv['text'] = '
'.html_print_image('images/csv_mc.png', true, ['title' => __('Export to CSV file')]).' ';
// Sound events.
$sound_event['active'] = false;
$sound_event['text'] = '
'.html_print_image('images/sound.png', true, ['title' => __('Sound events')]).' ';
// If the user has administrator permission display manage tab.
- if (check_acl($config['id_user'], 0, 'EW') || check_acl($config['id_user'], 0, 'EM')) {
+ if ($event_w || $event_m) {
// Manage events.
$manage_events['active'] = false;
$manage_events['text'] = '
'.html_print_image('images/setup.png', true, ['title' => __('Manage events')]).' ';
@@ -791,12 +897,14 @@ $buttons[] = [
'onclick' => '',
];
-$buttons[] = [
- 'id' => 'save-filter',
- 'class' => 'float-left margin-right-2 sub wand',
- 'text' => __('Save filter'),
- 'onclick' => '',
-];
+if ($event_w || $event_m) {
+ $buttons[] = [
+ 'id' => 'save-filter',
+ 'class' => 'float-left margin-right-2 sub wand',
+ 'text' => __('Save filter'),
+ 'onclick' => '',
+ ];
+}
/*
* Advanced filter.
@@ -1067,6 +1175,10 @@ try {
'text' => 'evento',
'class' => 'mw120px',
],
+ [
+ 'text' => 'mini_severity',
+ 'class' => 'no-padding',
+ ],
'id_evento',
// 'id_agente',
// 'id_usuario',
@@ -1112,6 +1224,12 @@ try {
$fields = $default_fields;
}
+ if (in_array('mini_severity', $fields) > 0) {
+ $fields[array_search('mini_severity', $fields)] = [
+ 'text' => 'mini_severity',
+ 'class' => 'no-padding-imp',
+ ];
+ }
$evento_id = array_search('evento', $fields);
if ($evento_id !== false) {
@@ -1219,6 +1337,7 @@ try {
$active_filters_div .= '
';
$table_id = 'events';
+ $form_id = 'events_form';
// Print datatable.
ui_print_datatable(
@@ -1227,9 +1346,12 @@ try {
'class' => 'info_table events',
'style' => 'width: 100%;',
'ajax_url' => 'operation/events/events',
- 'ajax_data' => ['get_events' => 1],
+ 'ajax_data' => [
+ 'get_events' => 1,
+ 'history' => (int) $history,
+ ],
'form' => [
- 'id' => 'events_form',
+ 'id' => $form_id,
'class' => 'flex-row',
'html' => $filter,
'inputs' => [],
@@ -1280,39 +1402,41 @@ try {
$sql_event_resp = "SELECT id, name FROM tevent_response WHERE type LIKE 'command'";
$event_responses = db_get_all_rows_sql($sql_event_resp);
-if (check_acl($config['id_user'], 0, 'EW') == 1 && !$readonly) {
- $array_events_actions['in_progress_selected'] = __('In progress selected');
- $array_events_actions['validate_selected'] = __('Validate selected');
-}
+if ($config['event_replication'] != 1) {
+ if ($event_w && !$readonly) {
+ $array_events_actions['in_progress_selected'] = __('In progress selected');
+ $array_events_actions['validate_selected'] = __('Validate selected');
+ }
-if (check_acl($config['id_user'], 0, 'EM') == 1 && !$readonly) {
- $array_events_actions['delete_selected'] = __('Delete selected');
+ if ($event_m == 1 && !$readonly) {
+ $array_events_actions['delete_selected'] = __('Delete selected');
+ }
}
foreach ($event_responses as $val) {
$array_events_actions[$val['id']] = $val['name'];
}
-if ($config['event_replication'] != 1) {
- echo '';
- echo '';
- echo '';
- echo __(
- 'A maximum of %s event custom responses can be selected',
- $config['max_execution_event_response']
- ).' ';
- echo '';
- echo __(
- 'Please, select an event'
- ).' ';
- echo '
';
-}
+
+echo '';
+echo '';
+echo '';
+echo __(
+ 'A maximum of %s event custom responses can be selected',
+ $config['max_execution_event_response']
+).' ';
+echo '';
+echo __(
+ 'Please, select an event'
+).' ';
+echo '
';
+
// Close viewer.
enterprise_hook('close_meta_frame');
@@ -1477,16 +1601,17 @@ function process_datatables_item(item) {
output += '';
// Add event severity to end of text.
- evn = '';
- evn += '
';
- evn += output;
- evn += '
'
+ evn += item.evento+'';
+
+ item.mini_severity = '';
+ item.mini_severity += output;
+ item.mini_severity += '
';
criticity = '' + text + "
";
@@ -1517,7 +1642,7 @@ function process_datatables_item(item) {
case "":
case "":
- $tex = "";
+ text = "";
color = "";
break;
@@ -1580,42 +1705,10 @@ function process_datatables_item(item) {
module_status = '' + text + "
";
-
- /* Agent name link */
- if (item.id_agente > 0) {
- item.agent_name = '' + item.agent_name + ' ';
- } else {
- item.agent_name = '';
- }
-
- /* Agent ID link */
- if (item.id_agente > 0) {
-
- item.id_agente = '' + item.id_agente + ' ';
-
- item.id_agente = '' + item.agent_name + ' ';
-
- } else {
- item.id_agente = '';
- }
-
- /* Group name */
- if (item.id_grupo == "0") {
- item.id_grupo = "";
- } else {
- item.id_grupo = item.group_name;
- }
-
/* Options */
// Show more.
item.options = ' __('Show more')]); ?> ';
__('Delete event')]); ?>';
}
}
+
// Multi select.
item.m = ' ';
-
/* Status */
img = ' __('Unknown'), 'class' => 'forced-title']); ?>';
switch (item.estado) {
- case "0":
+ case "":
img = ' __('New event'), 'class' => 'forced-title']); ?>';
break;
- case "1":
+ case "":
img = ' __('Event validated'), 'class' => 'forced-title']); ?>';
break;
- case "2":
+ case "":
img = ' __('Event in process'), 'class' => 'forced-title']); ?>';
break;
}
/* Update column content now to avoid json poisoning. */
+
+ /* Agent name link */
+ if (item.id_agente > 0) {
+ item.agent_name = '' + item.agent_name + ' ';
+ } else {
+ item.agent_name = '';
+ }
+
+ /* Agent ID link */
+ if (item.id_agente > 0) {
+
+ item.id_agente = '' + item.id_agente + ' ';
+
+ item.id_agente = '' + item.agent_name + ' ';
+
+ } else {
+ item.id_agente = '';
+ }
+
item.estado = '';
item.estado += img;
item.estado += '
';
@@ -1708,6 +1826,15 @@ function process_datatables_item(item) {
// Add event severity format to itself.
item.evento = evn;
+ /* Group name */
+ if (item.id_grupo == "0") {
+ item.id_grupo = "";
+ } else {
+ item.id_grupo = item.group_name;
+ }
+
+ /* Module name */
+ item.id_agentmodule = item.module_name;
}
/* Datatables auxiliary functions ends */
@@ -1957,6 +2084,23 @@ function reorder_tags_inputs() {
}
/* Tag management ends */
$(document).ready( function() {
+ /* Filter to a href */
+ $('.events_link').on('click', function(e) {
+ e.preventDefault();
+
+ inputs = $("# :input");
+ values = {};
+ inputs.each(function() {
+ values[this.name] = $(this).val();
+ })
+
+ values['history'] = "";
+
+ var url = e.currentTarget.href;
+ url += 'fb64=' + btoa(JSON.stringify(values));
+ document.location = url;
+
+ });
/* Multi select handler */
$('#checkbox-all_validate_box').on('change', function() {
diff --git a/pandora_console/operation/events/events_rss.php b/pandora_console/operation/events/events_rss.php
index 2a38643a9c..95ce7cd07b 100644
--- a/pandora_console/operation/events/events_rss.php
+++ b/pandora_console/operation/events/events_rss.php
@@ -1,18 +1,37 @@
';
+ $output .= '';
+ $output .= ''.xml_entities($key).'>';
+ return $output."\n";
}
-// Check user credentials
-$user = get_parameter('user');
-$hashup = get_parameter('hashup');
-$pss = get_user_info($user);
-$hashup2 = md5($user.$pss['password']);
+/**
+ * Escape entities for XML.
+ *
+ * @param string $str String.
+ *
+ * @return string Escaped string.
+ */
+function xml_entities($str)
+{
+ if (!is_string($str)) {
+ return '';
+ }
-if ($hashup != $hashup2) {
- rss_error_handler(
- null,
- null,
- null,
- null,
- __('The URL of your feed has bad hash.')
- );
+ if (preg_match_all('/(&[^;]+;)/', $str, $matches) != 0) {
+ $matches = $matches[0];
- exit;
+ foreach ($matches as $entity) {
+ $char = html_entity_decode($entity, (ENT_COMPAT | ENT_HTML401), 'UTF-8');
+
+ $html_entity_numeric = ''.uniord($char).';';
+
+ $str = str_replace($entity, $html_entity_numeric, $str);
+ }
+ }
+
+ return $str;
}
-header('Content-Type: application/xml; charset=UTF-8');
-// Send header before starting to output
+
+/**
+ * Undocumented function.
+ *
+ * @param string $u U.
+ *
+ * @return integer Ord.
+ */
+function uniord($u)
+{
+ $k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
+ $k1 = ord(substr($k, 0, 1));
+ $k2 = ord(substr($k, 1, 1));
+
+ return ($k2 * 256 + $k1);
+}
+
+
+/**
+ * Generate RSS header.
+ *
+ * @param integer $lastbuild Date, last build.
+ *
+ * @return string RSS header.
+ */
+function rss_header($lastbuild=0)
+{
+ $selfurl = ui_get_full_url('?'.$_SERVER['QUERY_STRING'], false, true);
+
+ // ' '."\n";
+ $rss_feed .= ''."\n";
+ $rss_feed .= ''."\n";
+ $rss_feed .= ''.io_safe_output(get_product_name()).' Events Feed '."\n";
+ $rss_feed .= 'Latest events on '.get_product_name().' '."\n";
+ $rss_feed .= ''.date(DATE_RFC822, $lastbuild).' '."\n";
+ // Last build date is the last event - that way readers won't mark it as having new posts.
+ $rss_feed .= ' '.$url.''."\n";
+ // Link back to the main Pandora page.
+ $rss_feed .= ' '."\n";
+
+ return $rss_feed;
+}
+
+
+/**
+ * RSS error handler.
+ *
+ * @param string $errno Errno.
+ * @param string $errstr Errstr.
+ * @param string $errfile Errfile.
+ * @param string $errline Errline.
+ * @param string $error_human_description Error_human_description.
+ *
+ * @return void
+ */
function rss_error_handler($errno, $errstr, $errfile, $errline, $error_human_description=null)
{
$url = ui_get_full_url(false);
$selfurl = ui_get_full_url('?'.$_SERVER['QUERY_STRING'], false, true);
- $rss_feed = '';
- // ' Fixes certain highlighters freaking out on the PHP closing tag
- $rss_feed .= "\n";
- $rss_feed .= '';
- $rss_feed .= "\n";
- $rss_feed .= '';
- $rss_feed .= "\n";
- $rss_feed .= ''.get_product_name().' RSS Feed ';
- $rss_feed .= "\n";
- $rss_feed .= 'Latest events on '.get_product_name().' ';
- $rss_feed .= "\n";
- $rss_feed .= ''.date(DATE_RFC822, 0).' ';
- $rss_feed .= "\n";
- $rss_feed .= ' '.$url.'';
- // Link back to the main Pandora page
- $rss_feed .= "\n";
- $rss_feed .= ' ';
- // Alternative for Atom feeds. It's the same.
+ // ' Fixes certain highlighters freaking out on the PHP closing tag.
+ $rss_feed = rss_header(0);
$rss_feed .= "\n";
$rss_feed .= '- ';
$rss_feed .= "\n";
@@ -104,169 +173,206 @@ function rss_error_handler($errno, $errstr, $errfile, $errline, $error_human_des
$rss_feed .= "\n";
$rss_feed .= '
';
- exit($rss_feed);
- // Exit by displaying the feed
+ echo $rss_feed;
}
+// Errors output as RSS.
set_error_handler('rss_error_handler', E_ERROR);
-// Errors output as RSS
-$id_group = get_parameter('id_group', 0);
-// group
-$event_type = get_parameter('event_type', '');
-// 0 all
-$severity = (int) get_parameter('severity', -1);
-// -1 all
-$status = (int) get_parameter('status', 0);
-// -1 all, 0 only red, 1 only green
-$id_agent = (int) get_parameter('id_agent', -1);
-$id_event = (int) get_parameter('id_event', -1);
-// This will allow to select only 1 event (eg. RSS)
-$event_view_hr = (int) get_parameter('event_view_hr', 0);
-$id_user_ack = get_parameter('id_user_ack', 0);
-$search = io_safe_output(preg_replace('/&([A-Za-z]{0,4}\w{2,3};|#[0-9]{2,3};)/', '&', rawurldecode(get_parameter('search'))));
-$text_agent = (string) get_parameter('text_agent', __('All'));
+// Send header before starting to output.
+header('Content-Type: application/xml; charset=UTF-8');
-$tag_with_json = base64_decode(get_parameter('tag_with', ''));
-$tag_with_json_clean = io_safe_output($tag_with_json);
-$tag_with_base64 = base64_encode($tag_with_json_clean);
-$tag_with = json_decode($tag_with_json_clean, true);
-if (empty($tag_with)) {
- $tag_with = [];
+$ipOrigin = $_SERVER['REMOTE_ADDR'];
+
+// Uncoment this to activate ACL on RSS Events.
+if (!isInACL($ipOrigin)) {
+ rss_error_handler(
+ null,
+ null,
+ null,
+ null,
+ __('Your IP is not into the IP list with API access.')
+ );
+
+ exit;
}
-$tag_with = array_diff($tag_with, [0 => 0]);
+// Check user credentials.
+$user = get_parameter('user');
+$hashup = get_parameter('hashup');
-$tag_without_json = base64_decode(get_parameter('tag_without', ''));
-$tag_without_json_clean = io_safe_output($tag_without_json);
-$tag_without_base64 = base64_encode($tag_without_json_clean);
-$tag_without = json_decode($tag_without_json_clean, true);
-if (empty($tag_without)) {
- $tag_without = [];
+$pss = get_user_info($user);
+$hashup2 = md5($user.$pss['password']);
+
+if ($hashup != $hashup2) {
+ rss_error_handler(
+ null,
+ null,
+ null,
+ null,
+ __('The URL of your feed has bad hash.')
+ );
+
+ exit;
}
-$tag_without = array_diff($tag_without, [0 => 0]);
-
-$filter_only_alert = (int) get_parameter('filter_only_alert', -1);
-
-//
-// Build the condition of the events query
-$sql_post = '';
-$meta = false;
-
-$id_user = $user;
-
-require 'events.build_query.php';
-
-// Now $sql_post have all the where condition
-//
-$sql = 'SELECT *
- FROM tevento te LEFT JOIN tagent_secondary_group tasg
- ON te.id_grupo = tasg.id_group
- WHERE 1=1 '.$sql_post.'
- ORDER BY utimestamp DESC';
-
-$result = db_get_all_rows_sql($sql);
-
-$url = ui_get_full_url(false);
-$selfurl = ui_get_full_url('?'.$_SERVER['QUERY_STRING'], false, true);
-
-if (empty($result)) {
- $lastbuild = 0;
- // Last build in 1970
-} else {
- $lastbuild = (int) $result[0]['utimestamp'];
+$reset_session = false;
+if (empty($config['id_user'])) {
+ $config['id_user'] = $user;
+ $reset_session = true;
}
-$rss_feed = ''."\n";
-// ' '."\n";
-$rss_feed .= ''."\n";
-$rss_feed .= ''.get_product_name().' RSS Feed '."\n";
-$rss_feed .= 'Latest events on '.get_product_name().' '."\n";
-$rss_feed .= ''.date(DATE_RFC822, $lastbuild).' '."\n";
-// Last build date is the last event - that way readers won't mark it as having new posts
-$rss_feed .= ' '.$url.''."\n";
-// Link back to the main Pandora page
-$rss_feed .= ' '."\n";
-;
-// Alternative for Atom feeds. It's the same.
-if (empty($result)) {
- $result = [];
- $rss_feed .= ''.xml_entities(io_safe_input($url.'/index.php?sec=eventos&sec2=operation/events/events')).' No results ';
- $rss_feed .= 'There are no results. Click on the link to see all Pending events ';
- $rss_feed .= ' '.xml_entities(io_safe_input($url.'/index.php?sec=eventos&sec2=operation/events/events')).' '."\n";
-}
+$column_names = [
+ 'id_evento',
+ 'evento',
+ 'timestamp',
+ 'estado',
+ 'event_type',
+ 'utimestamp',
+ 'id_agente',
+ 'agent_name',
+ 'id_usuario',
+ 'id_grupo',
+ 'id_agentmodule',
+ 'id_alert_am',
+ 'criticity',
+ 'user_comment',
+ 'tags',
+ 'source',
+ 'id_extra',
+ 'critical_instructions',
+ 'warning_instructions',
+ 'unknown_instructions',
+ 'owner_user',
+ 'ack_utimestamp',
+ 'custom_data',
+ 'data',
+ 'module_status',
+];
-foreach ($result as $row) {
- if (!check_acl($user, $row['id_grupo'], 'ER')) {
- continue;
+$fields = [
+ 'te.id_evento',
+ 'te.evento',
+ 'te.timestamp',
+ 'te.estado',
+ 'te.event_type',
+ 'te.utimestamp',
+ 'te.id_agente',
+ 'ta.alias as agent_name',
+ 'te.id_usuario',
+ 'te.id_grupo',
+ 'te.id_agentmodule',
+ 'am.nombre as module_name',
+ 'te.id_alert_am',
+ 'te.criticity',
+ 'te.user_comment',
+ 'te.tags',
+ 'te.source',
+ 'te.id_extra',
+ 'te.critical_instructions',
+ 'te.warning_instructions',
+ 'te.unknown_instructions',
+ 'te.owner_user',
+ 'te.ack_utimestamp',
+ 'te.custom_data',
+ 'te.data',
+ 'te.module_status',
+ 'tg.nombre as group_name',
+];
+
+
+try {
+ $fb64 = get_parameter('fb64', null);
+ $plain_filter = base64_decode($fb64);
+ $filter = json_decode($plain_filter, true);
+ if (json_last_error() != JSON_ERROR_NONE) {
+ throw new Exception('Invalid filter. ['.$plain_filter.']');
}
- if ($row['event_type'] == 'system') {
- $agent_name = __('System');
- } else if ($row['id_agente'] > 0) {
- // Agent name
- $agent_name = agents_get_alias($row['id_agente']);
- } else {
- $agent_name = __('Alert').__('SNMP');
+ // Dump events.
+ $limit = get_parameter('limit', 20);
+ $offset = get_parameter('offset', 0);
+ $events = events_get_all(
+ $fields,
+ $filter,
+ $offset,
+ $limit,
+ 'desc',
+ 'timestamp',
+ $filter['history']
+ );
+
+ $last_timestamp = 0;
+ if (is_array($events)) {
+ $last_timestamp = $events[0]['utimestamp'];
}
- // This is mandatory
- $rss_feed .= '';
- $rss_feed .= xml_entities(io_safe_input($url.'/index.php?sec=eventos&sec2=operation/events/events&id_event='.$row['id_evento']));
- $rss_feed .= ' ';
- $rss_feed .= xml_entities($agent_name);
- $rss_feed .= ' ';
- $rss_feed .= xml_entities($row['evento']);
- if ($row['estado'] == 1) {
- $rss_feed .= xml_entities(io_safe_input(' '.'Validated by '.$row['id_usuario']));
- }
+ // Dump headers.
+ $rss = rss_header($last_timestamp);
+ $url = ui_get_full_url(false);
- $rss_feed .= ' ';
- $rss_feed .= xml_entities(io_safe_input($url.'/index.php?sec=eventos&sec2=operation/events/events&id_event='.$row['id_evento']));
- $rss_feed .= '';
+ if (is_array($events)) {
+ foreach ($events as $row) {
+ $rss .= '- ';
+ $rss .= xml_entry('title', $row['evento']);
+ if (!empty($row['id_agente'])) {
+ $rss .= xml_entry('link', $url.'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$row['id_agente']);
+ }
- // The rest is optional
- $rss_feed .= '
'.date(DATE_RFC822, $row['utimestamp']).' ';
+ $rss .= xml_entry('comments', $row['']);
+ $rss .= xml_entry('pubDate', $row['timestamp']);
+ $rss .= xml_entry('category', $row['source']);
+ foreach ($column_names as $val) {
+ $key = $val;
+ if ($val == 'id_grupo') {
+ $key = 'group_name';
+ } else if ($val == 'id_agentmodule') {
+ $key = 'module_name';
+ }
- // This is mandatory again
- $rss_feed .= ' '."\n";
-}
+ switch ($key) {
+ case 'module_status':
+ $value = events_translate_module_status(
+ $row[$key]
+ );
+ break;
-$rss_feed .= " \n \n";
+ case 'event_type':
+ $value = events_translate_event_type(
+ $row[$key]
+ );
+ break;
-echo $rss_feed;
+ case 'criticity':
+ $value = events_translate_event_criticity(
+ $row[$key]
+ );
+ break;
+ default:
+ $value = $row[$key];
+ break;
+ }
-function xml_entities($str)
-{
- if (!is_string($str)) {
- return '';
- }
+ $rss .= xml_entry($key, $value);
+ }
- if (preg_match_all('/(&[^;]+;)/', $str, $matches) != 0) {
- $matches = $matches[0];
-
- foreach ($matches as $entity) {
- $char = html_entity_decode($entity, (ENT_COMPAT | ENT_HTML401), 'UTF-8');
-
- $html_entity_numeric = ''.uniord($char).';';
-
- $str = str_replace($entity, $html_entity_numeric, $str);
+ $rss .= '';
}
+ } else {
+ $rss .= ''.xml_entities(io_safe_input($url.'/index.php?sec=eventos&sec2=operation/events/events')).' No results ';
+ $rss .= 'There are no results. Click on the link to see all Pending events ';
+ $rss .= ' '.xml_entities(io_safe_input($url.'/index.php?sec=eventos&sec2=operation/events/events')).' '."\n";
}
- return $str;
+ $rss .= "\n\n";
+
+ echo $rss;
+} catch (Exception $e) {
+ echo rss_error_handler(200, 'Controlled error', '', '', $e->getMessage());
}
-
-function uniord($u)
-{
- $k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
- $k1 = ord(substr($k, 0, 1));
- $k2 = ord(substr($k, 1, 1));
-
- return ($k2 * 256 + $k1);
+if ($reset_session) {
+ unset($config['id_user']);
}
diff --git a/pandora_console/operation/events/export_csv.php b/pandora_console/operation/events/export_csv.php
index dbc20abb6a..0c16a16f9d 100644
--- a/pandora_console/operation/events/export_csv.php
+++ b/pandora_console/operation/events/export_csv.php
@@ -1,18 +1,34 @@
load_tables();
}
-$offset = (int) get_parameter('offset');
-$id_group = (int) get_parameter('id_group');
-// group
-$event_type = (string) get_parameter('event_type', 'all');
-// 0 all
-$severity = (int) get_parameter('severity', -1);
-// -1 all
-$status = (int) get_parameter('status', -1);
-// -1 all, 0 only red, 1 only green
-$id_agent = (int) get_parameter('id_agent', -1);
+$column_names = [
+ 'id_evento',
+ 'evento',
+ 'timestamp',
+ 'estado',
+ 'event_type',
+ 'utimestamp',
+ 'id_agente',
+ 'agent_name',
+ 'id_usuario',
+ 'id_grupo',
+ 'id_agentmodule',
+ 'id_alert_am',
+ 'criticity',
+ 'user_comment',
+ 'tags',
+ 'source',
+ 'id_extra',
+ 'critical_instructions',
+ 'warning_instructions',
+ 'unknown_instructions',
+ 'owner_user',
+ 'ack_utimestamp',
+ 'custom_data',
+ 'data',
+ 'module_status',
+];
-$id_event = (int) get_parameter('id_event', -1);
-$event_view_hr = (int) get_parameter('event_view_hr', $config['event_view_hr']);
-$id_user_ack = get_parameter('id_user_ack', 0);
-$search = io_safe_output(preg_replace('/&([A-Za-z]{0,4}\w{2,3};|#[0-9]{2,3};)/', '&', rawurldecode(get_parameter('search'))));
-$text_agent = (string) get_parameter('text_agent', __('All'));
-
-$tag_with_json = base64_decode(get_parameter('tag_with', ''));
-$tag_with_json_clean = io_safe_output($tag_with_json);
-$tag_with_base64 = base64_encode($tag_with_json_clean);
-$tag_with = json_decode($tag_with_json_clean, true);
-if (empty($tag_with)) {
- $tag_with = [];
-}
-
-$tag_with = array_diff($tag_with, [0 => 0]);
-
-$tag_without_json = base64_decode(get_parameter('tag_without', ''));
-$tag_without_json_clean = io_safe_output($tag_without_json);
-$tag_without_base64 = base64_encode($tag_without_json_clean);
-$tag_without = json_decode($tag_without_json_clean, true);
-if (empty($tag_without)) {
- $tag_without = [];
-}
-
-$tag_without = array_diff($tag_without, [0 => 0]);
-
-$filter_only_alert = (int) get_parameter('filter_only_alert', -1);
-
-//
-// Build the condition of the events query
-$sql_post = '';
-$meta = false;
-
-$id_user = $config['id_user'];
-
-require 'events.build_query.php';
-
-// Now $sql_post have all the where condition
-//
-switch ($config['dbtype']) {
- case 'mysql':
- case 'postgresql':
- case 'oracle':
- $sql = 'SELECT *
- FROM tevento te
- LEFT JOIN tagent_secondary_group tasg
- ON te.id_grupo = tasg.id_group
- WHERE 1=1 '.$sql_post.'
- ORDER BY utimestamp DESC';
- break;
-}
+$fields = [
+ 'te.id_evento',
+ 'te.evento',
+ 'te.timestamp',
+ 'te.estado',
+ 'te.event_type',
+ 'te.utimestamp',
+ 'te.id_agente',
+ 'ta.alias as agent_name',
+ 'te.id_usuario',
+ 'te.id_grupo',
+ 'te.id_agentmodule',
+ 'am.nombre as module_name',
+ 'te.id_alert_am',
+ 'te.criticity',
+ 'te.user_comment',
+ 'te.tags',
+ 'te.source',
+ 'te.id_extra',
+ 'te.critical_instructions',
+ 'te.warning_instructions',
+ 'te.unknown_instructions',
+ 'te.owner_user',
+ 'te.ack_utimestamp',
+ 'te.custom_data',
+ 'te.data',
+ 'te.module_status',
+ 'tg.nombre as group_name',
+];
$now = date('Y-m-d');
-// Show contentype header
+// Download header.
header('Content-type: text/txt');
header('Content-Disposition: attachment; filename="pandora_export_event'.$now.'.csv"');
-echo 'timestamp';
-echo $config['csv_divider'];
-echo 'agent';
-echo $config['csv_divider'];
-echo 'group';
-echo $config['csv_divider'];
-echo 'event';
-echo $config['csv_divider'];
-echo 'status';
-echo $config['csv_divider'];
-echo 'user';
-echo $config['csv_divider'];
-echo 'event_type';
-echo $config['csv_divider'];
-echo 'severity';
-echo $config['csv_divider'];
-echo 'id';
-echo chr(13);
-
-$new = true;
-while ($event = db_get_all_row_by_steps_sql($new, $result, $sql)) {
- $new = false;
- $alias = db_get_value('alias', 'tagente', 'id_agente', $event['id_agente']);
- if ((!check_acl($config['id_user'], $event['id_grupo'], 'ER')
- && !check_acl($config['id_user'], $event['id_grupo'], 'EW') && !check_acl($config['id_user'], $event['id_grupo'], 'EM') )
- || (!check_acl($config['id_user'], 0, 'PM') && $event['event_type'] == 'system')
- ) {
- continue;
+try {
+ $fb64 = get_parameter('fb64', null);
+ $plain_filter = base64_decode($fb64);
+ $filter = json_decode($plain_filter, true);
+ if (json_last_error() != JSON_ERROR_NONE) {
+ throw new Exception('Invalid filter. ['.$plain_filter.']');
+ }
+
+ $names = events_get_column_names($column_names);
+
+ // Dump headers.
+ foreach ($names as $n) {
+ echo io_safe_output($n).$config['csv_divider'];
}
- echo date($config['date_format'], $event['utimestamp']);
- echo $config['csv_divider'];
- echo io_safe_output($alias);
- echo $config['csv_divider'];
- echo io_safe_output(groups_get_name($event['id_grupo']));
- echo $config['csv_divider'];
- echo io_safe_output($event['evento']);
- echo $config['csv_divider'];
- echo io_safe_output($event['estado']);
- echo $config['csv_divider'];
- echo io_safe_output($event['id_usuario']);
- echo $config['csv_divider'];
- echo io_safe_output($event['event_type']);
- echo $config['csv_divider'];
- echo $event['criticity'];
- echo $config['csv_divider'];
- echo $event['id_evento'];
echo chr(13);
+
+ // Dump events.
+ $events_per_step = 1000;
+ $step = 0;
+ while (1) {
+ $events = events_get_all(
+ $fields,
+ $filter,
+ (($step++) * $events_per_step),
+ $events_per_step,
+ 'desc',
+ 'timestamp',
+ $filter['history']
+ );
+
+ if ($events === false) {
+ break;
+ }
+
+ foreach ($events as $row) {
+ foreach ($column_names as $val) {
+ $key = $val;
+ if ($val == 'id_grupo') {
+ $key = 'group_name';
+ } else if ($val == 'id_agentmodule') {
+ $key = 'module_name';
+ }
+
+ switch ($key) {
+ case 'module_status':
+ echo events_translate_module_status(
+ $row[$key]
+ );
+ break;
+
+ case 'event_type':
+ echo events_translate_event_type(
+ $row[$key]
+ );
+ break;
+
+ case 'criticity':
+ echo events_translate_event_criticity(
+ $row[$key]
+ );
+ break;
+
+ default:
+ echo io_safe_output($row[$key]);
+ break;
+ }
+
+ echo $config['csv_divider'];
+ }
+
+ echo chr(13);
+ }
+ }
+} catch (Exception $e) {
+ echo 'ERROR'.chr(13);
+ echo $e->getMessage();
+ exit;
}
+
+exit;
diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php
index 5daf40d310..936cb6a814 100644
--- a/pandora_console/operation/menu.php
+++ b/pandora_console/operation/menu.php
@@ -373,10 +373,36 @@ if (check_acl($config['id_user'], 0, 'ER')
$pss = get_user_info($config['id_user']);
$hashup = md5($config['id_user'].$pss['password']);
+ $user_filter = db_get_row_sql(
+ sprintf(
+ 'SELECT f.id_filter, f.id_name
+ FROM tevent_filter f
+ INNER JOIN tusuario u
+ ON u.default_event_filter=f.id_filter
+ WHERE u.id_user = "%s" ',
+ $config['id_user']
+ )
+ );
+ if ($user_filter !== false) {
+ $filter = events_get_event_filter($user_filter['id_filter']);
+ } else {
+ // Default.
+ $filter = [
+ 'status' => EVENT_NO_VALIDATED,
+ 'event_view_hr' => $config['event_view_hr'],
+ 'group_rep' => 1,
+ 'tag_with' => [],
+ 'tag_without' => [],
+ 'history' => false,
+ ];
+ }
+
+ $fb64 = base64_encode(json_encode($filter));
+
// RSS.
- $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&search=&event_type=&severity=-1&status=3&id_group=0&refr=0&id_agent=0&pagination=20&group_rep=1&event_view_hr=8&id_user_ack=0&tag_with=&tag_without=&filter_only_alert-1&offset=0&toogle_filter=no&filter_id=0&id_name=&id_group=0&history=0§ion=list&open_filter=0&pure=']['text'] = __('RSS');
- $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&search=&event_type=&severity=-1&status=3&id_group=0&refr=0&id_agent=0&pagination=20&group_rep=1&event_view_hr=8&id_user_ack=0&tag_with=&tag_without=&filter_only_alert-1&offset=0&toogle_filter=no&filter_id=0&id_name=&id_group=0&history=0§ion=list&open_filter=0&pure=']['id'] = 'RSS';
- $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&search=&event_type=&severity=-1&status=3&id_group=0&refr=0&id_agent=0&pagination=20&group_rep=1&event_view_hr=8&id_user_ack=0&tag_with=&tag_without=&filter_only_alert-1&offset=0&toogle_filter=no&filter_id=0&id_name=&id_group=0&history=0§ion=list&open_filter=0&pure=']['type'] = 'direct';
+ $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&fb64='.$fb64]['text'] = __('RSS');
+ $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&fb64='.$fb64]['id'] = 'RSS';
+ $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&fb64='.$fb64]['type'] = 'direct';
// Marquee.
$sub['operation/events/events_marquee.php']['text'] = __('Marquee');
diff --git a/pandora_console/operation/network/network_report.php b/pandora_console/operation/network/network_report.php
index c9f3edf408..d590e224fb 100644
--- a/pandora_console/operation/network/network_report.php
+++ b/pandora_console/operation/network/network_report.php
@@ -62,7 +62,7 @@ $style_period = ($is_period) ? '' : 'display: none;';
// Build the table.
$table = new stdClass();
-$table->class = 'databox';
+$table->class = 'databox filters';
$table->styleTable = 'width: 100%';
$table->data['0']['0'] = __('Data to show').' ';
$table->data['0']['0'] .= html_print_select(
diff --git a/pandora_console/operation/network/network_usage_map.php b/pandora_console/operation/network/network_usage_map.php
index 046cc1fcc4..764cd4eae3 100644
--- a/pandora_console/operation/network/network_usage_map.php
+++ b/pandora_console/operation/network/network_usage_map.php
@@ -67,7 +67,7 @@ $style_period = ($is_period) ? '' : 'display: none;';
// Build the table.
$table = new stdClass();
-$table->class = 'databox';
+$table->class = 'databox filters';
$table->styleTable = 'width: 100%';
$table->data['0']['0'] = '';
diff --git a/pandora_console/operation/users/webchat.php b/pandora_console/operation/users/webchat.php
index db97864863..7e6e58712c 100644
--- a/pandora_console/operation/users/webchat.php
+++ b/pandora_console/operation/users/webchat.php
@@ -79,10 +79,10 @@ $table->class = 'databox filters';
$table->style[0][1] = 'text-align: right; vertical-align: top;';
$table->data[0][0] = '
';
$table->data[0][1] = '
'.__('Users Online').' '.'
';
$table->data[1][0] = '
'.__('Message').' '.html_print_input_text(
'message_box',
diff --git a/pandora_console/operation/visual_console/legacy_view.php b/pandora_console/operation/visual_console/legacy_view.php
index f5eec24096..62ed4fbd18 100644
--- a/pandora_console/operation/visual_console/legacy_view.php
+++ b/pandora_console/operation/visual_console/legacy_view.php
@@ -15,6 +15,7 @@ global $config;
// Login check
require_once $config['homedir'].'/include/functions_visual_map.php';
+ui_require_css_file('visual_maps');
check_login();
diff --git a/pandora_console/operation/visual_console/public_view.php b/pandora_console/operation/visual_console/public_view.php
index 1122daf285..029ef9eb25 100644
--- a/pandora_console/operation/visual_console/public_view.php
+++ b/pandora_console/operation/visual_console/public_view.php
@@ -83,7 +83,7 @@ echo '
';
echo '
';
echo '