124 lines
4.4 KiB
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);
|
|
}
|
|
}
|