Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'feature/svg-chart-tooltips-7024'
- Loading branch information
Showing
17 changed files
with
803 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
<?php | ||
// {{{ICINGA_LICENSE_HEADER}}} | ||
// {{{ICINGA_LICENSE_HEADER}}} | ||
|
||
namespace Icinga\Chart\Graph; | ||
|
||
/** | ||
* A tooltip that stores and aggregates information about displayed data | ||
* points of a graph and replaces them in a format string to render the description | ||
* for specific data points of the graph. | ||
* | ||
* When render() is called, placeholders for the keys for each data entry will be replaced by | ||
* the current value of this data set and the formatted string will be returned. | ||
* The content of the replaced keys can change for each data set and depends on how the data | ||
* is passed to this class. There are several types of properties: | ||
* | ||
* <ul> | ||
* <li>Global properties</li>: Key-value pairs that stay the same every time render is called, and are | ||
* passed to an instance in the constructor. | ||
* <li>Aggregated properties</li>: Global properties that are created automatically from | ||
* all attached data points. | ||
* <li>Local properties</li>: Key-value pairs that only apply to a single data point and | ||
* are passed to the render-function. | ||
* </ul> | ||
*/ | ||
class Tooltip | ||
{ | ||
/** | ||
* The default format string used | ||
* when no other format is specified | ||
* | ||
* @var string | ||
*/ | ||
private $defaultFormat; | ||
|
||
/** | ||
* All aggregated points | ||
* | ||
* @var array | ||
*/ | ||
private $points = array(); | ||
|
||
/** | ||
* Contains all static replacements | ||
* | ||
* @var array | ||
*/ | ||
private $data = array( | ||
'sum' => 0 | ||
); | ||
|
||
/** | ||
* Used to format the displayed tooltip. | ||
* | ||
* @var string | ||
*/ | ||
protected $tooltipFormat; | ||
|
||
/** | ||
* Create a new tooltip with the specified default format string | ||
* | ||
* Allows you to set the global data for this tooltip, that is displayed every | ||
* time render is called. | ||
* | ||
* @param array $data Map of global properties | ||
* @param string $format The default format string | ||
*/ | ||
public function __construct ( | ||
$data = array(), | ||
$format = '<b>{title}</b></b><br> {value} of {sum} {label}' | ||
) { | ||
$this->data = array_merge($this->data, $data); | ||
$this->defaultFormat = $format; | ||
} | ||
|
||
/** | ||
* Add a single data point to update the aggregated properties for this tooltip | ||
* | ||
* @param $point array Contains the (x,y) values of the data set | ||
*/ | ||
public function addDataPoint($point) | ||
{ | ||
// set x-value | ||
if (!isset($this->data['title'])) { | ||
$this->data['title'] = $point[0]; | ||
} | ||
|
||
// aggregate y-values | ||
$y = (int)$point[1]; | ||
if (isset($point[2])) { | ||
// load original value in case value already aggregated | ||
$y = (int)$point[2]; | ||
} | ||
|
||
if (!isset($this->data['min']) || $this->data['min'] > $y) { | ||
$this->data['min'] = $y; | ||
} | ||
if (!isset($this->data['max']) || $this->data['max'] < $y) { | ||
$this->data['max'] = $y; | ||
} | ||
$this->data['sum'] += $y; | ||
$this->points[] = $y; | ||
} | ||
|
||
/** | ||
* Format the tooltip for a certain data point | ||
* | ||
* @param array $order Which data set to render | ||
* @param array $data The local data for this tooltip | ||
* @param string $format Use a custom format string for this data set | ||
* | ||
* @return mixed|string The tooltip value | ||
*/ | ||
public function render($order, $data = array(), $format = null) | ||
{ | ||
if (isset($format)) { | ||
$str = $format; | ||
} else { | ||
$str = $this->defaultFormat; | ||
} | ||
$data['value'] = $this->points[$order]; | ||
foreach (array_merge($this->data, $data) as $key => $value) { | ||
$str = str_replace('{' . $key . '}', $value, $str); | ||
} | ||
return $str; | ||
} | ||
|
||
/** | ||
* Format the tooltip for a certain data point but remove all | ||
* occurring html tags | ||
* | ||
* This is useful for rendering clean tooltips on client without JavaScript | ||
* | ||
* @param array $order Which data set to render | ||
* @param array $data The local data for this tooltip | ||
* @param string $format Use a custom format string for this data set | ||
* | ||
* @return mixed|string The tooltip value, without any HTML tags | ||
*/ | ||
public function renderNoHtml($order, $data, $format) | ||
{ | ||
return strip_tags($this->render($order, $data, $format)); | ||
} | ||
} |
Oops, something went wrong.