* fix deprecations * remove unused config * replace invalid annotation type with attribute * use AsDoctrineListener to fix deprecation * new ModifiedSubscriber to support custom logic and fix deprecation * removed inheritdoc comment * new ModifiedSubscriber to support custom logic and fix deprecation * cleanup event dispatcher interface * re-order annotation params * one more doctrine based deprecation * fix query to count active timesheets * link to "all times" to identify active timesheets * link icon instead of text * fix "skin" translation in wizard * use duration filter to show duration * added login link command and controller * bump tabler theme to 1.0 * added wizard to force password reset by user * allow to configure that new accounts need to reset their password * prevent uploading twig templates by default * bump composer packages * enable sandbox and basic security measures for custom twig templates for invoice and export * bump to symfony 6.3.5 * allow to export single user reports to excel * removed broken method to reload twig cache * added api parameter to fetch user collection fully serialized * allow to replace or append description via timesheet batch update * show api username above form
83 lines
2.4 KiB
PHP
83 lines
2.4 KiB
PHP
<?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\Twig;
|
|
|
|
use App\Utils\Pagination;
|
|
use App\Utils\PaginationView;
|
|
use Pagerfanta\Pagerfanta;
|
|
use Pagerfanta\View\ViewInterface;
|
|
use Symfony\Component\PropertyAccess\PropertyAccess;
|
|
use Symfony\Component\PropertyAccess\PropertyPath;
|
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
|
use Twig\Extension\AbstractExtension;
|
|
use Twig\TwigFunction;
|
|
|
|
final class PaginationExtension extends AbstractExtension
|
|
{
|
|
private ?ViewInterface $view = null;
|
|
|
|
public function __construct(private UrlGeneratorInterface $router)
|
|
{
|
|
}
|
|
|
|
public function getFunctions(): array
|
|
{
|
|
return [
|
|
new TwigFunction('pagination', [$this, 'renderPagination'], ['is_safe' => ['html']]),
|
|
];
|
|
}
|
|
|
|
private function getView(): ViewInterface
|
|
{
|
|
if (null === $this->view) {
|
|
$this->view = new PaginationView();
|
|
}
|
|
|
|
return $this->view;
|
|
}
|
|
|
|
public function renderPagination(Pagerfanta|Pagination $pager, array $options = []): string
|
|
{
|
|
if (!($pager instanceof Pagination)) {
|
|
@trigger_error('Twig function pagination() needs an instanceof Pagination, Pagerfanta given', E_USER_DEPRECATED);
|
|
}
|
|
|
|
$routeGenerator = $this->createRouteGenerator($options);
|
|
|
|
return $this->getView()->render($pager, $routeGenerator, $options);
|
|
}
|
|
|
|
private function createRouteGenerator(array $options = []): \Closure
|
|
{
|
|
$options = array_replace([
|
|
'routeName' => null,
|
|
'routeParams' => [],
|
|
'pageParameter' => '[page]',
|
|
], $options);
|
|
|
|
$router = $this->router;
|
|
|
|
if (null === $options['routeName']) {
|
|
throw new \Exception('Pagination is missing the "routeName" option');
|
|
}
|
|
|
|
$routeName = $options['routeName'];
|
|
$routeParams = $options['routeParams'];
|
|
$pagePropertyPath = new PropertyPath($options['pageParameter']);
|
|
|
|
return function ($page) use ($router, $routeName, $routeParams, $pagePropertyPath) {
|
|
$propertyAccessor = PropertyAccess::createPropertyAccessor();
|
|
$propertyAccessor->setValue($routeParams, $pagePropertyPath, $page);
|
|
|
|
return $router->generate($routeName, $routeParams);
|
|
};
|
|
}
|
|
}
|