Added BarsGraph
Former-commit-id: 5733eb9a27a9da12f9a858dccd0509be3b762328
This commit is contained in:
parent
48e9c1466b
commit
4d45ddbf59
|
@ -0,0 +1,355 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Models\VisualConsole\Items;
|
||||
use Models\VisualConsole\Item;
|
||||
|
||||
/**
|
||||
* Model of a bars graph item of the Visual Console.
|
||||
*/
|
||||
final class BarsGraph extends Item
|
||||
{
|
||||
|
||||
/**
|
||||
* Used to enable the fetching, validation and extraction of information
|
||||
* about the linked module.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected static $useLinkedModule = true;
|
||||
|
||||
/**
|
||||
* Used to enable validation, extraction and encodeing of the HTML output.
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected static $useHtmlOutput = true;
|
||||
|
||||
|
||||
/**
|
||||
* Returns a valid representation of the model.
|
||||
*
|
||||
* @param array $data Input data.
|
||||
*
|
||||
* @return array Data structure representing the model.
|
||||
*
|
||||
* @overrides Item::decode.
|
||||
*/
|
||||
protected function decode(array $data): array
|
||||
{
|
||||
$return = parent::decode($data);
|
||||
$return['type'] = BARS_GRAPH;
|
||||
$return['gridColor'] = $this->extractGridColor($data);
|
||||
$return['backgroundColor'] = $this->extractBackgroundColor($data);
|
||||
$return['typeGraph'] = $this->extractTypeGraph($data);
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Extract a grid color value.
|
||||
*
|
||||
* @param array $data Unknown input data structure.
|
||||
*
|
||||
* @return mixed String representing the grid color (not empty) or null.
|
||||
*/
|
||||
private function extractGridColor(array $data)
|
||||
{
|
||||
return static::notEmptyStringOr(
|
||||
static::issetInArray(
|
||||
$data,
|
||||
[
|
||||
'gridColor',
|
||||
'border_color',
|
||||
]
|
||||
),
|
||||
null
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Extract a background color value.
|
||||
*
|
||||
* @param array $data Unknown input data structure.
|
||||
*
|
||||
* @return string One of 'white', 'black' or 'transparent'. 'white' by default.
|
||||
*/
|
||||
private function extractBackgroundColor(array $data): string
|
||||
{
|
||||
$backgroundColor = static::notEmptyStringOr(
|
||||
static::issetInArray(
|
||||
$data,
|
||||
[
|
||||
'backgroundColor',
|
||||
'image',
|
||||
]
|
||||
),
|
||||
null
|
||||
);
|
||||
|
||||
switch ($backgroundColor) {
|
||||
case 'black':
|
||||
case 'transparent':
|
||||
return $backgroundColor;
|
||||
|
||||
default:
|
||||
return 'white';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Extract a type graph value.
|
||||
*
|
||||
* @param array $data Unknown input data structure.
|
||||
*
|
||||
* @return string One of 'vertical' or 'horizontal'. 'vertical' by default.
|
||||
*/
|
||||
private function extractTypeGraph(array $data): string
|
||||
{
|
||||
$typeGraph = static::notEmptyStringOr(
|
||||
static::issetInArray(
|
||||
$data,
|
||||
[
|
||||
'typeGraph',
|
||||
'type_graph',
|
||||
]
|
||||
),
|
||||
null
|
||||
);
|
||||
|
||||
switch ($typeGraph) {
|
||||
case 'vertical':
|
||||
return 'vertical';
|
||||
|
||||
default:
|
||||
return 'horizontal';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fetch a vc item data structure from the database using a filter.
|
||||
*
|
||||
* @param array $filter Filter of the Visual Console Item.
|
||||
*
|
||||
* @return array The Visual Console Item data structure stored into the DB.
|
||||
* @throws \InvalidArgumentException When an agent Id cannot be found.
|
||||
*
|
||||
* @override Item::fetchDataFromDB.
|
||||
*/
|
||||
protected static function fetchDataFromDB(array $filter): array
|
||||
{
|
||||
// Due to this DB call, this function cannot be unit tested without
|
||||
// a proper mock.
|
||||
$data = parent::fetchDataFromDB($filter);
|
||||
|
||||
/*
|
||||
* Retrieve extra data.
|
||||
*/
|
||||
|
||||
// Load config.
|
||||
global $config;
|
||||
|
||||
// Extract needed properties.
|
||||
$gridColor = static::extractGridColor($data);
|
||||
$backGroundColor = static::extractBackgroundColor($data);
|
||||
$typeGraph = static::extractTypeGraph($data);
|
||||
|
||||
// Get the linked agent and module Ids.
|
||||
$linkedModule = static::extractLinkedModule($data);
|
||||
$agentId = $linkedModule['agentId'];
|
||||
$moduleId = $linkedModule['moduleId'];
|
||||
$metaconsoleId = $linkedModule['metaconsoleId'];
|
||||
|
||||
if ($agentId === null) {
|
||||
throw new \InvalidArgumentException('missing agent Id');
|
||||
}
|
||||
|
||||
if ($moduleId === null) {
|
||||
throw new \InvalidArgumentException('missing module Id');
|
||||
}
|
||||
|
||||
// Add colors that will use the graphics.
|
||||
$color = [];
|
||||
|
||||
$color[0] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color1'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[1] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color2'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[2] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color3'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[3] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color4'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[4] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color5'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[5] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color6'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[6] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color7'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[7] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color8'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[8] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color9'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[9] = [
|
||||
'border' => '#000000',
|
||||
'color' => $config['graph_color10'],
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[11] = [
|
||||
'border' => '#000000',
|
||||
'color' => COL_GRAPH9,
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[12] = [
|
||||
'border' => '#000000',
|
||||
'color' => COL_GRAPH10,
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[13] = [
|
||||
'border' => '#000000',
|
||||
'color' => COL_GRAPH11,
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[14] = [
|
||||
'border' => '#000000',
|
||||
'color' => COL_GRAPH12,
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
$color[15] = [
|
||||
'border' => '#000000',
|
||||
'color' => COL_GRAPH13,
|
||||
'alpha' => CHART_DEFAULT_ALPHA,
|
||||
];
|
||||
|
||||
// Maybe connect to node.
|
||||
$nodeConnected = false;
|
||||
if (\is_metaconsole() === true && $metaconsoleId !== null) {
|
||||
$nodeConnected = \metaconsole_connect(
|
||||
null,
|
||||
$metaconsoleId
|
||||
) === NOERR;
|
||||
|
||||
if ($nodeConnected === false) {
|
||||
throw new \InvalidArgumentException(
|
||||
'error connecting to the node'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$module_data = \get_bars_module_data($moduleId);
|
||||
|
||||
$water_mark = [
|
||||
'file' => $config['homedir'].'/images/logo_vertical_water.png',
|
||||
'url' => \ui_get_full_url(false, false, false, false).'images/logo_vertical_water.png',
|
||||
];
|
||||
|
||||
switch ($data['label_position']) {
|
||||
case 'left':
|
||||
$div_start = '<div style="float:left;height:15px;">';
|
||||
$div_end = '</div>';
|
||||
break;
|
||||
|
||||
case 'right':
|
||||
$div_start = '<div style="float:right;height:15px;">';
|
||||
$div_end = '</div>';
|
||||
break;
|
||||
|
||||
default:
|
||||
$div_start = '';
|
||||
$div_end = '';
|
||||
break;
|
||||
}
|
||||
|
||||
if ((int) $data['width'] === 0 || (int) $data['height'] === 0) {
|
||||
$width = 400;
|
||||
$height = 400;
|
||||
} else {
|
||||
$width = (int) $data['width'];
|
||||
$height = (int) $data['height'];
|
||||
}
|
||||
|
||||
if ($typeGraph === 'horizontal') {
|
||||
$graph = $div_start.\hbar_graph(
|
||||
$module_data,
|
||||
$width,
|
||||
$height,
|
||||
$color,
|
||||
[],
|
||||
[],
|
||||
\ui_get_full_url('images/image_problem_area.png', false, false, false),
|
||||
'',
|
||||
'',
|
||||
$water_mark,
|
||||
$config['fontpath'],
|
||||
6,
|
||||
'',
|
||||
0,
|
||||
$config['homeurl'],
|
||||
$backGroundColor,
|
||||
$gridColor
|
||||
).$div_end;
|
||||
} else {
|
||||
$graph = $div_start.\vbar_graph(
|
||||
$module_data,
|
||||
$width,
|
||||
$height,
|
||||
$color,
|
||||
[],
|
||||
[],
|
||||
\ui_get_full_url('images/image_problem_area.png', false, false, false),
|
||||
'',
|
||||
'',
|
||||
$water_mark,
|
||||
$config['fontpath'],
|
||||
6,
|
||||
'',
|
||||
0,
|
||||
$config['homeurl'],
|
||||
$backGroundColor,
|
||||
true,
|
||||
false,
|
||||
$gridColor
|
||||
).$div_end;
|
||||
}
|
||||
|
||||
// Restore connection.
|
||||
if ($nodeConnected === true) {
|
||||
\metaconsole_restore_db();
|
||||
}
|
||||
|
||||
$data['html'] = $graph;
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Models\VisualConsole\Items\BarsGraph;
|
||||
|
||||
/**
|
||||
* Test for the Visual Console Bars Graph Item model.
|
||||
*/
|
||||
class BarsGraphTest extends TestCase
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* Test if the instance is created using a valid data structure.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testCanBeCreatedFromValidUserStructure(): void
|
||||
{
|
||||
$this->assertInstanceOf(
|
||||
BarsGraph::class,
|
||||
BarsGraph::fromArray(
|
||||
[
|
||||
'id' => 7,
|
||||
'type' => BARS_GRAPH,
|
||||
'width' => '600',
|
||||
'height' => '500',
|
||||
'typeGraph' => 'horizontal',
|
||||
'backgroundColor' => 'white',
|
||||
'gridColor' => '#33CCFF',
|
||||
'encodedHtml' => '<h1>Foo</h1>',
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertInstanceOf(
|
||||
BarsGraph::class,
|
||||
BarsGraph::fromArray(
|
||||
[
|
||||
'id' => 23,
|
||||
'type' => BARS_GRAPH,
|
||||
'width' => '800',
|
||||
'height' => '600',
|
||||
'type_graph' => 'vertical',
|
||||
'image' => 'transparent',
|
||||
'border_color' => '#33CCFF',
|
||||
'html' => '<h1>Foo</h1>',
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test if the model has a valid JSON representation.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function testContainerIsRepresentedAsJson(): void
|
||||
{
|
||||
$this->assertEquals(
|
||||
'{"aclGroupId":null,"agentId":null,"agentName":null,"backgroundColor":"transparent","encodedHtml":"PGgxPkZvbzwvaDE+","gridColor":"#33CCFF","height":0,"id":7,"isLinkEnabled":true,"isOnTop":false,"label":null,"labelPosition":"up","moduleId":null,"moduleName":null,"parentId":null,"type":18,"typeGraph":"vertical","width":0,"x":-666,"y":76}',
|
||||
(string) BarsGraph::fromArray(
|
||||
[
|
||||
'id' => 7,
|
||||
'type' => DONUT_GRAPH,
|
||||
'label' => null,
|
||||
'labelPosition' => 'up',
|
||||
'isLinkEnabled' => true,
|
||||
'isOnTop' => false,
|
||||
'parentId' => null,
|
||||
'width' => '0',
|
||||
'height' => '0',
|
||||
'x' => -666,
|
||||
'y' => 76,
|
||||
'type_graph' => 'vertical',
|
||||
'image' => 'transparent',
|
||||
'border_color' => '#33CCFF',
|
||||
'html' => '<h1>Foo</h1>',
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'{"aclGroupId":null,"agentId":null,"agentName":null,"backgroundColor":"white","encodedHtml":"PGgxPkZvbzwvaDE+","gridColor":"#33CCFF","height":300,"id":7,"isLinkEnabled":true,"isOnTop":false,"label":"test","labelPosition":"left","moduleId":null,"moduleName":null,"parentId":null,"type":18,"typeGraph":"horizontal","width":300,"x":-666,"y":76}',
|
||||
(string) BarsGraph::fromArray(
|
||||
[
|
||||
'id' => 7,
|
||||
'type' => DONUT_GRAPH,
|
||||
'label' => 'test',
|
||||
'labelPosition' => 'left',
|
||||
'isLinkEnabled' => true,
|
||||
'isOnTop' => false,
|
||||
'parentId' => null,
|
||||
'width' => '300',
|
||||
'height' => '300',
|
||||
'x' => -666,
|
||||
'y' => 76,
|
||||
'typeGraph' => 'horizontal',
|
||||
'backgroundColor' => 'white',
|
||||
'gridColor' => '#33CCFF',
|
||||
'encodedHtml' => 'PGgxPkZvbzwvaDE+',
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -57,7 +57,7 @@ class DonutGraphTest extends TestCase
|
|||
public function testContainerIsRepresentedAsJson(): void
|
||||
{
|
||||
$this->assertEquals(
|
||||
'{"aclGroupId":null,"agentId":null,"agentName":null,"legendBackgroundColor":"#33CCFF","encodedHtml":"PGgxPkZvbzwvaDE+","height":0,"id":7,"isLinkEnabled":true,"isOnTop":false,"label":null,"labelPosition":"up","linkedLayoutAgentId":null,"linkedLayoutId":null,"linkedLayoutStatusType":"default","moduleId":null,"moduleName":null,"parentId":null,"type":17,"width":0,"x":-666,"y":76}',
|
||||
'{"aclGroupId":null,"agentId":null,"agentName":null,"encodedHtml":"PGgxPkZvbzwvaDE+","height":0,"id":7,"isLinkEnabled":true,"isOnTop":false,"label":null,"labelPosition":"up","legendBackgroundColor":"#33CCFF","linkedLayoutAgentId":null,"linkedLayoutId":null,"linkedLayoutStatusType":"default","moduleId":null,"moduleName":null,"parentId":null,"type":17,"width":0,"x":-666,"y":76}',
|
||||
(string) DonutGraph::fromArray(
|
||||
[
|
||||
'id' => 7,
|
||||
|
@ -78,7 +78,7 @@ class DonutGraphTest extends TestCase
|
|||
);
|
||||
|
||||
$this->assertEquals(
|
||||
'{"aclGroupId":null,"agentId":null,"agentName":null,"legendBackgroundColor":"#000000","encodedHtml":"PGgxPkZvbzwvaDE+","height":0,"id":7,"isLinkEnabled":true,"isOnTop":false,"label":null,"labelPosition":"left","linkedLayoutAgentId":null,"linkedLayoutId":null,"linkedLayoutStatusType":"default","moduleId":null,"moduleName":null,"parentId":null,"type":17,"width":0,"x":-666,"y":76}',
|
||||
'{"aclGroupId":null,"agentId":null,"agentName":null,"encodedHtml":"PGgxPkZvbzwvaDE+","height":0,"id":7,"isLinkEnabled":true,"isOnTop":false,"label":null,"labelPosition":"left","legendBackgroundColor":"#000000","linkedLayoutAgentId":null,"linkedLayoutId":null,"linkedLayoutStatusType":"default","moduleId":null,"moduleName":null,"parentId":null,"type":17,"width":0,"x":-666,"y":76}',
|
||||
(string) DonutGraph::fromArray(
|
||||
[
|
||||
'id' => 7,
|
||||
|
|
Loading…
Reference in New Issue