save default search options (#2445)

* set default times for daterange objects
* allow to show order and order by fields
* move search to modal
* more options for page size
* save export visibility in cookie
This commit is contained in:
Kevin Papst
2021-03-20 01:10:45 +01:00
committed by GitHub
parent 954ba7c937
commit 87d07ffaaf
83 changed files with 903 additions and 410 deletions

View File

@@ -10,11 +10,16 @@
namespace App\Controller;
use App\Configuration\LanguageFormattings;
use App\Entity\Bookmark;
use App\Entity\User;
use App\Repository\BookmarkRepository;
use App\Repository\Query\BaseQuery;
use App\Timesheet\DateTimeFactory;
use App\Utils\LocaleFormats;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as BaseAbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Translation\DataCollectorTranslator;
use Symfony\Contracts\Service\ServiceSubscriberInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
@@ -167,4 +172,72 @@ abstract class AbstractController extends BaseAbstractController implements Serv
{
return new LocaleFormats($this->container->get(LanguageFormattings::class), $locale);
}
protected function handleSearch(FormInterface $form, Request $request): bool
{
$data = $form->getData();
if (!($data instanceof BaseQuery)) {
throw new \InvalidArgumentException('handleSearchForm() requires an instanceof BaseQuery as form data');
}
/** @var BookmarkRepository $bookmarkRepo */
$bookmarkRepo = $this->getDoctrine()->getRepository(Bookmark::class);
$bookmark = $bookmarkRepo->getSearchDefaultOptions($this->getUser(), $data->getName());
$submitData = $request->query->all();
// remove bookmark
if ($bookmark !== null && $request->query->has('removeDefaultQuery')) {
$bookmarkRepo->deleteBookmark($bookmark);
return true;
}
// apply bookmark ONLY if search form was not submitted manually
if ($bookmark !== null && !$request->query->has('performSearch')) {
$data->setBookmark($bookmark);
$submitData = array_merge($bookmark->getContent(), $submitData);
}
// clean up parameters from unknown search values
foreach ($submitData as $name => $values) {
if (!$form->has($name)) {
unset($submitData[$name]);
}
}
$form->submit($submitData, false);
if (!$form->isValid()) {
$data->resetByFormError($form->getErrors());
}
if ($request->query->has('setDefaultQuery')) {
$params = [];
foreach ($form->all() as $name => $child) {
$params[$name] = $child->getViewData();
}
$filter = ['page', 'setDefaultQuery', 'removeDefaultQuery', 'performSearch'];
foreach ($filter as $name) {
if (isset($params[$name])) {
unset($params[$name]);
}
}
if ($bookmark === null) {
$bookmark = new Bookmark();
$bookmark->setType(Bookmark::SEARCH_DEFAULT);
$bookmark->setUser($this->getUser());
$bookmark->setName(substr($data->getName(), 0, 50));
}
$bookmark->setContent($params);
$bookmarkRepo->saveBookmark($bookmark);
return true;
}
return false;
}
}

View File

@@ -31,7 +31,6 @@ use App\Repository\Query\ActivityFormTypeQuery;
use App\Repository\Query\ActivityQuery;
use App\Repository\TeamRepository;
use Exception;
use Pagerfanta\Pagerfanta;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\FormInterface;
@@ -77,14 +76,10 @@ final class ActivityController extends AbstractController
$query->setPage($page);
$form = $this->getToolbarForm($query);
$form->setData($query);
$form->submit($request->query->all(), false);
if (!$form->isValid()) {
$query->resetByFormError($form->getErrors());
if ($this->handleSearch($form, $request)) {
return $this->redirectToRoute('admin_activity');
}
/* @var $entries Pagerfanta */
$entries = $this->repository->getPagerfantaForQuery($query);
return $this->render('activity/index.html.twig', [

View File

@@ -76,11 +76,8 @@ final class CustomerController extends AbstractController
$query->setPage($page);
$form = $this->getToolbarForm($query);
$form->setData($query);
$form->submit($request->query->all(), false);
if (!$form->isValid()) {
$query->resetByFormError($form->getErrors());
if ($this->handleSearch($form, $request)) {
return $this->redirectToRoute('admin_customer');
}
$entries = $this->repository->getPagerfantaForQuery($query);

View File

@@ -88,14 +88,10 @@ final class ProjectController extends AbstractController
$query->setPage($page);
$form = $this->getToolbarForm($query);
$form->setData($query);
$form->submit($request->query->all(), false);
if (!$form->isValid()) {
$query->resetByFormError($form->getErrors());
if ($this->handleSearch($form, $request)) {
return $this->redirectToRoute('admin_project');
}
/* @var $entries Pagerfanta */
$entries = $this->repository->getPagerfantaForQuery($query);
return $this->render('project/index.html.twig', [

View File

@@ -429,14 +429,6 @@ final class SystemConfigurationController extends AbstractController
->setLabel('theme.tags_create')
->setType(CheckboxType::class)
->setTranslationDomain('system-configuration'),
// TODO should that be configurable per user?
/*
(new Configuration())
->setName('theme.auto_reload_datatable')
->setLabel('theme.auto_reload_datatable') // TODO translation
->setType(CheckboxType::class)
->setTranslationDomain('system-configuration'),
*/
]),
(new SystemConfigurationModel())
->setSection(SystemConfigurationModel::SECTION_CALENDAR)

View File

@@ -43,11 +43,8 @@ class TagController extends AbstractController
$query->setPage($page);
$form = $this->getToolbarForm($query);
$form->setData($query);
$form->submit($request->query->all(), false);
if (!$form->isValid()) {
$query->resetByFormError($form->getErrors());
if ($this->handleSearch($form, $request)) {
return $this->redirectToRoute('tags');
}
$tags = $repository->getTagCount($query);

View File

@@ -55,11 +55,8 @@ final class TeamController extends AbstractController
$query->setCurrentUser($this->getUser());
$form = $this->getToolbarForm($query);
$form->setData($query);
$form->submit($request->query->all(), false);
if (!$form->isValid()) {
$query->resetByFormError($form->getErrors());
if ($this->handleSearch($form, $request)) {
return $this->redirectToRoute('admin_team');
}
$teams = $repository->getPagerfantaForQuery($query);

View File

@@ -77,24 +77,11 @@ abstract class TimesheetAbstractController extends AbstractController
return $this->service->getActiveTrackingMode();
}
protected function index($page, Request $request, string $renderTemplate, string $location): Response
protected function index(TimesheetQuery $query, Request $request, string $route, string $renderTemplate, string $location): Response
{
$query = new TimesheetQuery();
$query->setPage($page);
$form = $this->getToolbarForm($query);
$form->setData($query);
$form->submit($request->query->all(), false);
if (!$form->isValid()) {
$query->resetByFormError($form->getErrors());
}
if (null !== $query->getBegin()) {
$query->getBegin()->setTime(0, 0, 0);
}
if (null !== $query->getEnd()) {
$query->getEnd()->setTime(23, 59, 59);
if ($this->handleSearch($form, $request)) {
return $this->redirectToRoute($route);
}
$tags = $query->getTags(true);
@@ -486,11 +473,7 @@ abstract class TimesheetAbstractController extends AbstractController
]);
}
/**
* @param TimesheetQuery $query
* @return FormInterface
*/
protected function getToolbarForm(TimesheetQuery $query)
protected function getToolbarForm(TimesheetQuery $query): FormInterface
{
return $this->createForm(TimesheetToolbarForm::class, $query, [
'action' => $this->generateUrl($this->getTimesheetRoute(), [

View File

@@ -13,6 +13,7 @@ use App\Entity\Timesheet;
use App\Event\TimesheetMetaDisplayEvent;
use App\Repository\ActivityRepository;
use App\Repository\ProjectRepository;
use App\Repository\Query\TimesheetQuery;
use App\Repository\TagRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Request;
@@ -36,7 +37,11 @@ class TimesheetController extends TimesheetAbstractController
*/
public function indexAction($page, Request $request)
{
return $this->index($page, $request, 'timesheet/index.html.twig', TimesheetMetaDisplayEvent::TIMESHEET);
$query = new TimesheetQuery();
$query->setPage($page);
$query->setName('MyTimesListing');
return $this->index($query, $request, 'timesheet', 'timesheet/index.html.twig', TimesheetMetaDisplayEvent::TIMESHEET);
}
/**

View File

@@ -45,7 +45,11 @@ class TimesheetTeamController extends TimesheetAbstractController
*/
public function indexAction($page, Request $request)
{
return $this->index($page, $request, 'timesheet-team/index.html.twig', TimesheetMetaDisplayEvent::TEAM_TIMESHEET);
$query = new TimesheetQuery();
$query->setPage($page);
$query->setName('TeamTimesListing');
return $this->index($query, $request, 'admin_timesheet', 'timesheet-team/index.html.twig', TimesheetMetaDisplayEvent::TEAM_TIMESHEET);
}
/**

View File

@@ -22,7 +22,6 @@ use App\Repository\Query\UserFormTypeQuery;
use App\Repository\Query\UserQuery;
use App\Repository\TimesheetRepository;
use App\Repository\UserRepository;
use Pagerfanta\Pagerfanta;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\FormInterface;
@@ -78,14 +77,10 @@ final class UserController extends AbstractController
$query->setPage($page);
$form = $this->getToolbarForm($query);
$form->setData($query);
$form->submit($request->query->all(), false);
if (!$form->isValid()) {
$query->resetByFormError($form->getErrors());
if ($this->handleSearch($form, $request)) {
return $this->redirectToRoute('admin_user');
}
/* @var $entries Pagerfanta */
$entries = $this->getRepository()->getPagerfantaForQuery($query);
$event = new UserPreferenceDisplayEvent(UserPreferenceDisplayEvent::USERS);