added heatmap ajax and class

This commit is contained in:
Daniel Maya 2022-03-07 13:11:54 +01:00
parent 04f6cfc94f
commit 270bb433da
2 changed files with 543 additions and 164 deletions

View File

@ -40,6 +40,7 @@ if (is_ajax() === true) {
if ($getFilters === true) { if ($getFilters === true) {
$refresh = get_parameter('refresh', 30); $refresh = get_parameter('refresh', 30);
$search = get_parameter('search', ''); $search = get_parameter('search', '');
$group = get_parameter('group', true);
echo '<form id="form_dialog" method="post">'; echo '<form id="form_dialog" method="post">';
echo '<div class="div-dialog">'; echo '<div class="div-dialog">';
@ -91,6 +92,11 @@ if (is_ajax() === true) {
'margin-top: 3px;width:70%' 'margin-top: 3px;width:70%'
); );
echo '</div>'; echo '</div>';
echo '<div class="div-dialog">';
echo '<p class="label-dialog">'.__('Show groups').'</p>';
echo html_print_checkbox('group', 1, $group, true);
echo '</div>';
echo '</form>'; echo '</form>';
} }
@ -121,11 +127,8 @@ if (is_ajax() === true) {
echo html_print_select_from_sql( echo html_print_select_from_sql(
'SELECT id_tag, name 'SELECT id_tag, name
FROM ttag FROM ttag
WHERE id_tag NOT IN ( WHERE id_tag
SELECT a.id_tag ORDER BY name',
FROM ttag a, ttag_module b
WHERE a.id_tag = b.id_tag)
ORDER BY name',
'filter[]', 'filter[]',
$filter, $filter,
'', '',
@ -146,12 +149,8 @@ if (is_ajax() === true) {
echo html_print_select_from_sql( echo html_print_select_from_sql(
'SELECT id_tag, name 'SELECT id_tag, name
FROM ttag FROM ttag
WHERE id_tag IN ('.implode(',', $id_user_tags).') AND WHERE id_tag IN ('.implode(',', $id_user_tags).')
id_tag NOT IN ( ORDER BY name',
SELECT a.id_tag
FROM ttag a, ttag_module b
WHERE a.id_tag = b.id_tag)
ORDER BY name',
'filter[]', 'filter[]',
$filter, $filter,
'', '',
@ -168,11 +167,8 @@ if (is_ajax() === true) {
echo html_print_select_from_sql( echo html_print_select_from_sql(
'SELECT id_tag, name 'SELECT id_tag, name
FROM ttag FROM ttag
WHERE id_tag NOT IN ( WHERE id_tag
SELECT a.id_tag ORDER BY name',
FROM ttag a, ttag_module b
WHERE a.id_tag = b.id_tag)
ORDER BY name',
'filter[]', 'filter[]',
$filter, $filter,
'', '',
@ -191,6 +187,8 @@ if (is_ajax() === true) {
case 2: case 2:
$module_groups = modules_get_modulegroups(); $module_groups = modules_get_modulegroups();
// $module_groups[0] = _('Not assigned');
// hd(current($filter));
echo '<p class="label-dialog">'.__('Module group').'</p>'; echo '<p class="label-dialog">'.__('Module group').'</p>';
echo html_print_select( echo html_print_select(
$module_groups, $module_groups,
@ -198,13 +196,18 @@ if (is_ajax() === true) {
$filter, $filter,
'', '',
_('Not assigned'), _('Not assigned'),
'', 0,
true, true,
false, false,
false, false,
'', '',
false, false,
'width: 70%' 'width: 70%',
false,
false,
false,
'',
true
); );
break; break;
} }
@ -216,9 +219,72 @@ if (is_ajax() === true) {
$id = get_parameter('id', 0); $id = get_parameter('id', 0);
switch ($type) { switch ($type) {
case 2: case 2:
$data = db_get_row('tagente_modulo', 'id_agente_modulo', $id);
// Nombre.
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Module name').'</p>';
echo '<a class="info-dialog">'.$data['nombre'].'</a>';
echo '</div>';
// Descripcion.
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Description').'</p>';
echo '<p class="info-dialog">'.$data['descripcion'].'</p>';
echo '</div>';
// Agent.
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Agent').'</p>';
echo '<a href="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$data['id_agente'].'"
class="info-dialog" target="_blank">'.agents_get_alias($data['id_agente']).'</a>';
echo '</div>';
// Group.
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Group').'</p>';
echo '<p class="info-dialog">'.modules_get_modulegroup_name($data['id_module_group']).'</p>';
echo '</div>';
break; break;
case 1: case 1:
$data = db_get_row('tagente_modulo', 'id_agente_modulo', $id);
// Nombre.
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Module name').'</p>';
echo '<a class="info-dialog">'.$data['nombre'].'</a>';
echo '</div>';
// Descripcion.
echo '<div class="div-dialog">';
echo '<p sclass="title-dialog">'.__('Description').'</p>';
echo '<p class="info-dialog">'.$data['descripcion'].'</p>';
echo '</div>';
// Agent.
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Agent').'</p>';
echo '<a href="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$data['id_agente'].'"
class="info-dialog" target="_blank">'.agents_get_alias($data['id_agente']).'</a>';
echo '</div>';
// Group.
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Group').'</p>';
echo '<p class="info-dialog">'.modules_get_modulegroup_name($data['id_module_group']).'</p>';
echo '</div>';
// Tag.
$tags = db_get_all_rows_sql('SELECT id_tag FROM ttag_module WHERE id_agente_modulo ='.$id);
$tags_name = '';
echo '<div class="div-dialog">';
echo '<p class="title-dialog">'.__('Tag').'</p>';
foreach ($tags as $key => $tag) {
$tags_name .= tags_get_name($tag['id_tag']).', ';
}
$tags_name = trim($tags_name, ', ');
echo '<p class="info-dialog">'.$tags_name.'</p>';
echo '</div>';
break; break;
case 0: case 0:
@ -227,32 +293,33 @@ if (is_ajax() === true) {
// Alias. // Alias.
echo '<div class="div-dialog">'; echo '<div class="div-dialog">';
echo '<p style="width:40%;font-weight: bold;padding-left: 20px;">'.__('Agent').'</p>'; echo '<p class="title-dialog">'.__('Agent').'</p>';
echo '<a style="width:60%;font-weight: bold;">'.$data['alias'].'</a>'; echo '<a href="index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$data['id_agente'].'"
class="info-dialog" target="_blank">'.$data['alias'].'</a>';
echo '</div>'; echo '</div>';
// Ip. // Ip.
echo '<div class="div-dialog">'; echo '<div class="div-dialog">';
echo '<p style="width:40%;font-weight: bold;padding-left: 20px;">'.__('IP').'</p>'; echo '<p class="title-dialog">'.__('IP').'</p>';
echo '<p style="width:60%;font-weight: bold;">'.$data['direccion'].'</p>'; echo '<p class="info-dialog">'.$data['direccion'].'</p>';
echo '</div>'; echo '</div>';
// OS. // OS.
echo '<div class="div-dialog">'; echo '<div class="div-dialog">';
echo '<p style="width:40%;font-weight: bold;padding-left: 20px;">'.__('OS').'</p>'; echo '<p class="title-dialog">'.__('OS').'</p>';
echo '<p style="width:60%;font-weight: bold;">'.ui_print_os_icon($data['id_os'], true, true).'</p>'; echo '<p class="info-dialog">'.ui_print_os_icon($data['id_os'], true, true).'</p>';
echo '</div>'; echo '</div>';
// Description. // Description.
echo '<div class="div-dialog">'; echo '<div class="div-dialog">';
echo '<p style="width:40%;font-weight: bold;padding-left: 20px;">'.__('Description').'</p>'; echo '<p class="title-dialog">'.__('Description').'</p>';
echo '<p style="width:60%;font-weight: bold;">'.$data['comentarios'].'</p>'; echo '<p class="info-dialog">'.$data['comentarios'].'</p>';
echo '</div>'; echo '</div>';
// Group. // Group.
echo '<div class="div-dialog">'; echo '<div class="div-dialog">';
echo '<p style="width:40%;font-weight: bold;padding-left: 20px;">'.__('Group').'</p>'; echo '<p class="title-dialog">'.__('Group').'</p>';
echo '<p style="width:60%;font-weight: bold;">'.groups_get_name($data['id_grupo']).'</p>'; echo '<p class="info-dialog">'.groups_get_name($data['id_grupo']).'</p>';
echo '</div>'; echo '</div>';
// Events. // Events.
@ -260,7 +327,7 @@ if (is_ajax() === true) {
echo graph_graphic_agentevents( echo graph_graphic_agentevents(
$id, $id,
100, 100,
40, 80,
SECONDS_1DAY, SECONDS_1DAY,
'', '',
true, true,

View File

@ -88,6 +88,13 @@ class Heatmap
*/ */
protected $search = null; protected $search = null;
/**
* Heatmap group.
*
* @var integer
*/
protected $group = null;
/** /**
* Constructor function * Constructor function
@ -99,6 +106,7 @@ class Heatmap
* @param integer $width Width. * @param integer $width Width.
* @param integer $height Height. * @param integer $height Height.
* @param string $search Heatmap search. * @param string $search Heatmap search.
* @param integer $group Heatmap group.
*/ */
public function __construct( public function __construct(
int $type=0, int $type=0,
@ -107,7 +115,8 @@ class Heatmap
int $refresh=300, int $refresh=300,
int $width=0, int $width=0,
int $height=0, int $height=0,
string $search=null string $search=null,
int $group=1
) { ) {
$this->type = $type; $this->type = $type;
$this->filter = $filter; $this->filter = $filter;
@ -116,6 +125,7 @@ class Heatmap
$this->width = $width; $this->width = $width;
$this->height = $height; $this->height = $height;
$this->search = $search; $this->search = $search;
$this->group = $group;
} }
@ -145,6 +155,7 @@ class Heatmap
'filter' => $this->filter, 'filter' => $this->filter,
'refresh' => $this->refresh, 'refresh' => $this->refresh,
'search' => $this->search, 'search' => $this->search,
'group' => $this->group,
], ],
]; ];
@ -155,7 +166,7 @@ class Heatmap
const randomId = '<?php echo $this->randomId; ?>'; const randomId = '<?php echo $this->randomId; ?>';
const refresh = '<?php echo $this->refresh; ?>'; const refresh = '<?php echo $this->refresh; ?>';
let setting = <?php echo json_encode($settings); ?>; let setting = <?php echo json_encode($settings); ?>;
setting['data']['height'] = $(`#div_${randomId}`).height(); setting['data']['height'] = $(`#div_${randomId}`).height() + 10;
setting['data']['width'] = $(`#div_${randomId}`).width(); setting['data']['width'] = $(`#div_${randomId}`).width();
// Initial charge. // Initial charge.
@ -180,8 +191,11 @@ class Heatmap
page: "operation/heatmap", page: "operation/heatmap",
method: 'getDataJson', method: 'getDataJson',
randomId: randomId, randomId: randomId,
type: '<?php echo $this->type; ?>', type: setting['data']['type'],
refresh: '<?php echo $this->refresh; ?>' refresh: setting['data']['refresh'],
filter: setting['data']['filter'],
search: setting['data']['search'],
group: setting['data']['group']
}, },
dataType: 'json', dataType: 'json',
success: function(data) { success: function(data) {
@ -200,19 +214,8 @@ class Heatmap
const timer = setInterval( const timer = setInterval(
function() { function() {
while (cont <= limit) { while (cont <= limit) {
if ($(`#${randomId}_${lista[cont]['id']}`).hasClass(`${lista[cont]['status']}`)) { $(`#${randomId}_${lista[cont]['id']}`).removeClass();
let test = $(`#${randomId}_${lista[cont]['id']}`).css("filter"); $(`#${randomId}_${lista[cont]['id']}`).addClass(`${lista[cont]['status']} hover`);
if (test !== 'none') {
// console.log(test)
// console.log(test.match('/(\d+\.\d|\d)/'));
} else {
$(`#${randomId}_${lista[cont]['id']}`).css("filter", "brightness(1.1)");
}
} else {
$(`#${randomId}_${lista[cont]['id']}`).removeClass("normal critical warning unknown");
$(`#${randomId}_${lista[cont]['id']}`).addClass(`${lista[cont]['status']}`);
$(`#${randomId}_${lista[cont]['id']}`).css("filter", "brightness(1)");
}
cont++; cont++;
} }
@ -297,36 +300,28 @@ class Heatmap
{ {
$filter['disabled'] = 0; $filter['disabled'] = 0;
$alias = '';
if (empty($this->search) === false) { if (empty($this->search) === false) {
$filter['search'] = ' AND alias LIKE "%'.$this->search.'%"'; $alias = ' AND alias LIKE "%'.$this->search.'%"';
} }
if (empty($this->filter) === false) { $id_grupo = '';
if (empty($this->filter) === false && current($this->filter) != 0) {
$filter['id_grupo'] = current($this->filter); $filter['id_grupo'] = current($this->filter);
$id_grupo = ' AND id_grupo = '.current($this->filter);
} }
// All agents. // All agents.
$result = agents_get_agents( $sql = sprintf(
$filter, 'SELECT DISTINCT id_agente as id,alias,id_grupo,normal_count,warning_count,critical_count, unknown_count,notinit_count,total_count,fired_count,
[ (SELECT last_status_change FROM tagente_estado WHERE id_agente = tagente.id_agente ORDER BY last_status_change DESC LIMIT 1) AS last_status_change
'id_agente as id', FROM tagente WHERE `disabled` = 0 %s %s ORDER BY id_grupo,id_agente ASC',
'alias', $alias,
'id_grupo', $id_grupo
'normal_count',
'warning_count',
'critical_count',
'unknown_count',
'notinit_count',
'total_count',
'fired_count',
],
'AR',
[
'field' => 'id_grupo,id_agente',
'order' => 'ASC',
]
); );
$result = db_get_all_rows_sql($sql);
$agents = []; $agents = [];
// Agent status. // Agent status.
foreach ($result as $key => $agent) { foreach ($result as $key => $agent) {
@ -342,23 +337,259 @@ class Heatmap
$status = 'normal'; $status = 'normal';
} }
if ($agent['last_status_change'] != 0) {
$seconds = (time() - $agent['last_status_change']);
if ($seconds >= SECONDS_1DAY) {
$status .= '_10';
} else if ($seconds >= 77760) {
$status .= '_9';
} else if ($seconds >= 69120) {
$status .= '_8';
} else if ($seconds >= 60480) {
$status .= '_7';
} else if ($seconds >= 51840) {
$status .= '_6';
} else if ($seconds >= 43200) {
$status .= '_5';
} else if ($seconds >= 34560) {
$status .= '_4';
} else if ($seconds >= 25920) {
$status .= '_3';
} else if ($seconds >= 17280) {
$status .= '_2';
} else if ($seconds >= 8640) {
$status .= '_1';
}
}
$agents[$key] = $agent; $agents[$key] = $agent;
$agents[$key]['status'] = $status; $agents[$key]['status'] = $status;
} }
// -------------------Agent generator-------------------- return $agents;
$a = 1; }
$agents = [];
$total = 1010;
while ($a <= $total) { /**
$agents[$a]['id'] = $a; * Get all modules
$agents[$a]['status'] = $this->statusColour(rand(4, 0)); *
$agents[$a]['id_grupo'] = ceil($a / 20); * @return array
$a++; */
protected function getAllModulesByGroup()
{
$filter_group = '';
if (empty($this->filter) === false && current($this->filter) != -1) {
$filter_group = 'AND am.id_module_group ='.current($this->filter);
} }
// ------------------------------------------- $filter_name = '';
return $agents; if (empty($this->search) === false) {
$filter_name = 'AND nombre LIKE "%'.$this->search.'%"';
}
// All modules.
$sql = sprintf(
'SELECT am.id_agente_modulo AS id, ae.known_status AS `status`, am.id_module_group AS id_grupo, ae.last_status_change FROM tagente_modulo am
INNER JOIN tagente_estado ae ON am.id_agente_modulo = ae.id_agente_modulo
WHERE am.disabled = 0 %s %s GROUP BY am.id_module_group, am.id_agente_modulo',
$filter_group,
$filter_name
);
$result = db_get_all_rows_sql($sql);
// Module status.
foreach ($result as $key => $module) {
$status = '';
switch ($module['status']) {
case AGENT_MODULE_STATUS_CRITICAL_BAD:
case AGENT_MODULE_STATUS_CRITICAL_ALERT:
case 1:
case 100:
$status = 'critical';
break;
case AGENT_MODULE_STATUS_NORMAL:
case AGENT_MODULE_STATUS_NORMAL_ALERT:
case 0:
case 300:
$status = 'normal';
break;
case AGENT_MODULE_STATUS_WARNING:
case AGENT_MODULE_STATUS_WARNING_ALERT:
case 2:
case 200:
$status = 'warning';
break;
default:
case AGENT_MODULE_STATUS_UNKNOWN:
case 3:
$status = 'unknown';
break;
case AGENT_MODULE_STATUS_NOT_INIT:
case 5:
$status = 'notinit';
break;
}
if ($module['last_status_change'] != 0) {
$seconds = (time() - $module['last_status_change']);
if ($seconds >= SECONDS_1DAY) {
$status .= '_10';
} else if ($seconds >= 77760) {
$status .= '_9';
} else if ($seconds >= 69120) {
$status .= '_8';
} else if ($seconds >= 60480) {
$status .= '_7';
} else if ($seconds >= 51840) {
$status .= '_6';
} else if ($seconds >= 43200) {
$status .= '_5';
} else if ($seconds >= 34560) {
$status .= '_4';
} else if ($seconds >= 25920) {
$status .= '_3';
} else if ($seconds >= 17280) {
$status .= '_2';
} else if ($seconds >= 8640) {
$status .= '_1';
}
}
$result[$key]['status'] = $status;
}
return $result;
}
/**
* Get all modules
*
* @return array
*/
protected function getAllModulesByTag()
{
$filter_tag = '';
if (empty($this->filter) === false && $this->filter[0] !== '0') {
foreach ($this->filter as $key => $value) {
$filter_tag .= ' AND tm.id_tag ='.$value;
}
}
$filter_name = '';
if (empty($this->search) === false) {
$filter_name = 'AND nombre LIKE "%'.$this->search.'%"';
}
// All modules.
$sql = sprintf(
'SELECT ae.id_agente_modulo AS id, ae.known_status AS `status`, tm.id_tag AS id_grupo, ae.last_status_change FROM tagente_estado ae
INNER JOIN ttag_module tm ON tm.id_agente_modulo = ae.id_agente_modulo
WHERE 1=1 %s %s GROUP BY tm.id_tag, ae.id_agente_modulo',
$filter_tag,
$filter_name
);
$result = db_get_all_rows_sql($sql);
// Module status.
foreach ($result as $key => $module) {
$status = '';
switch ($module['status']) {
case AGENT_MODULE_STATUS_CRITICAL_BAD:
case AGENT_MODULE_STATUS_CRITICAL_ALERT:
case 1:
case 100:
$status = 'critical';
break;
case AGENT_MODULE_STATUS_NORMAL:
case AGENT_MODULE_STATUS_NORMAL_ALERT:
case 0:
case 300:
$status = 'normal';
break;
case AGENT_MODULE_STATUS_WARNING:
case AGENT_MODULE_STATUS_WARNING_ALERT:
case 2:
case 200:
$status = 'warning';
break;
default:
case AGENT_MODULE_STATUS_UNKNOWN:
case 3:
$status = 'unknown';
break;
case AGENT_MODULE_STATUS_NOT_INIT:
case 5:
$status = 'notinit';
break;
}
if ($module['last_status_change'] != 0) {
$seconds = (time() - $module['last_status_change']);
if ($seconds >= SECONDS_1DAY) {
$status .= '_10';
} else if ($seconds >= 77760) {
$status .= '_9';
} else if ($seconds >= 69120) {
$status .= '_8';
} else if ($seconds >= 60480) {
$status .= '_7';
} else if ($seconds >= 51840) {
$status .= '_6';
} else if ($seconds >= 43200) {
$status .= '_5';
} else if ($seconds >= 34560) {
$status .= '_4';
} else if ($seconds >= 25920) {
$status .= '_3';
} else if ($seconds >= 17280) {
$status .= '_2';
} else if ($seconds >= 8640) {
$status .= '_1';
}
}
$result[$key]['status'] = $status;
}
return $result;
}
/**
* GetData
*
* @return array
*/
public function getData()
{
switch ($this->type) {
case 2:
$data = $this->getAllModulesByGroup();
break;
case 1:
$data = $this->getAllModulesByTag();
break;
case 0:
default:
$data = $this->getAllAgents();
break;
}
return $data;
} }
@ -369,7 +600,7 @@ class Heatmap
*/ */
public function getDataJson() public function getDataJson()
{ {
$return = $this->getAllAgents(); $return = $this->getData();
echo json_encode($return); echo json_encode($return);
return ''; return '';
} }
@ -447,12 +678,7 @@ class Heatmap
*/ */
public function showHeatmap() public function showHeatmap()
{ {
switch ($this->type) { $result = $this->getData();
case 0:
default:
$result = $this->getAllAgents();
break;
}
$scale = ($this->width / $this->height); $scale = ($this->width / $this->height);
@ -466,7 +692,7 @@ class Heatmap
$Yaxis $Yaxis
); );
echo '<svg id="svg_'.$this->randomId.'" width="'.$this->width.'" echo '<svg id="svg_'.$this->randomId.'" width="'.$this->width.'"
height="'.$this->height.'" viewBox="'.$viewBox.'">'; height="'.$this->height.'" viewBox="'.$viewBox.'">';
$groups = []; $groups = [];
@ -525,101 +751,187 @@ class Heatmap
}); });
</script> </script>
<?php <?php
$x_back = 0; if (count($groups) > 1 && $this->group === 1) {
$y_back = 0; $x_back = 0;
echo '<polyline points="0,0 0,1" class="polyline" />'; $y_back = 0;
echo '<polyline points="'.$contX.','.$contY.' '.$contX.','.($contY + 1).'" class="polyline" />';
echo '<polyline points="'.$contX.','.$contY.' '.$Xaxis.','.$contY.'" class="polyline" />';
foreach ($groups as $group) {
if (($x_back + $group) <= $Xaxis) {
$x_position = ($x_back + $group);
$y_position = $y_back;
$points = sprintf( echo '<polyline points="0,0 '.$Xaxis.',0" class="polyline" />';
'%d,%d %d,%d %d,%d %d,%d', foreach ($groups as $key => $group) {
$x_position, $name = '';
$y_back, switch ($this->type) {
$x_back, case 2:
$y_back, $name = modules_get_modulegroup_name($key);
$x_back, break;
($y_position + 1),
$x_position,
($y_position + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />'; case 1:
$name = tags_get_name($key);
break;
$x_back = $x_position; case 0:
if ($x_position === $Xaxis) { default:
$points = sprintf( $name = groups_get_name($key);
'%d,%d %d,%d', break;
$x_position,
$y_back,
$x_position,
($y_back + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />';
$y_back ++;
$x_back = 0;
} }
} else {
$round = (int) floor(($x_back + $group) / $Xaxis);
$y_position = ($round + $y_back);
// Top of the first line. if (($x_back + $group) <= $Xaxis) {
$points = sprintf( $x_position = ($x_back + $group);
'%d,%d %d,%d %d,%d', $y_position = $y_back;
$x_back,
($y_back + 1),
$x_back,
$y_back,
$Xaxis,
$y_back
);
echo '<polyline points="'.$points.'" class="polyline" />'; if ($y_back === 0 && $x_back === 0) {
$points = sprintf(
'%d,%d %d,%d',
$x_back,
$y_back,
$x_back,
($y_back + 1)
);
if ($round === 1) { echo '<polyline points="'.$points.'" class="polyline" />';
// One line.
$x_position = (($x_back + $group) - $Xaxis);
// Bottom of last line.
$points = sprintf(
'%d,%d %d,%d',
0,
($y_position + 1),
$x_position,
($y_position + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />';
} else {
// Two or more lines.
$x_position = (($x_back + $group) - ($Xaxis * $round));
if ($x_position === 0) {
$x_position = $Xaxis;
} }
// Bottom of last line.
$points = sprintf( $points = sprintf(
'%d,%d %d,%d', '%d,%d %d,%d %d,%d',
0, $x_back,
($y_position + 1), ($y_position + 1),
$x_position, $x_position,
($y_position + 1) ($y_position + 1),
$x_position,
$y_back
); );
echo '<polyline points="'.$points.'" class="polyline" />'; echo '<polyline points="'.$points.'" class="polyline" />';
}
if ($x_position === $Xaxis) { // Name.
$x_position = 0; echo '<text x="'.((($x_position - $x_back) / 2) + $x_back).'" y="'.($y_position + 1).'"
} dominant-baseline="middle" style="font-size:0.4">'.$name.'</text>';
$x_back = $x_position; $x_back = $x_position;
$y_back = $y_position; if ($x_position === $Xaxis) {
$points = sprintf(
'%d,%d %d,%d',
$x_position,
$y_back,
$x_position,
($y_back + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />';
$y_back++;
$x_back = 0;
}
} else {
$round = (int) floor(($x_back + $group) / $Xaxis);
$y_position = ($round + $y_back);
if ($round === 1) {
// One line.
$x_position = (($x_back + $group) - $Xaxis);
if ($x_position <= $x_back) {
// Bottom line.
$points = sprintf(
'%d,%d %d,%d',
$x_back,
$y_position,
$Xaxis,
($y_position)
);
echo '<polyline points="'.$points.'" class="polyline" />';
}
// Bottom of last line.
$points = sprintf(
'%d,%d %d,%d',
0,
($y_position + 1),
$x_position,
($y_position + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />';
// Name.
echo '<text x="'.(($x_position) / 2).'" y="'.($y_position + 1).'"
dominant-baseline="middle" style="font-size:0.4">'.$name.'</text>';
// Bottom-right of last line.
$points = sprintf(
'%d,%d %d,%d',
$x_position,
($y_position),
$x_position,
($y_position + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />';
if ($x_position > $x_back) {
// Bottom-top of last line.
$points = sprintf(
'%d,%d %d,%d',
$x_position,
($y_position),
$Xaxis,
($y_position)
);
echo '<polyline points="'.$points.'" class="polyline" />';
}
} else {
// Two or more lines.
$x_position = (($x_back + $group) - ($Xaxis * $round));
if ($x_position === 0) {
$x_position = $Xaxis;
}
// Bottom of last line.
$points = sprintf(
'%d,%d %d,%d',
0,
($y_position + 1),
$x_position,
($y_position + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />';
// Bottom-right of last line.
$points = sprintf(
'%d,%d %d,%d',
$x_position,
($y_position),
$x_position,
($y_position + 1)
);
echo '<polyline points="'.$points.'" class="polyline" />';
// Name.
echo '<text x="'.(($x_position) / 2).'" y="'.($y_position + 1).'"
dominant-baseline="middle" style="font-size:0.4">'.$name.'</text>';
// Bottom-top of last line.
$points = sprintf(
'%d,%d %d,%d',
$x_position,
($y_position),
$Xaxis,
($y_position)
);
echo '<polyline points="'.$points.'" class="polyline" />';
}
if ($x_position === $Xaxis) {
$x_position = 0;
}
$x_back = $x_position;
$y_back = $y_position;
}
} }
} }