limit amount of items in calendar drag and drop boxes (#2291)

This commit is contained in:
Kevin Papst
2021-07-11 15:03:18 +02:00
committed by GitHub
parent 2583fdf20e
commit a1f90ffaba
13 changed files with 178 additions and 82 deletions

View File

@@ -0,0 +1,102 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Calendar;
use App\Configuration\SystemConfiguration;
use App\Entity\User;
use App\Event\CalendarDragAndDropSourceEvent;
use App\Event\CalendarGoogleSourceEvent;
use App\Event\RecentActivityEvent;
use App\Repository\TimesheetRepository;
use App\Timesheet\DateTimeFactory;
use App\Utils\Color;
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
final class CalendarService
{
/**
* @var SystemConfiguration
*/
private $configuration;
/**
* @var TimesheetRepository
*/
private $repository;
/**
* @var EventDispatcherInterface
*/
private $dispatcher;
public function __construct(SystemConfiguration $configuration, TimesheetRepository $repository, EventDispatcherInterface $dispatcher)
{
$this->configuration = $configuration;
$this->repository = $repository;
$this->dispatcher = $dispatcher;
}
/**
* @param User $user
* @return DragAndDropSource[]
* @throws \Exception
*/
public function getDragAndDropResources(User $user): array
{
$maxAmount = $this->configuration->getCalendarDragAndDropMaxEntries();
$event = new CalendarDragAndDropSourceEvent($user, $maxAmount);
if ($maxAmount < 1) {
return [];
}
$data = $this->repository->getRecentActivities(
$user,
DateTimeFactory::createByUser($user)->createDateTime('-1 year'),
$maxAmount
);
$recentActivity = new RecentActivityEvent($user, $data);
$this->dispatcher->dispatch($recentActivity);
$entries = [];
$colorHelper = new Color();
foreach ($recentActivity->getRecentActivities() as $timesheet) {
$entries[] = new TimesheetEntry($timesheet, $colorHelper->getTimesheetColor($timesheet));
}
$event->addSource(new RecentActivitiesSource($entries));
$this->dispatcher->dispatch($event);
return $event->getSources();
}
public function getGoogleSources(User $user): ?Google
{
$apiKey = $this->configuration->getCalendarGoogleApiKey();
if ($apiKey === null) {
return null;
}
$sources = [];
foreach ($this->configuration->getCalendarGoogleSources() as $name => $config) {
$sources[] = new GoogleSource($name, $config['id'], $config['color']);
}
$event = new CalendarGoogleSourceEvent($user);
$this->dispatcher->dispatch($event);
foreach ($event->getSources() as $source) {
$sources[] = $source;
}
return new Google($apiKey, $sources);
}
}