summaryrefslogtreecommitdiffstats
path: root/library/Icinga/Chart/Graph/Tooltip.php
blob: 7236685fa5ebdac03499bf80967871ebcc5349da (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
/* Icinga Web 2 | (c) 2014 Icinga Development Team | GPLv2+ */

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>: {value} {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));
    }
}