diff --git a/assets/app.js b/assets/app.js index 8ed6e87..157e085 100644 --- a/assets/app.js +++ b/assets/app.js @@ -13,8 +13,10 @@ import './styles/emoji-footprint.css'; import './javascript/theme.js'; import './javascript/emoji-footprint.js'; import './javascript/modes.js'; +import htmx from 'htmx.org'; import { initNumberInputs } from './javascript/numberInputs.js'; import { initRadioState } from './javascript/radioState.js'; +window.htmx = htmx; // Initialize everything when DOM is ready document.addEventListener('DOMContentLoaded', function() { diff --git a/config/packages/asset_mapper.php b/config/packages/asset_mapper.php index 4b68e6a..c18fd42 100644 --- a/config/packages/asset_mapper.php +++ b/config/packages/asset_mapper.php @@ -2,22 +2,21 @@ declare(strict_types=1); +use Symfony\Config\FrameworkConfig; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; -return static function (ContainerConfigurator $containerConfigurator): void { - $containerConfigurator->extension('framework', [ - 'asset_mapper' => [ - 'paths' => [ - 'assets/', - ], - 'missing_import_mode' => 'strict', - ], - ]); +return static function ( + ContainerConfigurator $containerConfigurator, + FrameworkConfig $frameworkConfig, +): void { + $frameworkConfig + ->assetMapper() + ->missingImportMode('strict') + ->importmapPolyfill(false) + ->path('assets/', true); if ($containerConfigurator->env() === 'prod') { - $containerConfigurator->extension('framework', [ - 'asset_mapper' => [ - 'missing_import_mode' => 'warn', - ], - ]); + $frameworkConfig + ->assetMapper() + ->missingImportMode('ignore'); } }; diff --git a/importmap.php b/importmap.php index 1dea2bd..f880a22 100644 --- a/importmap.php +++ b/importmap.php @@ -37,4 +37,7 @@ return [ 'chart.js/auto' => [ 'version' => '4.5.0', ], + 'htmx.org' => [ + 'version' => '2.0.6', + ], ]; diff --git a/src/Controller/DrinkTypeController.php b/src/Controller/DrinkTypeController.php index 714e92d..54c39a9 100644 --- a/src/Controller/DrinkTypeController.php +++ b/src/Controller/DrinkTypeController.php @@ -110,4 +110,19 @@ final class DrinkTypeController extends AbstractController return $this->redirectToRoute('app_drink_type_index', [], Response::HTTP_SEE_OTHER); } + + #[Route(path: '/{id}/history-chart', name: 'app_drink_type_history_chart', methods: ['GET'])] + public function historyChart( + DrinkType $drinkType, + GetStockHistory $getStockHistory, + GetWantedHistory $getWantedHistory, + ): Response { + return $this->render('components/history_chart_with_dismiss.html.twig', [ + 'stock_history' => $getStockHistory($drinkType), + 'wanted_history' => $getWantedHistory($drinkType), + 'chart_id' => 'stockHistoryChart_' . $drinkType->getId(), + 'title' => $drinkType->getName() . ' History', + 'drink_type_id' => $drinkType->getId(), + ]); + } } diff --git a/src/Service/DrinkType/GetStockHistory.php b/src/Service/DrinkType/GetStockHistory.php index a9f34c1..3704887 100644 --- a/src/Service/DrinkType/GetStockHistory.php +++ b/src/Service/DrinkType/GetStockHistory.php @@ -23,10 +23,18 @@ final readonly class GetStockHistory if ($drinkType->getId() === null) { return[]; } - return $this->propertyChangeLogRepository->findBy([ + $items = $this->propertyChangeLogRepository->findBy([ 'entityClass' => DrinkType::class, 'propertyName' => 'currentStock', 'entityId' => $drinkType->getId(), ]); + $currentStock = new PropertyChangeLog(); + $currentStock->setNewValue((string) $drinkType->getCurrentStock()); + $currentStock->setEntityClass(DrinkType::class); + $currentStock->setEntityId($drinkType->getId()); + $currentStock->setPropertyName('currentStock'); + + $items[] = $currentStock; + return $items; } } diff --git a/src/Service/DrinkType/GetWantedHistory.php b/src/Service/DrinkType/GetWantedHistory.php index 9e1533b..c3b0796 100644 --- a/src/Service/DrinkType/GetWantedHistory.php +++ b/src/Service/DrinkType/GetWantedHistory.php @@ -18,10 +18,17 @@ final readonly class GetWantedHistory return[]; } - return $this->propertyChangeLogRepository->findBy([ + $items = $this->propertyChangeLogRepository->findBy([ 'entityClass' => DrinkType::class, 'propertyName' => 'wantedStock', 'entityId' => $drinkType->getId(), ]); + $wantedStock = new PropertyChangeLog(); + $wantedStock->setNewValue((string) $drinkType->getWantedStock()); + $wantedStock->setEntityClass(DrinkType::class); + $wantedStock->setEntityId($drinkType->getId()); + $wantedStock->setPropertyName('wantedStock'); + $items[] = $wantedStock; + return $items; } } diff --git a/templates/base.html.twig b/templates/base.html.twig index 3af52a6..e738ad8 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -17,7 +17,7 @@ {% endblock %} -