From 736e1a7b34812e5baa7cfe7aea22a1e252f03bcd Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Sun, 7 Jan 2018 22:38:51 +0100 Subject: [PATCH] added toolbar for activity screen #2 (#51) * merged toolbar javascripts #2 * added activity toolbar #2 --- .../Controller/Admin/ActivityController.php | 72 +++++++++++++++++-- .../Form/ActivityToolbarForm.php | 63 ++++++++++++++++ .../Repository/ActivityRepository.php | 8 +++ .../Repository/Query/ActivityQuery.php | 49 +++++++++++++ .../Resources/views/admin/activity.html.twig | 9 +-- .../Resources/views/admin/project.html.twig | 2 +- .../Resources/views/admin/timesheet.html.twig | 2 +- .../Resources/views/timesheet/index.html.twig | 2 +- web/js/timesheet.js | 24 ------- web/js/toolbar.js | 17 +++++ 10 files changed, 213 insertions(+), 35 deletions(-) create mode 100644 src/TimesheetBundle/Form/ActivityToolbarForm.php delete mode 100644 web/js/timesheet.js diff --git a/src/TimesheetBundle/Controller/Admin/ActivityController.php b/src/TimesheetBundle/Controller/Admin/ActivityController.php index 9cee9ee4..b11b8c9a 100644 --- a/src/TimesheetBundle/Controller/Admin/ActivityController.php +++ b/src/TimesheetBundle/Controller/Admin/ActivityController.php @@ -19,7 +19,10 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; +use TimesheetBundle\Entity\Customer; +use TimesheetBundle\Entity\Project; use TimesheetBundle\Form\ActivityEditForm; +use TimesheetBundle\Form\ActivityToolbarForm; use TimesheetBundle\Repository\Query\ActivityQuery; /** @@ -32,22 +35,65 @@ use TimesheetBundle\Repository\Query\ActivityQuery; */ class ActivityController extends AbstractController { + /** + * @param Request $request + * @return ActivityQuery + */ + protected function getQueryForRequest(Request $request) + { + $visibility = $request->get('visibility'); + if (strlen($visibility) == 0 || (int)$visibility != $visibility) { + $visibility = ActivityQuery::SHOW_BOTH; + } + $pageSize = (int) $request->get('pageSize'); + $customer = $request->get('customer'); + $customer = !empty(trim($customer)) ? trim($customer) : null; + $project = $request->get('project'); + $project = !empty(trim($project)) ? trim($project) : null; + + if ($project !== null) { + $repo = $this->getDoctrine()->getRepository(Project::class); + $project = $repo->getById($project); + if ($project !== null) { + $customer = $project->getCustomer(); + } else { + $customer = null; + } + } elseif ($customer !== null) { + $repo = $this->getDoctrine()->getRepository(Customer::class); + $customer = $repo->getById($customer); + } + + $query = new ActivityQuery(); + $query + ->setPageSize($pageSize) + ->setVisibility($visibility) + ->setCustomer($customer) + ->setProject($project) + ; + + return $query ; + } + /** * @Route("/", defaults={"page": 1}, name="admin_activity") * @Route("/page/{page}", requirements={"page": "[1-9]\d*"}, name="admin_activity_paginated") * @Method("GET") * @Cache(smaxage="10") */ - public function indexAction($page) + public function indexAction($page, Request $request) { - $query = new ActivityQuery(); - $query->setVisibility(ActivityQuery::SHOW_BOTH); + $query = $this->getQueryForRequest($request); $query->setPage($page); /* @var $entries Pagerfanta */ $entries = $this->getDoctrine()->getRepository(Activity::class)->findByQuery($query); - return $this->render('TimesheetBundle:admin:activity.html.twig', ['entries' => $entries]); + return $this->render('TimesheetBundle:admin:activity.html.twig', [ + 'entries' => $entries, + 'query' => $query, + 'toolbarForm' => $this->getToolbarForm($query)->createView(), + ]); } /** @@ -99,6 +145,24 @@ class ActivityController extends AbstractController ); } + /** + * @param ActivityQuery $query + * @return \Symfony\Component\Form\FormInterface + */ + protected function getToolbarForm(ActivityQuery $query) + { + return $this->createForm( + ActivityToolbarForm::class, + $query, + [ + 'action' => $this->generateUrl('admin_activity_paginated', [ + 'page' => $query->getPage(), + ]), + 'method' => 'GET', + ] + ); + } + /** * @param Activity $activity * @return \Symfony\Component\Form\FormInterface diff --git a/src/TimesheetBundle/Form/ActivityToolbarForm.php b/src/TimesheetBundle/Form/ActivityToolbarForm.php new file mode 100644 index 00000000..7647a3ef --- /dev/null +++ b/src/TimesheetBundle/Form/ActivityToolbarForm.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace TimesheetBundle\Form; + +use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\OptionsResolver\OptionsResolver; +use TimesheetBundle\Form\Type\ProjectType; +use TimesheetBundle\Repository\Query\ActivityQuery; + +/** + * Defines the form used for filtering the activities. + * + * @author Kevin Papst + */ +class ActivityToolbarForm extends ProjectToolbarForm +{ + + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options) + { + /** @var ActivityQuery $query */ + $query = $options['data']; + + parent::buildForm($builder, $options); + + if ($query->getCustomer() === null) { + return; + } + + $choices = []; + foreach ($query->getCustomer()->getProjects() as $project) { + $choices[] = $project; + } + + $builder + ->add('project', ProjectType::class, [ + 'required' => false, + 'choices' => $choices, + ]); + } + + /** + * {@inheritdoc} + */ + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => ActivityQuery::class, + 'csrf_protection' => false, + ]); + } +} diff --git a/src/TimesheetBundle/Repository/ActivityRepository.php b/src/TimesheetBundle/Repository/ActivityRepository.php index c8ca6689..24d87fe8 100644 --- a/src/TimesheetBundle/Repository/ActivityRepository.php +++ b/src/TimesheetBundle/Repository/ActivityRepository.php @@ -115,6 +115,14 @@ class ActivityRepository extends AbstractRepository // TODO check for visibility of customer and project } + if ($query->getProject() !== null) { + $qb->andWhere('a.project = :project') + ->setParameter('project', $query->getProject()); + } elseif ($query->getCustomer() !== null) { + $qb->andWhere('p.customer = :customer') + ->setParameter('customer', $query->getCustomer()); + } + return $this->getBaseQueryResult($qb, $query); } } diff --git a/src/TimesheetBundle/Repository/Query/ActivityQuery.php b/src/TimesheetBundle/Repository/Query/ActivityQuery.php index cd6111e0..a4e62964 100644 --- a/src/TimesheetBundle/Repository/Query/ActivityQuery.php +++ b/src/TimesheetBundle/Repository/Query/ActivityQuery.php @@ -14,6 +14,8 @@ namespace TimesheetBundle\Repository\Query; use AppBundle\Repository\Query\BaseQuery; use AppBundle\Repository\Query\VisibilityInterface; use AppBundle\Repository\Query\VisibilityTrait; +use TimesheetBundle\Entity\Customer; +use TimesheetBundle\Entity\Project; /** * Can be used for advanced queries with the: ActivityRepository @@ -23,4 +25,51 @@ use AppBundle\Repository\Query\VisibilityTrait; class ActivityQuery extends BaseQuery implements VisibilityInterface { use VisibilityTrait; + + /** + * @var Project + */ + protected $project; + + /** + * @var Customer + */ + protected $customer; + + /** + * @return Customer + */ + public function getCustomer() + { + return $this->customer; + } + + /** + * @param Customer $customer + * @return $this + */ + public function setCustomer(Customer $customer = null) + { + $this->customer = $customer; + return $this; + } + + /** + * @return Project + */ + public function getProject() + { + return $this->project; + } + + /** + * @param Project $project + * @return $this + */ + public function setProject(Project $project = null) + { + $this->project = $project; + return $this; + } + } diff --git a/src/TimesheetBundle/Resources/views/admin/activity.html.twig b/src/TimesheetBundle/Resources/views/admin/activity.html.twig index 97833a5b..9a7c4fa6 100644 --- a/src/TimesheetBundle/Resources/views/admin/activity.html.twig +++ b/src/TimesheetBundle/Resources/views/admin/activity.html.twig @@ -4,6 +4,7 @@ {% block page_title %}{{ 'admin_activity.title'|trans }}{% endblock %} {% block page_subtitle %}{{ 'admin_activity.subtitle'|trans }} {{ 'subtitle.amount'|trans({'%count%': entries.count}) }}{% endblock %} +{% block javascript_imports %}{% endblock %} {% block main %} {% if entries.count == 0 %} @@ -13,22 +14,22 @@ {{ tables.data_table_header({ 'label.id': 'hidden-xs', 'label.name': '', - 'label.project': '', 'label.customer': '', + 'label.project': '', 'label.comment': 'hidden-xs', 'label.visible': '', 'label.actions': '', - }, null, {'plus-square': path('admin_activity_create')}) }} + }, toolbarForm, {'plus-square': path('admin_activity_create')}) }} {% for entry in entries %} {{ entry.id }} {{ entry.name }} - {{ widgets.label_project(entry.project) }} + {{ widgets.label_customer(entry.project.customer) }} - {{ widgets.label_customer(entry.project.customer) }} + {{ widgets.label_project(entry.project) }} {{ entry.comment }} {{ widgets.label_visible(entry.visible) }} diff --git a/src/TimesheetBundle/Resources/views/admin/project.html.twig b/src/TimesheetBundle/Resources/views/admin/project.html.twig index 035dd4d6..dcb81231 100644 --- a/src/TimesheetBundle/Resources/views/admin/project.html.twig +++ b/src/TimesheetBundle/Resources/views/admin/project.html.twig @@ -4,7 +4,7 @@ {% block page_title %}{{ 'admin_project.title'|trans }}{% endblock %} {% block page_subtitle %}{{ 'admin_project.subtitle'|trans }} {{ 'subtitle.amount'|trans({'%count%': entries.count}) }}{% endblock %} -{% block javascript_imports %}{% endblock %} +{% block javascript_imports %}{% endblock %} {% block main %} {% if entries.count == 0 %} diff --git a/src/TimesheetBundle/Resources/views/admin/timesheet.html.twig b/src/TimesheetBundle/Resources/views/admin/timesheet.html.twig index dac4815b..c64cad5c 100644 --- a/src/TimesheetBundle/Resources/views/admin/timesheet.html.twig +++ b/src/TimesheetBundle/Resources/views/admin/timesheet.html.twig @@ -4,7 +4,7 @@ {% block page_title %}{{ 'admin_timesheet.title'|trans }}{% endblock %} {% block page_subtitle %}{{ 'admin_timesheet.subtitle'|trans }}{% endblock %} -{% block javascript_imports %}{% endblock %} +{% block javascript_imports %}{% endblock %} {% block main %} {% if entries.count == 0 %} diff --git a/src/TimesheetBundle/Resources/views/timesheet/index.html.twig b/src/TimesheetBundle/Resources/views/timesheet/index.html.twig index 2bf41f4b..3c2701cf 100644 --- a/src/TimesheetBundle/Resources/views/timesheet/index.html.twig +++ b/src/TimesheetBundle/Resources/views/timesheet/index.html.twig @@ -4,7 +4,7 @@ {% block page_title %}{{ 'timesheet.title'|trans }}{% endblock %} {% block page_subtitle %}{{ 'timesheet.subtitle'|trans }}{% endblock %} -{% block javascript_imports %}{% endblock %} +{% block javascript_imports %}{% endblock %} {% block main %} {% if entries.count == 0 %} diff --git a/web/js/timesheet.js b/web/js/timesheet.js deleted file mode 100644 index 549bc3a6..00000000 --- a/web/js/timesheet.js +++ /dev/null @@ -1,24 +0,0 @@ -$(document).ready(function () { - - $('.toolbar form select').change(function (event) { - switch (event.target.id) { - case 'customer': - if ($(this).val() === '') { - $('.toolbar form select#project').parent().remove(); - } else { - $('.toolbar form select#project').val(''); - } - $('.toolbar form select#activity').parent().remove(); - break; - case 'project': - if ($(this).val() === '') { - $('.toolbar form select#activity').parent().remove(); - } else { - $('.toolbar form select#activity').val(''); - } - break; - } - $('.toolbar form').submit(); - }); - -}); diff --git a/web/js/toolbar.js b/web/js/toolbar.js index 24a98719..549bc3a6 100644 --- a/web/js/toolbar.js +++ b/web/js/toolbar.js @@ -1,6 +1,23 @@ $(document).ready(function () { $('.toolbar form select').change(function (event) { + switch (event.target.id) { + case 'customer': + if ($(this).val() === '') { + $('.toolbar form select#project').parent().remove(); + } else { + $('.toolbar form select#project').val(''); + } + $('.toolbar form select#activity').parent().remove(); + break; + case 'project': + if ($(this).val() === '') { + $('.toolbar form select#activity').parent().remove(); + } else { + $('.toolbar form select#activity').val(''); + } + break; + } $('.toolbar form').submit(); });