weekly release 3.9.3+
[moodle.git] / lib / classes / chart_series.php
blob5db4ede4aedd57087d75445a9a0d9caaed0f083a
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
17 /**
18 * Chart series.
20 * @package core
21 * @copyright 2016 Frédéric Massart - FMCorz.net
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 namespace core;
26 defined('MOODLE_INTERNAL') || die();
28 use coding_exception;
29 use JsonSerializable;
31 /**
32 * Chart series class.
34 * @package core
35 * @copyright 2016 Frédéric Massart - FMCorz.net
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 class chart_series implements JsonSerializable {
40 /** Default type for a series. */
41 const TYPE_DEFAULT = null;
42 /** Series of type line. */
43 const TYPE_LINE = 'line';
45 /** @var string[] Colors of the series. */
46 protected $colors = [];
47 /** @var string Fill mode for area charts. See https://www.chartjs.org/docs/latest/charts/area.html */
48 protected $fill = null;
49 /** @var string Label for this series. */
50 protected $label;
51 /** @var string[] Labels for the values of the series. */
52 protected $labels = null;
53 /** @var bool Whether the line of the serie should be smooth or not. */
54 protected $smooth = null;
55 /** @var string Type of the series. */
56 protected $type = self::TYPE_DEFAULT;
57 /** @var float[] Values of the series. */
58 protected $values = [];
59 /** @var int Index of the X axis. */
60 protected $xaxis = null;
61 /** @var int Index of the Y axis. */
62 protected $yaxis = null;
64 /**
65 * Constructor.
67 * @param string $label The label of the series.
68 * @param float[] $values The values of this series.
70 public function __construct($label, $values) {
71 $this->values = $values;
72 $this->label = $label;
75 /**
76 * Get the color.
78 * @return string|null
80 public function get_color() {
81 return isset($this->color[0]) ? $this->color[0] : null;
84 /**
85 * Get the colors for each value in the series.
87 * @return string[]
89 public function get_colors() {
90 return $this->colors;
93 /**
94 * Get the number of values in this series.
96 * @return int
98 public function get_count() {
99 return count($this->values);
103 * Get area fill mode for series.
105 public function get_fill() {
106 return $this->fill;
110 * Get the label of the series.
112 * @return string
114 public function get_label() {
115 return $this->label;
119 * Set labels for the values of the series.
121 * @return array
123 public function get_labels() {
124 return $this->labels;
128 * Get whether the line of the serie should be smooth or not.
130 * @return bool
132 public function get_smooth() {
133 return $this->smooth;
137 * Get the type of series.
139 * @return string
141 public function get_type() {
142 return $this->type;
146 * Get the values of the series.
148 * @return string[]
150 public function get_values() {
151 return $this->values;
155 * Get the index of the X axis.
157 * @return int
159 public function get_xaxis() {
160 return $this->xaxis;
164 * Get the index of the Y axis.
166 * @return int
168 public function get_yaxis() {
169 return $this->yaxis;
173 * Whether there is a color per value.
175 * @return bool
177 public function has_colored_values() {
178 return count($this->colors) == $this->get_count();
182 * Serialize the object.
184 * @return array
186 public function jsonSerialize() { // @codingStandardsIgnoreLine (CONTRIB-6469).
187 $data = [
188 'label' => $this->label,
189 'labels' => $this->labels,
190 'type' => $this->type,
191 'values' => $this->values,
192 'colors' => $this->colors,
193 'fill' => $this->fill,
194 'axes' => [
195 'x' => $this->xaxis,
196 'y' => $this->yaxis,
198 'smooth' => $this->smooth
200 return $data;
204 * Set the color of the series.
206 * @param string $color CSS compatible color.
208 public function set_color($color) {
209 $this->colors = [$color];
213 * Set a color for each value in the series.
215 * @param string[] $colors CSS compatible colors.
217 public function set_colors(array $colors) {
218 $this->colors = $colors;
222 * Set fill mode for the series.
223 * @param string $fill
225 public function set_fill($fill) {
226 $this->fill = $fill;
230 * Set labels for the values of the series.
232 * @param array $labels The labels for the series values.
234 public function set_labels($labels) {
235 $this->labels = $labels;
239 * Set whether the line of the serie should be smooth or not.
241 * Only applicable for line chart or a line series, if null it assumes the chart default (not smooth).
243 * @param bool $smooth True if the line should be smooth, false for tensioned lines.
245 public function set_smooth($smooth) {
246 $this->smooth = $smooth;
250 * Set the type of the series.
252 * @param string $type Constant value from self::TYPE_*.
254 public function set_type($type) {
255 if (!in_array($type, [self::TYPE_DEFAULT, self::TYPE_LINE])) {
256 throw new coding_exception('Invalid serie type.');
258 $this->type = $type;
262 * Set the index of the X axis.
264 * @param int $index The index.
266 public function set_xaxis($index) {
267 $this->xaxis = $index;
271 * Set the index of the Y axis.
273 * @param int $index The index.
275 public function set_yaxis($index) {
276 $this->yaxis = $index;