export filtered timesheets without additional search form (#5234)
This commit is contained in:
60
phpstan.neon
60
phpstan.neon
@@ -987,11 +987,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: src/Controller/TimesheetAbstractController.php
|
path: src/Controller/TimesheetAbstractController.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$id of method App\\\\Export\\\\ServiceExport\\:\\:getTimesheetExporterById\\(\\) expects string, bool\\|float\\|int\\|string given\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Controller/TimesheetAbstractController.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^PHPDoc tag @var for variable \\$teams contains generic class Doctrine\\\\Common\\\\Collections\\\\ArrayCollection but does not specify its types\\: TKey, T$#"
|
message: "#^PHPDoc tag @var for variable \\$teams contains generic class Doctrine\\\\Common\\\\Collections\\\\ArrayCollection but does not specify its types\\: TKey, T$#"
|
||||||
count: 1
|
count: 1
|
||||||
@@ -2782,61 +2777,6 @@ parameters:
|
|||||||
count: 2
|
count: 2
|
||||||
path: src/Form/Toolbar/TeamToolbarForm.php
|
path: src/Form/Toolbar/TeamToolbarForm.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addActivityMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addActivitySelect\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addCustomerMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addCustomerSelect\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addDateRange\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addOrderBy\\(\\) has parameter \\$allowedColumns with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addProjectMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addProjectSelect\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addTeamsChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetExportToolbarForm\\:\\:addUsersChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Parameter \\#1 \\$user of method App\\\\Repository\\\\Query\\\\BaseFormTypeQuery\\:\\:setUser\\(\\) expects App\\\\Entity\\\\User, mixed given\\.$#"
|
|
||||||
count: 2
|
|
||||||
path: src/Form/Toolbar/TimesheetExportToolbarForm.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetToolbarForm\\:\\:addActivityMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
message: "#^Method App\\\\Form\\\\Toolbar\\\\TimesheetToolbarForm\\:\\:addActivityMultiChoice\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
|
|||||||
@@ -160,17 +160,13 @@ abstract class AbstractController extends BaseAbstractController implements Serv
|
|||||||
*
|
*
|
||||||
* @param array<string, string> $parameter
|
* @param array<string, string> $parameter
|
||||||
*/
|
*/
|
||||||
private function addFlashTranslated(string $type, string $message, array $parameter = []): void
|
private function addFlashTranslated(string $type, string $message, array $parameter = [], string $domain = 'flashmessages'): void
|
||||||
{
|
{
|
||||||
if (!empty($parameter)) {
|
if (!empty($parameter)) {
|
||||||
foreach ($parameter as $key => $value) {
|
foreach ($parameter as $key => $value) {
|
||||||
$parameter[$key] = $this->getTranslator()->trans($value, [], 'flashmessages');
|
$parameter[$key] = $this->getTranslator()->trans($value, [], $domain);
|
||||||
}
|
}
|
||||||
$message = $this->getTranslator()->trans(
|
$message = $this->getTranslator()->trans($message, $parameter, $domain);
|
||||||
$message,
|
|
||||||
$parameter,
|
|
||||||
'flashmessages'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->addFlash($type, $message);
|
$this->addFlash($type, $message);
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ use App\Form\MultiUpdate\TimesheetMultiUpdate;
|
|||||||
use App\Form\MultiUpdate\TimesheetMultiUpdateDTO;
|
use App\Form\MultiUpdate\TimesheetMultiUpdateDTO;
|
||||||
use App\Form\TimesheetEditForm;
|
use App\Form\TimesheetEditForm;
|
||||||
use App\Form\TimesheetPreCreateForm;
|
use App\Form\TimesheetPreCreateForm;
|
||||||
use App\Form\Toolbar\TimesheetExportToolbarForm;
|
|
||||||
use App\Form\Toolbar\TimesheetToolbarForm;
|
use App\Form\Toolbar\TimesheetToolbarForm;
|
||||||
use App\Repository\Query\BaseQuery;
|
use App\Repository\Query\BaseQuery;
|
||||||
use App\Repository\Query\TimesheetQuery;
|
use App\Repository\Query\TimesheetQuery;
|
||||||
@@ -34,7 +33,6 @@ use App\Timesheet\TrackingMode\TrackingModeInterface;
|
|||||||
use App\Utils\DataTable;
|
use App\Utils\DataTable;
|
||||||
use App\Utils\PageSetup;
|
use App\Utils\PageSetup;
|
||||||
use Psr\EventDispatcher\EventDispatcherInterface;
|
use Psr\EventDispatcher\EventDispatcherInterface;
|
||||||
use Symfony\Component\Form\FormError;
|
|
||||||
use Symfony\Component\Form\FormInterface;
|
use Symfony\Component\Form\FormInterface;
|
||||||
use Symfony\Component\Form\FormTypeInterface;
|
use Symfony\Component\Form\FormTypeInterface;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
@@ -237,19 +235,22 @@ abstract class TimesheetAbstractController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function export(Request $request, ServiceExport $serviceExport): Response
|
protected function export(string $type, Request $request, ServiceExport $serviceExport): Response
|
||||||
{
|
{
|
||||||
|
$exporter = $serviceExport->getTimesheetExporterById($type);
|
||||||
|
|
||||||
|
if (null === $exporter) {
|
||||||
|
throw $this->createNotFoundException();
|
||||||
|
}
|
||||||
|
|
||||||
$query = $this->createDefaultQuery();
|
$query = $this->createDefaultQuery();
|
||||||
$query->setOrder(BaseQuery::ORDER_ASC);
|
$query->setOrder(BaseQuery::ORDER_ASC);
|
||||||
|
|
||||||
$form = $this->getExportForm($query);
|
$form = $this->getToolbarForm($query);
|
||||||
|
$request->query->set('performSearch', true);
|
||||||
if ($request->isMethod(Request::METHOD_POST)) {
|
|
||||||
$request->query->set('performSearch', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->handleSearch($form, $request)) {
|
if ($this->handleSearch($form, $request)) {
|
||||||
return $this->redirectToRoute($this->getExportRoute());
|
return $this->redirectToRoute($this->getTimesheetRoute());
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->prepareQuery($query);
|
$this->prepareQuery($query);
|
||||||
@@ -263,29 +264,8 @@ abstract class TimesheetAbstractController extends AbstractController
|
|||||||
}
|
}
|
||||||
|
|
||||||
$entries = $this->repository->getTimesheetResult($query);
|
$entries = $this->repository->getTimesheetResult($query);
|
||||||
$stats = $entries->getStatistic();
|
|
||||||
|
|
||||||
// perform the real export
|
return $exporter->render($entries->getResults(), $query);
|
||||||
if ($request->isMethod(Request::METHOD_POST)) {
|
|
||||||
$type = $request->request->get('exporter');
|
|
||||||
if (null !== $type) {
|
|
||||||
$exporter = $serviceExport->getTimesheetExporterById($type);
|
|
||||||
|
|
||||||
if (null === $exporter) {
|
|
||||||
$form->addError(new FormError('Invalid timesheet exporter given'));
|
|
||||||
} else {
|
|
||||||
return $exporter->render($entries->getResults(), $query);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->render('timesheet/layout-export.html.twig', [
|
|
||||||
'page_setup' => new PageSetup('export'),
|
|
||||||
'form' => $form->createView(),
|
|
||||||
'route_back' => $this->getTimesheetRoute(),
|
|
||||||
'exporter' => $serviceExport->getTimesheetExporter(),
|
|
||||||
'stats' => $stats,
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function multiUpdate(Request $request): Response
|
protected function multiUpdate(Request $request): Response
|
||||||
@@ -548,16 +528,6 @@ abstract class TimesheetAbstractController extends AbstractController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getExportForm(TimesheetQuery $query): FormInterface
|
|
||||||
{
|
|
||||||
return $this->createSearchForm(TimesheetExportToolbarForm::class, $query, [
|
|
||||||
'action' => $this->generateUrl($this->getExportRoute()),
|
|
||||||
'timezone' => $this->getDateTimeFactory()->getTimezone()->getName(),
|
|
||||||
'method' => Request::METHOD_POST,
|
|
||||||
'include_user' => $this->includeUserInForms('toolbar'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getPermissionEditExport(): string
|
protected function getPermissionEditExport(): string
|
||||||
{
|
{
|
||||||
return 'edit_export_own_timesheet';
|
return 'edit_export_own_timesheet';
|
||||||
@@ -611,11 +581,6 @@ abstract class TimesheetAbstractController extends AbstractController
|
|||||||
return 'timesheet_multi_delete';
|
return 'timesheet_multi_delete';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getExportRoute(): string
|
|
||||||
{
|
|
||||||
return 'timesheet_export';
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function canSeeStartEndTime(): bool
|
protected function canSeeStartEndTime(): bool
|
||||||
{
|
{
|
||||||
return $this->getTrackingMode()->canSeeBeginAndEndTimes();
|
return $this->getTrackingMode()->canSeeBeginAndEndTimes();
|
||||||
|
|||||||
@@ -41,11 +41,11 @@ final class TimesheetController extends TimesheetAbstractController
|
|||||||
return $this->index($query, $request, 'timesheet', 'timesheet_paginated', TimesheetMetaDisplayEvent::TIMESHEET);
|
return $this->index($query, $request, 'timesheet', 'timesheet_paginated', TimesheetMetaDisplayEvent::TIMESHEET);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route(path: '/export/', name: 'timesheet_export', methods: ['GET', 'POST'])]
|
#[Route(path: '/export/{exporter}', name: 'timesheet_export', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('export_own_timesheet')]
|
#[IsGranted('export_own_timesheet')]
|
||||||
public function exportAction(Request $request, ServiceExport $serviceExport): Response
|
public function exportAction(string $exporter, Request $request, ServiceExport $serviceExport): Response
|
||||||
{
|
{
|
||||||
return $this->export($request, $serviceExport);
|
return $this->export($exporter, $request, $serviceExport);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route(path: '/{id}/edit', name: 'timesheet_edit', methods: ['GET', 'POST'])]
|
#[Route(path: '/{id}/edit', name: 'timesheet_edit', methods: ['GET', 'POST'])]
|
||||||
|
|||||||
@@ -50,11 +50,11 @@ final class TimesheetTeamController extends TimesheetAbstractController
|
|||||||
return $this->index($query, $request, 'admin_timesheet', 'admin_timesheet_paginated', TimesheetMetaDisplayEvent::TEAM_TIMESHEET);
|
return $this->index($query, $request, 'admin_timesheet', 'admin_timesheet_paginated', TimesheetMetaDisplayEvent::TEAM_TIMESHEET);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route(path: '/export/', name: 'admin_timesheet_export', methods: ['GET', 'POST'])]
|
#[Route(path: '/export/{exporter}', name: 'admin_timesheet_export', methods: ['GET', 'POST'])]
|
||||||
#[IsGranted('export_other_timesheet')]
|
#[IsGranted('export_other_timesheet')]
|
||||||
public function exportAction(Request $request, ServiceExport $serviceExport): Response
|
public function exportAction(string $exporter, Request $request, ServiceExport $serviceExport): Response
|
||||||
{
|
{
|
||||||
return $this->export($request, $serviceExport);
|
return $this->export($exporter, $request, $serviceExport);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route(path: '/{id}/edit', name: 'admin_timesheet_edit', methods: ['GET', 'POST'])]
|
#[Route(path: '/{id}/edit', name: 'admin_timesheet_edit', methods: ['GET', 'POST'])]
|
||||||
@@ -233,11 +233,6 @@ final class TimesheetTeamController extends TimesheetAbstractController
|
|||||||
return 'admin_timesheet_edit';
|
return 'admin_timesheet_edit';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getExportRoute(): string
|
|
||||||
{
|
|
||||||
return 'admin_timesheet_export';
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getMultiUpdateRoute(): string
|
protected function getMultiUpdateRoute(): string
|
||||||
{
|
{
|
||||||
return 'admin_timesheet_multi_update';
|
return 'admin_timesheet_multi_update';
|
||||||
|
|||||||
@@ -10,9 +10,17 @@
|
|||||||
namespace App\EventSubscriber\Actions;
|
namespace App\EventSubscriber\Actions;
|
||||||
|
|
||||||
use App\Event\PageActionsEvent;
|
use App\Event\PageActionsEvent;
|
||||||
|
use App\Export\ServiceExport;
|
||||||
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||||
|
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
|
||||||
|
|
||||||
final class TimesheetsSubscriber extends AbstractActionsSubscriber
|
final class TimesheetsSubscriber extends AbstractActionsSubscriber
|
||||||
{
|
{
|
||||||
|
public function __construct(AuthorizationCheckerInterface $auth, UrlGeneratorInterface $urlGenerator, private readonly ServiceExport $serviceExport)
|
||||||
|
{
|
||||||
|
parent::__construct($auth, $urlGenerator);
|
||||||
|
}
|
||||||
|
|
||||||
public static function getActionName(): string
|
public static function getActionName(): string
|
||||||
{
|
{
|
||||||
return 'timesheets';
|
return 'timesheets';
|
||||||
@@ -25,7 +33,9 @@ final class TimesheetsSubscriber extends AbstractActionsSubscriber
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($this->isGranted('export_own_timesheet')) {
|
if ($this->isGranted('export_own_timesheet')) {
|
||||||
$event->addAction('download', ['url' => $this->path('timesheet_export'), 'class' => 'modal-ajax-form', 'title' => 'export']);
|
foreach ($this->serviceExport->getTimesheetExporter() as $exporter) {
|
||||||
|
$event->addActionToSubmenu('export', $exporter->getId(), ['url' => $this->path('timesheet_export', ['exporter' => $exporter->getId()]), 'class' => 'toolbar-action', 'title' => 'button.' . $exporter->getId(), 'translation_domain' => 'messages']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,17 @@
|
|||||||
namespace App\EventSubscriber\Actions;
|
namespace App\EventSubscriber\Actions;
|
||||||
|
|
||||||
use App\Event\PageActionsEvent;
|
use App\Event\PageActionsEvent;
|
||||||
|
use App\Export\ServiceExport;
|
||||||
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||||
|
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
|
||||||
|
|
||||||
final class TimesheetsTeamSubscriber extends AbstractActionsSubscriber
|
final class TimesheetsTeamSubscriber extends AbstractActionsSubscriber
|
||||||
{
|
{
|
||||||
|
public function __construct(AuthorizationCheckerInterface $auth, UrlGeneratorInterface $urlGenerator, private readonly ServiceExport $serviceExport)
|
||||||
|
{
|
||||||
|
parent::__construct($auth, $urlGenerator);
|
||||||
|
}
|
||||||
|
|
||||||
public static function getActionName(): string
|
public static function getActionName(): string
|
||||||
{
|
{
|
||||||
return 'timesheets_team';
|
return 'timesheets_team';
|
||||||
@@ -26,7 +34,9 @@ final class TimesheetsTeamSubscriber extends AbstractActionsSubscriber
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($this->isGranted('export_other_timesheet')) {
|
if ($this->isGranted('export_other_timesheet')) {
|
||||||
$event->addAction('download', ['url' => $this->path('admin_timesheet_export'), 'class' => 'modal-ajax-form', 'title' => 'export']);
|
foreach ($this->serviceExport->getTimesheetExporter() as $exporter) {
|
||||||
|
$event->addActionToSubmenu('export', $exporter->getId(), ['url' => $this->path('admin_timesheet_export', ['exporter' => $exporter->getId()]), 'class' => 'toolbar-action', 'title' => 'button.' . $exporter->getId(), 'translation_domain' => 'messages']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,11 +27,6 @@ interface ExportRendererInterface
|
|||||||
*/
|
*/
|
||||||
public function getId(): string;
|
public function getId(): string;
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getIcon(): string;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -14,11 +14,6 @@ use App\Export\RendererInterface;
|
|||||||
|
|
||||||
final class CsvRenderer extends BaseCsvRenderer implements RendererInterface
|
final class CsvRenderer extends BaseCsvRenderer implements RendererInterface
|
||||||
{
|
{
|
||||||
public function getIcon(): string
|
|
||||||
{
|
|
||||||
return 'csv';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle(): string
|
public function getTitle(): string
|
||||||
{
|
{
|
||||||
return 'csv';
|
return 'csv';
|
||||||
|
|||||||
@@ -14,11 +14,6 @@ use App\Export\ExportRendererInterface;
|
|||||||
|
|
||||||
final class HtmlRenderer extends BaseHtmlRenderer implements ExportRendererInterface
|
final class HtmlRenderer extends BaseHtmlRenderer implements ExportRendererInterface
|
||||||
{
|
{
|
||||||
public function getIcon(): string
|
|
||||||
{
|
|
||||||
return 'print';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle(): string
|
public function getTitle(): string
|
||||||
{
|
{
|
||||||
return 'print';
|
return 'print';
|
||||||
|
|||||||
@@ -14,11 +14,6 @@ use App\Export\ExportRendererInterface;
|
|||||||
|
|
||||||
final class PDFRenderer extends BasePDFRenderer implements ExportRendererInterface
|
final class PDFRenderer extends BasePDFRenderer implements ExportRendererInterface
|
||||||
{
|
{
|
||||||
public function getIcon(): string
|
|
||||||
{
|
|
||||||
return 'pdf';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle(): string
|
public function getTitle(): string
|
||||||
{
|
{
|
||||||
return 'pdf';
|
return 'pdf';
|
||||||
|
|||||||
@@ -14,11 +14,6 @@ use App\Export\RendererInterface;
|
|||||||
|
|
||||||
final class XlsxRenderer extends BaseXlsxRenderer implements RendererInterface
|
final class XlsxRenderer extends BaseXlsxRenderer implements RendererInterface
|
||||||
{
|
{
|
||||||
public function getIcon(): string
|
|
||||||
{
|
|
||||||
return 'xlsx';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTitle(): string
|
public function getTitle(): string
|
||||||
{
|
{
|
||||||
return 'xlsx';
|
return 'xlsx';
|
||||||
|
|||||||
@@ -14,4 +14,8 @@ use App\Export\TimesheetExportInterface;
|
|||||||
|
|
||||||
final class CsvRenderer extends BaseCsvRenderer implements TimesheetExportInterface
|
final class CsvRenderer extends BaseCsvRenderer implements TimesheetExportInterface
|
||||||
{
|
{
|
||||||
|
public function getTitle(): string
|
||||||
|
{
|
||||||
|
return 'csv';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,11 +19,13 @@ final class HtmlRenderer extends BaseHtmlRenderer implements TimesheetExportInte
|
|||||||
return 'timesheet/export.html.twig';
|
return 'timesheet/export.html.twig';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getId(): string
|
public function getId(): string
|
||||||
{
|
{
|
||||||
return 'print';
|
return 'print';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle(): string
|
||||||
|
{
|
||||||
|
return 'print';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,4 +14,8 @@ use App\Export\TimesheetExportInterface;
|
|||||||
|
|
||||||
final class PDFRenderer extends BasePDFRenderer implements TimesheetExportInterface
|
final class PDFRenderer extends BasePDFRenderer implements TimesheetExportInterface
|
||||||
{
|
{
|
||||||
|
public function getTitle(): string
|
||||||
|
{
|
||||||
|
return 'pdf';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,4 +14,8 @@ use App\Export\TimesheetExportInterface;
|
|||||||
|
|
||||||
final class XlsxRenderer extends BaseXlsxRenderer implements TimesheetExportInterface
|
final class XlsxRenderer extends BaseXlsxRenderer implements TimesheetExportInterface
|
||||||
{
|
{
|
||||||
|
public function getTitle(): string
|
||||||
|
{
|
||||||
|
return 'xlsx';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,13 +19,10 @@ interface TimesheetExportInterface
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @param Timesheet[] $timesheets
|
* @param Timesheet[] $timesheets
|
||||||
* @param TimesheetQuery $query
|
|
||||||
* @return Response
|
|
||||||
*/
|
*/
|
||||||
public function render(array $timesheets, TimesheetQuery $query): Response;
|
public function render(array $timesheets, TimesheetQuery $query): Response;
|
||||||
|
|
||||||
/**
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getId(): string;
|
public function getId(): string;
|
||||||
|
|
||||||
|
public function getTitle(): string;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ namespace App\Form\Extension;
|
|||||||
use App\Form\Helper\ToolbarHelper;
|
use App\Form\Helper\ToolbarHelper;
|
||||||
use App\Form\Toolbar\ExportToolbarForm;
|
use App\Form\Toolbar\ExportToolbarForm;
|
||||||
use App\Form\Toolbar\InvoiceToolbarForm;
|
use App\Form\Toolbar\InvoiceToolbarForm;
|
||||||
use App\Form\Toolbar\TimesheetExportToolbarForm;
|
|
||||||
use App\Form\Toolbar\TimesheetToolbarForm;
|
use App\Form\Toolbar\TimesheetToolbarForm;
|
||||||
use App\Form\Toolbar\UserToolbarForm;
|
use App\Form\Toolbar\UserToolbarForm;
|
||||||
use App\Reporting\MonthlyUserList\MonthlyUserListForm;
|
use App\Reporting\MonthlyUserList\MonthlyUserListForm;
|
||||||
@@ -33,7 +32,6 @@ final class ToolbarFormExtension extends AbstractTypeExtension
|
|||||||
InvoiceToolbarForm::class,
|
InvoiceToolbarForm::class,
|
||||||
ExportToolbarForm::class,
|
ExportToolbarForm::class,
|
||||||
TimesheetToolbarForm::class,
|
TimesheetToolbarForm::class,
|
||||||
TimesheetExportToolbarForm::class,
|
|
||||||
UserToolbarForm::class,
|
UserToolbarForm::class,
|
||||||
WeeklyUserListForm::class,
|
WeeklyUserListForm::class,
|
||||||
MonthlyUserListForm::class,
|
MonthlyUserListForm::class,
|
||||||
|
|||||||
@@ -1,58 +0,0 @@
|
|||||||
<?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\Form\Toolbar;
|
|
||||||
|
|
||||||
use App\Repository\Query\TimesheetQuery;
|
|
||||||
use Symfony\Component\Form\AbstractType;
|
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Defines the form used for filtering the timesheet.
|
|
||||||
* @extends AbstractType<TimesheetQuery>
|
|
||||||
*/
|
|
||||||
final class TimesheetExportToolbarForm extends AbstractType
|
|
||||||
{
|
|
||||||
use ToolbarFormTrait;
|
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
|
||||||
{
|
|
||||||
$newOptions = [];
|
|
||||||
if ($options['ignore_date'] === true) {
|
|
||||||
$newOptions['ignore_date'] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->addSearchTermInputField($builder);
|
|
||||||
$this->addDateRange($builder, ['timezone' => $options['timezone']]);
|
|
||||||
$this->addCustomerMultiChoice($builder, $newOptions, true);
|
|
||||||
$this->addProjectMultiChoice($builder, $newOptions, true, true);
|
|
||||||
$this->addActivityMultiChoice($builder, [], true);
|
|
||||||
$this->addTagInputField($builder);
|
|
||||||
if ($options['include_user']) {
|
|
||||||
$this->addUsersChoice($builder);
|
|
||||||
}
|
|
||||||
$this->addTimesheetStateChoice($builder);
|
|
||||||
$this->addBillableChoice($builder);
|
|
||||||
$this->addExportStateChoice($builder);
|
|
||||||
$this->addOrder($builder);
|
|
||||||
$this->addOrderBy($builder, TimesheetQuery::TIMESHEET_ORDER_ALLOWED);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver): void
|
|
||||||
{
|
|
||||||
$resolver->setDefaults([
|
|
||||||
'data_class' => TimesheetQuery::class,
|
|
||||||
'csrf_protection' => false,
|
|
||||||
'include_user' => false,
|
|
||||||
'ignore_date' => true,
|
|
||||||
'timezone' => date_default_timezone_get(),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
{% extends kimai_context.modalRequest ? 'form.html.twig' : 'base.html.twig' %}
|
|
||||||
{% import "macros/widgets.html.twig" as widgets %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
{% if stats.count > 1000 %}
|
|
||||||
{{ widgets.alert('warning', ('export.warn_result_amount'|trans({'%count%': stats.count})), null, 'warning') }}
|
|
||||||
{% endif %}
|
|
||||||
{% set formEditTemplate = kimai_context.modalRequest ? 'default/_form_modal.html.twig' : 'default/_form.html.twig' %}
|
|
||||||
{% set formOptions = {
|
|
||||||
'title': 'export'|trans,
|
|
||||||
'form': form,
|
|
||||||
'back': path(route_back),
|
|
||||||
'formStartOptions': {'attr': {'class': 'searchform', 'target': '_blank'}},
|
|
||||||
} %}
|
|
||||||
{% embed formEditTemplate with formOptions %}
|
|
||||||
{% form_theme form 'form/search.html.twig' %}
|
|
||||||
{% block modal_size %}{% endblock %}
|
|
||||||
{% block form_body %}
|
|
||||||
{% set orderHasError = form.orderBy.vars.errors|length > 0 or form.order.vars.errors|length > 0 %}
|
|
||||||
{% set orderBy = form_widget(form.orderBy) %}
|
|
||||||
{% set order = form_widget(form.order) %}
|
|
||||||
{{ form_rest(form) }}
|
|
||||||
<div class="row mb-3{% if orderHasError %} is-invalid{% endif %}">
|
|
||||||
{{ form_label(form.orderBy) }}
|
|
||||||
<div class="col-sm-4 col-xs-4">
|
|
||||||
{{ orderBy|raw }}
|
|
||||||
{{ form_errors(form.orderBy) }}
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-4 col-xs-3">
|
|
||||||
{{ order|raw }}
|
|
||||||
{{ form_errors(form.order) }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
{% block submit_button %}
|
|
||||||
<div class="btn-group pull-left" role="group">
|
|
||||||
{% for exp in exporter %}
|
|
||||||
<button id="export-btn-{{ exp.id }}" formtarget="_blank" type="submit" name="exporter" value="{{ exp.id }}" class="btn btn-primary" data-loading-text="{{ ('button.' ~ exp.id)|trans }}…">{{ ('button.' ~ exp.id)|trans }}</button>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
{% endembed %}
|
|
||||||
{% endblock %}
|
|
||||||
@@ -245,14 +245,6 @@ abstract class ControllerBaseTest extends WebTestCase
|
|||||||
self::assertEquals(Response::HTTP_NOT_FOUND, $client->getResponse()->getStatusCode());
|
self::assertEquals(Response::HTTP_NOT_FOUND, $client->getResponse()->getStatusCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function assert404(Response $response, ?string $message = null): void
|
|
||||||
{
|
|
||||||
$message = 'Page not found';
|
|
||||||
self::assertFalse($response->isSuccessful());
|
|
||||||
self::assertEquals(Response::HTTP_NOT_FOUND, $response->getStatusCode());
|
|
||||||
self::assertStringContainsString($message, $response->getContent());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function assertMainContentClass(HttpKernelBrowser $client, string $classname): void
|
protected function assertMainContentClass(HttpKernelBrowser $client, string $classname): void
|
||||||
{
|
{
|
||||||
self::assertStringContainsString('<section id="" class="content ' . $classname . '">', $client->getResponse()->getContent());
|
self::assertStringContainsString('<section id="" class="content ' . $classname . '">', $client->getResponse()->getContent());
|
||||||
|
|||||||
@@ -172,9 +172,7 @@ class ExportControllerTest extends ControllerBaseTest
|
|||||||
{
|
{
|
||||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_TEAMLEAD);
|
||||||
$this->request($client, '/export/data', 'POST');
|
$this->request($client, '/export/data', 'POST');
|
||||||
|
$this->assertRouteNotFound($client);
|
||||||
$response = $client->getResponse();
|
|
||||||
$this->assert404($response, 'Missing export renderer');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExportActionWithInvalidRenderer(): void
|
public function testExportActionWithInvalidRenderer(): void
|
||||||
@@ -193,8 +191,7 @@ class ExportControllerTest extends ControllerBaseTest
|
|||||||
'renderer' => 'default'
|
'renderer' => 'default'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$response = $client->getResponse();
|
$this->assertRouteNotFound($client);
|
||||||
$this->assert404($response, 'Unknown export renderer');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExportAction(): void
|
public function testExportAction(): void
|
||||||
|
|||||||
@@ -41,8 +41,11 @@ class TimesheetControllerTest extends ControllerBaseTest
|
|||||||
// there are no records by default in the test database
|
// there are no records by default in the test database
|
||||||
$this->assertHasNoEntriesWithFilter($client);
|
$this->assertHasNoEntriesWithFilter($client);
|
||||||
$this->assertPageActions($client, [
|
$this->assertPageActions($client, [
|
||||||
'download modal-ajax-form' => $this->createUrl('/timesheet/export/'),
|
|
||||||
'create modal-ajax-form' => $this->createUrl('/timesheet/create'),
|
'create modal-ajax-form' => $this->createUrl('/timesheet/create'),
|
||||||
|
'dropdown-item action-csv toolbar-action' => $this->createUrl('/timesheet/export/csv'),
|
||||||
|
'dropdown-item action-print toolbar-action' => $this->createUrl('/timesheet/export/print'),
|
||||||
|
'dropdown-item action-pdf toolbar-action' => $this->createUrl('/timesheet/export/pdf'),
|
||||||
|
'dropdown-item action-xlsx toolbar-action' => $this->createUrl('/timesheet/export/xlsx'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,12 +158,14 @@ class TimesheetControllerTest extends ControllerBaseTest
|
|||||||
$fixture->setStartDate(new \DateTime('-10 days'));
|
$fixture->setStartDate(new \DateTime('-10 days'));
|
||||||
$this->importFixture($fixture);
|
$this->importFixture($fixture);
|
||||||
|
|
||||||
$this->request($client, '/timesheet/export/');
|
$this->request($client, '/timesheet/');
|
||||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||||
|
|
||||||
$dateRange = $this->formatDateRange(new \DateTime('-10 days'), new \DateTime());
|
$dateRange = $this->formatDateRange(new \DateTime('-10 days'), new \DateTime());
|
||||||
|
|
||||||
$client->submitForm('export-btn-print', [
|
$form = $client->getCrawler()->filter('form.searchform')->form();
|
||||||
|
$form->getNode()->setAttribute('action', $this->createUrl('/timesheet/export/print'));
|
||||||
|
$client->submit($form, [
|
||||||
'state' => 1,
|
'state' => 1,
|
||||||
'daterange' => $dateRange,
|
'daterange' => $dateRange,
|
||||||
'customers' => [],
|
'customers' => [],
|
||||||
@@ -177,6 +182,13 @@ class TimesheetControllerTest extends ControllerBaseTest
|
|||||||
$this->assertEquals(5, \count($result));
|
$this->assertEquals(5, \count($result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testExporterNotFoundAction(): void
|
||||||
|
{
|
||||||
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||||
|
$this->request($client, '/timesheet/export/notfound');
|
||||||
|
$this->assertRouteNotFound($client);
|
||||||
|
}
|
||||||
|
|
||||||
public function testCreateAction(): void
|
public function testCreateAction(): void
|
||||||
{
|
{
|
||||||
$client = $this->getClientForAuthenticatedUser();
|
$client = $this->getClientForAuthenticatedUser();
|
||||||
|
|||||||
@@ -43,9 +43,12 @@ class TimesheetTeamControllerTest extends ControllerBaseTest
|
|||||||
$this->assertHasNoEntriesWithFilter($client);
|
$this->assertHasNoEntriesWithFilter($client);
|
||||||
|
|
||||||
$this->assertPageActions($client, [
|
$this->assertPageActions($client, [
|
||||||
'download modal-ajax-form' => $this->createUrl('/team/timesheet/export/'),
|
|
||||||
'create create-ts modal-ajax-form' => $this->createUrl('/team/timesheet/create'),
|
'create create-ts modal-ajax-form' => $this->createUrl('/team/timesheet/create'),
|
||||||
'multi-user create-ts-mu modal-ajax-form' => $this->createUrl('/team/timesheet/create_mu'),
|
'multi-user create-ts-mu modal-ajax-form' => $this->createUrl('/team/timesheet/create_mu'),
|
||||||
|
'dropdown-item action-csv toolbar-action' => $this->createUrl('/team/timesheet/export/csv'),
|
||||||
|
'dropdown-item action-print toolbar-action' => $this->createUrl('/team/timesheet/export/print'),
|
||||||
|
'dropdown-item action-pdf toolbar-action' => $this->createUrl('/team/timesheet/export/pdf'),
|
||||||
|
'dropdown-item action-xlsx toolbar-action' => $this->createUrl('/team/timesheet/export/xlsx'),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,12 +139,14 @@ class TimesheetTeamControllerTest extends ControllerBaseTest
|
|||||||
$fixture->setStartDate(new \DateTime('-10 days'));
|
$fixture->setStartDate(new \DateTime('-10 days'));
|
||||||
$this->importFixture($fixture);
|
$this->importFixture($fixture);
|
||||||
|
|
||||||
$this->request($client, '/team/timesheet/export/');
|
$this->request($client, '/team/timesheet/');
|
||||||
$this->assertTrue($client->getResponse()->isSuccessful());
|
$this->assertTrue($client->getResponse()->isSuccessful());
|
||||||
|
|
||||||
$dateRange = $this->formatDateRange(new \DateTime('-10 days'), new \DateTime());
|
$dateRange = $this->formatDateRange(new \DateTime('-10 days'), new \DateTime());
|
||||||
|
|
||||||
$client->submitForm('export-btn-print', [
|
$form = $client->getCrawler()->filter('form.searchform')->form();
|
||||||
|
$form->getNode()->setAttribute('action', $this->createUrl('/team/timesheet/export/print'));
|
||||||
|
$client->submit($form, [
|
||||||
'state' => 1,
|
'state' => 1,
|
||||||
'daterange' => $dateRange,
|
'daterange' => $dateRange,
|
||||||
'customers' => [],
|
'customers' => [],
|
||||||
@@ -158,6 +163,13 @@ class TimesheetTeamControllerTest extends ControllerBaseTest
|
|||||||
$this->assertEquals(10, \count($result));
|
$this->assertEquals(10, \count($result));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testExporterNotFoundAction(): void
|
||||||
|
{
|
||||||
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||||
|
$this->request($client, '/team/timesheet/export/notfound');
|
||||||
|
$this->assertRouteNotFound($client);
|
||||||
|
}
|
||||||
|
|
||||||
public function testCreateAction(): void
|
public function testCreateAction(): void
|
||||||
{
|
{
|
||||||
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
$client = $this->getClientForAuthenticatedUser(User::ROLE_ADMIN);
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ class CsvRendererTest extends AbstractRendererTest
|
|||||||
|
|
||||||
$this->assertEquals('csv', $sut->getId());
|
$this->assertEquals('csv', $sut->getId());
|
||||||
$this->assertEquals('csv', $sut->getTitle());
|
$this->assertEquals('csv', $sut->getTitle());
|
||||||
$this->assertEquals('csv', $sut->getIcon());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTestModel()
|
public function getTestModel()
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ class HtmlRendererTest extends AbstractRendererTest
|
|||||||
|
|
||||||
$this->assertEquals('html', $sut->getId());
|
$this->assertEquals('html', $sut->getId());
|
||||||
$this->assertEquals('print', $sut->getTitle());
|
$this->assertEquals('print', $sut->getTitle());
|
||||||
$this->assertEquals('print', $sut->getIcon());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRender(): void
|
public function testRender(): void
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ class PdfRendererTest extends AbstractRendererTest
|
|||||||
|
|
||||||
$this->assertEquals('pdf', $sut->getId());
|
$this->assertEquals('pdf', $sut->getId());
|
||||||
$this->assertEquals('pdf', $sut->getTitle());
|
$this->assertEquals('pdf', $sut->getTitle());
|
||||||
$this->assertEquals('pdf', $sut->getIcon());
|
|
||||||
$this->assertEquals([], $sut->getPdfOptions());
|
$this->assertEquals([], $sut->getPdfOptions());
|
||||||
|
|
||||||
$sut->setPdfOption('foo', 'bar');
|
$sut->setPdfOption('foo', 'bar');
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ class XlsxRendererTest extends AbstractRendererTest
|
|||||||
|
|
||||||
$this->assertEquals('xlsx', $sut->getId());
|
$this->assertEquals('xlsx', $sut->getId());
|
||||||
$this->assertEquals('xlsx', $sut->getTitle());
|
$this->assertEquals('xlsx', $sut->getTitle());
|
||||||
$this->assertEquals('xlsx', $sut->getIcon());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRender(): void
|
public function testRender(): void
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class CsvRendererTest extends AbstractRendererTest
|
|||||||
$sut = $this->getAbstractRenderer(CsvRenderer::class);
|
$sut = $this->getAbstractRenderer(CsvRenderer::class);
|
||||||
|
|
||||||
$this->assertEquals('csv', $sut->getId());
|
$this->assertEquals('csv', $sut->getId());
|
||||||
|
$this->assertEquals('csv', $sut->getTitle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTestModel()
|
public function getTestModel()
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class HtmlRendererTest extends AbstractRendererTest
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals('print', $sut->getId());
|
$this->assertEquals('print', $sut->getId());
|
||||||
|
$this->assertEquals('print', $sut->getTitle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRender(): void
|
public function testRender(): void
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class PdfRendererTest extends AbstractRendererTest
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals('pdf', $sut->getId());
|
$this->assertEquals('pdf', $sut->getId());
|
||||||
|
$this->assertEquals('pdf', $sut->getTitle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRender(): void
|
public function testRender(): void
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ class XlsxRendererTest extends AbstractRendererTest
|
|||||||
$sut = $this->getAbstractRenderer(XlsxRenderer::class);
|
$sut = $this->getAbstractRenderer(XlsxRenderer::class);
|
||||||
|
|
||||||
$this->assertEquals('xlsx', $sut->getId());
|
$this->assertEquals('xlsx', $sut->getId());
|
||||||
|
$this->assertEquals('xlsx', $sut->getTitle());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRender(): void
|
public function testRender(): void
|
||||||
|
|||||||
@@ -676,7 +676,7 @@ parameters:
|
|||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#2 \\$haystack of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertStringContainsString\\(\\) expects string, string\\|false given\\.$#"
|
message: "#^Parameter \\#2 \\$haystack of static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertStringContainsString\\(\\) expects string, string\\|false given\\.$#"
|
||||||
count: 10
|
count: 9
|
||||||
path: Controller/ControllerBaseTest.php
|
path: Controller/ControllerBaseTest.php
|
||||||
|
|
||||||
-
|
-
|
||||||
@@ -1434,16 +1434,6 @@ parameters:
|
|||||||
count: 1
|
count: 1
|
||||||
path: Export/Renderer/AbstractRendererTest.php
|
path: Export/Renderer/AbstractRendererTest.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Call to an undefined method App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface\\:\\:getIcon\\(\\)\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/CsvRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Call to an undefined method App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface\\:\\:getTitle\\(\\)\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/CsvRendererTest.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\CsvRendererTest\\:\\:getTestModel\\(\\) has no return type specified\\.$#"
|
message: "#^Method App\\\\Tests\\\\Export\\\\Renderer\\\\CsvRendererTest\\:\\:getTestModel\\(\\) has no return type specified\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
@@ -1524,16 +1514,6 @@ parameters:
|
|||||||
count: 7
|
count: 7
|
||||||
path: Export/Renderer/HtmlRendererTest.php
|
path: Export/Renderer/HtmlRendererTest.php
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Call to an undefined method App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface\\:\\:getIcon\\(\\)\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/XlsxRendererTest.php
|
|
||||||
|
|
||||||
-
|
|
||||||
message: "#^Call to an undefined method App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface\\:\\:getTitle\\(\\)\\.$#"
|
|
||||||
count: 1
|
|
||||||
path: Export/Renderer/XlsxRendererTest.php
|
|
||||||
|
|
||||||
-
|
-
|
||||||
message: "#^Parameter \\#1 \\$renderer of method App\\\\Tests\\\\Export\\\\Renderer\\\\AbstractRendererTest\\:\\:render\\(\\) expects App\\\\Export\\\\ExportRendererInterface, App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface given\\.$#"
|
message: "#^Parameter \\#1 \\$renderer of method App\\\\Tests\\\\Export\\\\Renderer\\\\AbstractRendererTest\\:\\:render\\(\\) expects App\\\\Export\\\\ExportRendererInterface, App\\\\Export\\\\ExportRendererInterface\\|App\\\\Export\\\\TimesheetExportInterface given\\.$#"
|
||||||
count: 1
|
count: 1
|
||||||
|
|||||||
Reference in New Issue
Block a user