diff --git a/site/app/Training/DateList/UpcomingTrainingDatesList.php b/site/app/Training/DateList/UpcomingTrainingDatesList.php new file mode 100644 index 000000000..749c8293d --- /dev/null +++ b/site/app/Training/DateList/UpcomingTrainingDatesList.php @@ -0,0 +1,34 @@ +venueId ? $this->upcomingTrainingDates->getPublicUpcomingAtVenue($this->venueId) : $this->upcomingTrainingDates->getPublicUpcoming(); + if ($this->excludeTraining) { + unset($upcomingTrainings[$this->excludeTraining]); + } + $this->template->lastFreeSeats = $this->showLastFreeSeats && $this->freeSeats->lastFreeSeatsAnyTraining($upcomingTrainings); + $this->template->upcomingTrainings = $upcomingTrainings; + $this->template->render(__DIR__ . '/upcomingTrainingDatesList.latte'); + } + +} diff --git a/site/app/Training/DateList/UpcomingTrainingDatesListFactory.php b/site/app/Training/DateList/UpcomingTrainingDatesListFactory.php new file mode 100644 index 000000000..27d46a254 --- /dev/null +++ b/site/app/Training/DateList/UpcomingTrainingDatesListFactory.php @@ -0,0 +1,11 @@ + {foreach $upcomingTrainings as $item}
  • - {$item->getName()} + {$item->getName()} {icon calendar class => calendar} diff --git a/site/app/Www/Presenters/HomepagePresenter.php b/site/app/Www/Presenters/HomepagePresenter.php index 1c0424233..8936de989 100644 --- a/site/app/Www/Presenters/HomepagePresenter.php +++ b/site/app/Www/Presenters/HomepagePresenter.php @@ -7,8 +7,8 @@ use MichalSpacekCz\Interviews\Interviews; use MichalSpacekCz\Talks\Talks; use MichalSpacekCz\Training\CompanyTrainings; -use MichalSpacekCz\Training\Dates\UpcomingTrainingDates; -use MichalSpacekCz\Training\FreeSeats; +use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesList; +use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesListFactory; use MichalSpacekCz\Training\Trainings; class HomepagePresenter extends BasePresenter @@ -18,10 +18,9 @@ public function __construct( private readonly Articles $articles, private readonly Interviews $interviews, private readonly Talks $talks, - private readonly UpcomingTrainingDates $upcomingTrainingDates, private readonly Trainings $trainings, private readonly CompanyTrainings $companyTrainings, - private readonly FreeSeats $freeSeats, + private readonly UpcomingTrainingDatesListFactory $upcomingTrainingDatesListFactory, ) { parent::__construct(); } @@ -29,17 +28,20 @@ public function __construct( public function renderDefault(): void { - $upcomingTrainings = $this->upcomingTrainingDates->getPublicUpcoming(); $this->template->pageHeader = 'Michal Špaček'; $this->template->articles = $this->articles->getAll(3); $this->template->talks = $this->talks->getAll(5); $this->template->favoriteTalks = $this->talks->getFavorites(); $this->template->upcomingTalks = $this->talks->getUpcoming(); - $this->template->upcomingTrainings = $upcomingTrainings; $this->template->companyTrainings = $this->companyTrainings->getWithoutPublicUpcoming(); $this->template->interviews = $this->interviews->getAll(5); - $this->template->lastFreeSeats = $this->freeSeats->lastFreeSeatsAnyTraining($upcomingTrainings); $this->template->discontinued = $this->trainings->getAllDiscontinued(); } + + protected function createComponentUpcomingDatesList(): UpcomingTrainingDatesList + { + return $this->upcomingTrainingDatesListFactory->create(null, true); + } + } diff --git a/site/app/Www/Presenters/TrainingsPresenter.php b/site/app/Www/Presenters/TrainingsPresenter.php index 2caaad434..7c5aa5dd3 100644 --- a/site/app/Www/Presenters/TrainingsPresenter.php +++ b/site/app/Www/Presenters/TrainingsPresenter.php @@ -9,9 +9,10 @@ use MichalSpacekCz\Formatter\TexyFormatter; use MichalSpacekCz\Training\Applications; use MichalSpacekCz\Training\CompanyTrainings; +use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesList; +use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesListFactory; use MichalSpacekCz\Training\Dates\TrainingDate; use MichalSpacekCz\Training\Dates\TrainingDates; -use MichalSpacekCz\Training\Dates\UpcomingTrainingDates; use MichalSpacekCz\Training\Exceptions\TrainingApplicationDoesNotExistException; use MichalSpacekCz\Training\Exceptions\TrainingDoesNotExistException; use MichalSpacekCz\Training\Files\TrainingFiles; @@ -40,7 +41,6 @@ public function __construct( private readonly TexyFormatter $texyFormatter, private readonly Applications $trainingApplications, private readonly TrainingDates $trainingDates, - private readonly UpcomingTrainingDates $upcomingTrainingDates, private readonly TrainingFiles $trainingFiles, private readonly Trainings $trainings, private readonly FreeSeats $freeSeats, @@ -49,6 +49,7 @@ public function __construct( private readonly Reviews $trainingReviews, private readonly TrainingApplicationFormFactory $trainingApplicationFactory, private readonly TrainingApplicationPreliminaryFormFactory $trainingApplicationPreliminaryFactory, + private readonly UpcomingTrainingDatesListFactory $upcomingTrainingDatesListFactory, private readonly CompanyInfo $companyInfo, private readonly IResponse $httpResponse, ) { @@ -58,15 +59,18 @@ public function __construct( public function renderDefault(): void { - $upcomingTrainings = $this->upcomingTrainingDates->getPublicUpcoming(); $this->template->pageTitle = $this->translator->translate('messages.title.trainings'); - $this->template->upcomingTrainings = $upcomingTrainings; $this->template->companyTrainings = $this->companyTrainings->getWithoutPublicUpcoming(); - $this->template->lastFreeSeats = $this->freeSeats->lastFreeSeatsAnyTraining($upcomingTrainings); $this->template->discontinued = $this->trainings->getAllDiscontinued(); } + protected function createComponentUpcomingDatesList(): UpcomingTrainingDatesList + { + return $this->upcomingTrainingDatesListFactory->create(null, true); + } + + public function actionTraining(string $name): void { $this->trainingAction = $name; @@ -315,22 +319,22 @@ public function actionSuccess(string $name): void $this->template->pageTitle = $this->texyFormatter->translate('messages.title.trainingapplication', [$this->training->name]); $this->template->title = $this->training->name; $this->template->description = $this->training->description; - $this->template->lastFreeSeats = false; $this->template->start = $date->getStart(); $this->template->end = $date->getEnd(); $this->template->remote = $date->isRemote(); $this->template->venueCity = $date->getVenueCity(); $this->template->tentative = $date->isTentative(); - - $upcoming = $this->upcomingTrainingDates->getPublicUpcoming(); - unset($upcoming[$name]); - $this->template->upcomingTrainings = $upcoming; - $this->template->form = $this->createComponentApplication(); $this->template->reviews = $this->trainingReviews->getVisibleReviews($this->training->trainingId, 3); } + protected function createComponentOtherUpcomingDatesList(): UpcomingTrainingDatesList + { + return $this->upcomingTrainingDatesListFactory->create($this->trainingAction, false); + } + + /** * Translated locale parameters for trainings. * diff --git a/site/app/Www/Presenters/VenuesPresenter.php b/site/app/Www/Presenters/VenuesPresenter.php index a10c27008..aacd12b2b 100644 --- a/site/app/Www/Presenters/VenuesPresenter.php +++ b/site/app/Www/Presenters/VenuesPresenter.php @@ -4,19 +4,21 @@ namespace MichalSpacekCz\Www\Presenters; use MichalSpacekCz\Formatter\TexyFormatter; -use MichalSpacekCz\Training\Dates\UpcomingTrainingDates; -use MichalSpacekCz\Training\FreeSeats; +use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesList; +use MichalSpacekCz\Training\DateList\UpcomingTrainingDatesListFactory; use MichalSpacekCz\Training\Venues; use Nette\Application\BadRequestException; class VenuesPresenter extends BasePresenter { + private int $venueId; + + public function __construct( private readonly TexyFormatter $texyFormatter, - private readonly UpcomingTrainingDates $upcomingTrainingDates, private readonly Venues $trainingVenues, - private readonly FreeSeats $freeSeats, + private readonly UpcomingTrainingDatesListFactory $upcomingTrainingDatesListFactory, ) { parent::__construct(); } @@ -28,7 +30,7 @@ public function actionVenue(string $name): void if (!$venue) { throw new BadRequestException("Where in the world is {$name}?"); } - $trainings = $this->upcomingTrainingDates->getPublicUpcomingAtVenue($venue->id); + $this->venueId = $venue->id; $this->template->pageTitle = $this->texyFormatter->translate('messages.title.venue', [$venue->name]); $this->template->name = $venue->name; @@ -43,8 +45,12 @@ public function actionVenue(string $name): void $this->template->streetview = $venue->streetview; $this->template->parking = $venue->parking; $this->template->publicTransport = $venue->publicTransport; - $this->template->lastFreeSeats = $this->freeSeats->lastFreeSeatsAnyTraining($trainings); - $this->template->upcomingTrainings = $trainings; + } + + + protected function createComponentUpcomingDatesList(): UpcomingTrainingDatesList + { + return $this->upcomingTrainingDatesListFactory->create(null, true, $this->venueId); } } diff --git a/site/app/Www/Presenters/templates/Homepage/default.latte b/site/app/Www/Presenters/templates/Homepage/default.latte index b74f2dfd3..172e71671 100644 --- a/site/app/Www/Presenters/templates/Homepage/default.latte +++ b/site/app/Www/Presenters/templates/Homepage/default.latte @@ -5,7 +5,7 @@

    {_messages.trainings.intro.intro}: {_messages.trainings.intro.review} — {_messages.trainings.intro.author}

    {_messages.label.publictrainings}

    {_messages.homepage.trainings}:

    -{include "../Trainings/common/dateList.latte"} +{control upcomingDatesList}

    {_messages.label.companytrainings}

    {_messages.trainings.companyextratraining|format:'link:Www:CompanyTrainings:'}

    {include "../Trainings/common/company.latte"} diff --git a/site/app/Www/Presenters/templates/Trainings/default.latte b/site/app/Www/Presenters/templates/Trainings/default.latte index 6d1ac2489..4d30108b8 100644 --- a/site/app/Www/Presenters/templates/Trainings/default.latte +++ b/site/app/Www/Presenters/templates/Trainings/default.latte @@ -6,7 +6,7 @@

    {_messages.trainings.intro.review} — {_messages.trainings.intro.author}

    {_messages.label.publictrainings}

    {_messages.trainings.welcome}

    -{include "common/dateList.latte"} +{control upcomingDatesList}

    {_messages.label.companytrainings}

    {_messages.trainings.companyextratraining|format:'link:Www:CompanyTrainings:'}

    {include "common/company.latte"} diff --git a/site/app/Www/Presenters/templates/Trainings/success.latte b/site/app/Www/Presenters/templates/Trainings/success.latte index fe0eccc13..7d6ab2b37 100644 --- a/site/app/Www/Presenters/templates/Trainings/success.latte +++ b/site/app/Www/Presenters/templates/Trainings/success.latte @@ -56,7 +56,7 @@

    {_messages.label.othertrainings}

    {_messages.trainings.cometoothertrainings}

    -{include "common/dateList.latte"} +{control otherUpcomingDatesList} {if $reviews}
    diff --git a/site/app/Www/Presenters/templates/Venues/venue.latte b/site/app/Www/Presenters/templates/Venues/venue.latte index 042a1475a..a473ec6a8 100644 --- a/site/app/Www/Presenters/templates/Venues/venue.latte +++ b/site/app/Www/Presenters/templates/Venues/venue.latte @@ -19,6 +19,6 @@ {if empty($upcomingTrainings)}

    {_messages.venues.notraininghere|format:"link:Www:Contact:"}

    {else} -{include "../Trainings/common/dateList.latte"} +{control upcomingDatesList} {/if} {/define} diff --git a/site/config/services.neon b/site/config/services.neon index 05c4e8c6f..27e6b7768 100644 --- a/site/config/services.neon +++ b/site/config/services.neon @@ -94,6 +94,7 @@ services: - MichalSpacekCz\Training\Applications(emailEncryption: @emailEncryption) - MichalSpacekCz\Training\CompanyTrainings - MichalSpacekCz\Training\DateList\TrainingApplicationsListFactory + - MichalSpacekCz\Training\DateList\UpcomingTrainingDatesListFactory - MichalSpacekCz\Training\Dates\TrainingDateStatuses - MichalSpacekCz\Training\Dates\TrainingDateFactory(texyFormatter: @texyFormatterNoPlaceholders) - MichalSpacekCz\Training\Dates\TrainingDates