From b7ebf7374acf24e83ef7f3b4bc721d245d25afde Mon Sep 17 00:00:00 2001 From: Krzysiej Date: Mon, 12 Jan 2026 09:03:14 +0100 Subject: [PATCH] Handle gaps in chart data when the product disappeared from the store then appeared again. --- src/Controller/ProductController.php | 36 +++++++++++++++++----------- templates/product.html.twig | 1 + 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/Controller/ProductController.php b/src/Controller/ProductController.php index b7d5cba..9bdbc65 100644 --- a/src/Controller/ProductController.php +++ b/src/Controller/ProductController.php @@ -19,7 +19,7 @@ final class ProductController extends BaseController #[Route('/product/{productId<\d+>}', name: 'app_product')] public function __invoke(int $productId): Response { - if($this->cache->getItem('product'.$productId)->isHit()) { + if ($this->cache->getItem('product' . $productId)->isHit()) { return $this->render('product.html.twig', ['product' => ['id' => $productId]]); } @@ -30,26 +30,34 @@ final class ProductController extends BaseController if (null === $product) { throw $this->createNotFoundException('Product not found'); } - $priceList = $product->price()->pluck('price'); - $stockList = $product->stock()->pluck('stock'); - $priceDates = $product->price()->pluck('created_at')->map(fn($date) => $date->format('Y-m-d'))->toArray(); - $stockDates = $product->stock()->pluck('created_at')->map(fn($date) => $date->format('Y-m-d'))->toArray(); - + $priceList = $product->price()->pluck('price', 'created_at')->mapWithKeys(fn($price, $createdAt) => [explode(' ', $createdAt)[0] => $price])->toArray(); + $stockList = $product->stock()->pluck('stock', 'created_at')->mapWithKeys(fn($stock, $createdAt) => [explode(' ', $createdAt)[0] => $stock])->toArray(); return $this->render('product.html.twig', [ 'product' => $product, - 'price_list' => $this->prepareChartData($priceDates, $priceList), - 'stock_list' => $this->prepareChartData($stockDates, $stockList), - 'price_dates' => implode("','", $priceDates), + 'price_list' => $this->prepareChartData($priceList), + 'stock_list' => $this->prepareChartData($stockList), + 'price_dates' => implode("','", $this->dateRange(array_key_first($priceList), array_key_last($priceList))), ]); } - private function prepareChartData($set1, $set2): string + private function prepareChartData($set1): string { - $data = []; - foreach ($set1 as $key => $value) { - $data[] = ['x' => $value, 'y' => $set2[$key]]; - } + $dates = $this->dateRange(array_key_first($set1), array_key_last($set1)); + $data = array_map(fn($date) => ['x' => $date, 'y' => $set1[$date] ?? null], $dates); $stringData = json_encode($data); + return str_replace(['"x"', '"y"'], ['x', 'y'], $stringData); } + + private function dateRange($dateStart, $dateEnd): array + { + $from = new \DateTime($dateStart); + $to = new \DateTime($dateEnd); + $range = []; + for ($date = clone $from; $date < $to; $date->modify('+1 day')) { + $range[] = $date->format('Y-m-d'); + } + + return $range; + } } diff --git a/templates/product.html.twig b/templates/product.html.twig index 2d64ce6..b2c1e75 100644 --- a/templates/product.html.twig +++ b/templates/product.html.twig @@ -83,6 +83,7 @@ ] }, options: { + spanGaps: false, responsive: true, animation: false, scales: {