suivi/src/Controller/CalendarAdminController.php

124 lines
4.4 KiB
PHP

<?php
namespace App\Controller;
use App\Repository\EventRepositoryQuery;
use App\Repository\ProjectRepositoryQuery;
use App\Repository\SpeakerRepositoryQuery;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CalendarAdminController extends AbstractController
{
#[Route('/admin/calendar/month', name: 'admin_calendar_month', options: ['expose' => true])]
public function month(
Request $request,
SpeakerRepositoryQuery $speakerQuery,
ProjectRepositoryQuery $projectQuery,
EventRepositoryQuery $eventQuery
): Response {
$projects = $projectQuery->create()->withIds($request->query->get('projects'))->find();
$speakers = $speakerQuery->create()->withIds($request->query->get('speakers'))->find();
$month = $request->query->get('month', date('m'));
$year = $request->query->get('year', date('Y'));
$dateFrom = new \DateTime(sprintf('%d-%d-1', $year, $month));
$currentMonthFirstDayOfWeek = $dateFrom->format('N');
$nextMonthFirstDayOfWeek = date('N', $dateFrom->getTimestamp() + 3600 * 24 * $dateFrom->format('t'));
$currentMonthDays = $dateFrom->format('t');
$prevMonthDays = date('t', $dateFrom->getTimestamp() - 3600);
$days = [];
if ($currentMonthFirstDayOfWeek > 1) {
for ($day = $prevMonthDays - $currentMonthFirstDayOfWeek + 2; $day <= $prevMonthDays; ++$day) {
$days[] = [
'day' => $day,
'currentMonth' => false,
'events' => [],
];
}
}
for ($day = 1; $day <= $currentMonthDays; ++$day) {
$events = $eventQuery->create()
->ofProjects($projects)
->ofSpeakers($speakers)
->ofMonth($month)
->ofYear($year)
->ofDay($day)
->find()
;
$events = array_map(function ($event) {
return [
'uid' => $event->getUid(),
'summary' => $event->getSummary(),
'description' => $event->getCleanedDescription(),
'startAt' => $event->getStartAt() ? $event->getStartAt()->format('H:i') : null,
'finishAt' => $event->getFinishAt() ? $event->getFinishAt()->format('H:i') : null,
'projects' => array_map(fn ($i) => [
'id' => $i->getId(),
'label' => $i->getLabel(),
], $event->getProjects()->toArray()),
'speakers' => array_map(fn ($i) => [
'id' => $i->getId(),
'name' => $i->getName(),
'color' => $i->getColor(),
], $event->getSpeakers()->toArray()),
];
}, $events);
$days[] = [
'day' => $day,
'currentMonth' => true,
'events' => $events,
];
}
if ($nextMonthFirstDayOfWeek > 1) {
$day = 0;
for ($u = $nextMonthFirstDayOfWeek; $u <= 7; ++$u) {
$days[] = [
'day' => ++$day,
'currentMonth' => false,
'events' => [],
];
}
}
return $this->json($days);
}
#[Route('/admin/calendar/projects', name: 'admin_calendar_projects', options: ['expose' => true])]
public function projects(ProjectRepositoryQuery $query): Response
{
$entities = array_map(function ($entity) {
return [
'id' => $entity->getId(),
'label' => $entity->getLabel(),
];
}, $query->create()->orderBy('.label')->find());
return $this->json($entities);
}
#[Route('/admin/calendar/speakers', name: 'admin_calendar_speakers', options: ['expose' => true])]
public function speakers(SpeakerRepositoryQuery $query): Response
{
$entities = array_map(function ($entity) {
return [
'id' => $entity->getId(),
'name' => $entity->getName(),
];
}, $query->create()->orderBy('.name')->find());
return $this->json($entities);
}
}