Spaces:
No application file
No application file
| namespace Mautic\CoreBundle\Helper\Chart; | |
| /** | |
| * Line chart requires the same data as Bar chart. | |
| */ | |
| class LineChart extends AbstractChart implements ChartInterface | |
| { | |
| /** | |
| * Match date/time unit to a humanly readable label | |
| * {@link php.net/manual/en/function.date.php#refsect1-function.date-parameters}. | |
| * | |
| * @var array | |
| */ | |
| protected $labelFormats = [ | |
| 's' => 'H:i:s', | |
| 'i' => 'H:i', | |
| 'H' => 'M j ga', | |
| 'd' => 'M j, y', | |
| 'D' => 'M j, y', // ('D' is BC. Can be removed when all charts use this class) | |
| 'W' => '\W\e\e\k W', // (Week is escaped here so it's not interpreted when creating labels) | |
| 'm' => 'M Y', | |
| 'M' => 'M Y', // ('M' is BC. Can be removed when all charts use this class) | |
| 'Y' => 'Y', | |
| ]; | |
| /** | |
| * Defines the basic chart values, generates the time axe labels from it. | |
| * | |
| * @param string|null $unit {@link php.net/manual/en/function.date.php#refsect1-function.date-parameters} | |
| * @param \DateTime $dateFrom | |
| * @param \DateTime $dateTo | |
| * @param string $dateFormat | |
| */ | |
| public function __construct( | |
| ?string $unit = null, | |
| $dateFrom = null, | |
| $dateTo = null, | |
| protected $dateFormat = null | |
| ) { | |
| $this->unit = $unit ?? $this->getTimeUnitFromDateRange($dateFrom, $dateTo); | |
| $this->isTimeUnit = in_array($this->unit, ['H', 'i', 's']); | |
| $this->setDateRange($dateFrom, $dateTo); | |
| $this->amount = $this->countAmountFromDateRange(); | |
| $this->generateTimeLabels($this->amount); | |
| $this->addOneUnitMinusOneSec($this->dateTo); | |
| } | |
| /** | |
| * @return array{labels: mixed[], datasets: mixed[]} | |
| */ | |
| public function render(): array | |
| { | |
| return [ | |
| 'labels' => $this->labels, | |
| 'datasets' => $this->datasets, | |
| ]; | |
| } | |
| /** | |
| * Define a dataset by name and data. Method will add the rest. | |
| * | |
| * @param string $label | |
| * | |
| * @return $this | |
| */ | |
| public function setDataset($label, array $data) | |
| { | |
| $datasetId = count($this->datasets); | |
| $baseData = [ | |
| 'label' => $label, | |
| 'data' => $data, | |
| ]; | |
| $this->datasets[] = array_merge($baseData, $this->generateColors($datasetId)); | |
| return $this; | |
| } | |
| /** | |
| * Generate array of labels from the form data. | |
| * | |
| * @param int $amount | |
| */ | |
| public function generateTimeLabels($amount): void | |
| { | |
| if (!isset($this->labelFormats[$this->unit])) { | |
| throw new \UnexpectedValueException('Date/Time unit "'.$this->unit.'" is not available for a label.'); | |
| } | |
| /** @var \DateTime $date */ | |
| $date = clone $this->dateFrom; | |
| $oneUnit = $this->getUnitInterval(); | |
| $format = !empty($this->dateFormat) ? $this->dateFormat : $this->labelFormats[$this->unit]; | |
| for ($i = 0; $i < $amount; ++$i) { | |
| $this->labels[] = $date->format($format); | |
| // Special case for months because PHP behaves weird with February | |
| if ('m' === $this->unit) { | |
| $date->modify('first day of next month'); | |
| } else { | |
| $date->add($oneUnit); | |
| } | |
| } | |
| } | |
| /** | |
| * Generate unique color for the dataset. | |
| * | |
| * @param int $datasetId | |
| */ | |
| public function generateColors($datasetId): array | |
| { | |
| $color = $this->configureColorHelper($datasetId); | |
| return [ | |
| 'backgroundColor' => $color->toRgba(0.1), | |
| 'borderColor' => $color->toRgba(0.8), | |
| 'pointHoverBackgroundColor' => $color->toRgba(1), | |
| 'pointHoverBorderColor' => $color->toRgba(1), | |
| ]; | |
| } | |
| } | |