toolbar dropdown and visibility improvements (#933)

This commit is contained in:
Kevin Papst
2019-07-09 16:34:11 +02:00
committed by GitHub
parent b833e1ce27
commit c33a87a07c
74 changed files with 1317 additions and 631 deletions

View File

@@ -15,6 +15,8 @@ use App\Form\Type\CustomerType;
use App\Form\Type\ProjectType;
use App\Repository\CustomerRepository;
use App\Repository\ProjectRepository;
use App\Repository\Query\CustomerFormTypeQuery;
use App\Repository\Query\ProjectFormTypeQuery;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
@@ -66,7 +68,7 @@ class ActivityEditForm extends AbstractType
$builder
->add('customer', CustomerType::class, [
'query_builder' => function (CustomerRepository $repo) use ($customer) {
return $repo->builderForEntityType($customer);
return $repo->getQueryBuilderForFormType(new CustomerFormTypeQuery($customer));
},
'data' => $customer ? $customer : null,
'required' => false,
@@ -79,7 +81,7 @@ class ActivityEditForm extends AbstractType
->add('project', ProjectType::class, [
'required' => false,
'query_builder' => function (ProjectRepository $repo) use ($project, $customer) {
return $repo->builderForEntityType($project, $customer);
return $repo->getQueryBuilderForFormType(new ProjectFormTypeQuery($project, $customer));
},
]);
@@ -95,7 +97,7 @@ class ActivityEditForm extends AbstractType
$event->getForm()->add('project', ProjectType::class, [
'group_by' => null,
'query_builder' => function (ProjectRepository $repo) use ($data, $project) {
return $repo->builderForEntityType($project, $data['customer']);
return $repo->getQueryBuilderForFormType(new ProjectFormTypeQuery($project, $data['customer']));
},
]);
}

View File

@@ -13,6 +13,7 @@ use App\Entity\Customer;
use App\Entity\Project;
use App\Form\Type\CustomerType;
use App\Repository\CustomerRepository;
use App\Repository\Query\CustomerFormTypeQuery;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
@@ -59,7 +60,7 @@ class ProjectEditForm extends AbstractType
])
->add('customer', CustomerType::class, [
'query_builder' => function (CustomerRepository $repo) use ($customer) {
return $repo->builderForEntityType($customer);
return $repo->getQueryBuilderForFormType(new CustomerFormTypeQuery($customer));
},
]);

View File

@@ -27,6 +27,9 @@ use App\Form\Type\YesNoType;
use App\Repository\ActivityRepository;
use App\Repository\CustomerRepository;
use App\Repository\ProjectRepository;
use App\Repository\Query\ActivityFormTypeQuery;
use App\Repository\Query\CustomerFormTypeQuery;
use App\Repository\Query\ProjectFormTypeQuery;
use App\Timesheet\UserDateTimeFactory;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
@@ -162,11 +165,11 @@ class TimesheetEditForm extends AbstractType
$builder
->add('customer', CustomerType::class, [
'query_builder' => function (CustomerRepository $repo) use ($customer) {
return $repo->builderForEntityType($customer);
return $repo->getQueryBuilderForFormType(new CustomerFormTypeQuery($customer));
},
'data' => $customer ? $customer : '',
'required' => false,
'placeholder' => null === $customer ? '' : null,
'placeholder' => '',
'mapped' => false,
'project_enabled' => true,
]);
@@ -192,7 +195,7 @@ class TimesheetEditForm extends AbstractType
'placeholder' => '',
'activity_enabled' => true,
'query_builder' => function (ProjectRepository $repo) use ($project, $customer) {
return $repo->builderForEntityType($project, $customer);
return $repo->getQueryBuilderForFormType(new ProjectFormTypeQuery($project, $customer));
},
])
);
@@ -211,7 +214,7 @@ class TimesheetEditForm extends AbstractType
'activity_enabled' => true,
'group_by' => null,
'query_builder' => function (ProjectRepository $repo) use ($data, $project) {
return $repo->builderForEntityType($project, $data['customer']);
return $repo->getQueryBuilderForFormType(new ProjectFormTypeQuery($project, $data['customer']));
},
]);
}
@@ -224,7 +227,7 @@ class TimesheetEditForm extends AbstractType
->add('activity', ActivityType::class, [
'placeholder' => '',
'query_builder' => function (ActivityRepository $repo) use ($activity, $project) {
return $repo->builderForEntityType($activity, $project);
return $repo->getQueryBuilderForFormType(new ActivityFormTypeQuery($activity, $project));
},
])
;
@@ -241,7 +244,7 @@ class TimesheetEditForm extends AbstractType
$event->getForm()->add('activity', ActivityType::class, [
'placeholder' => '',
'query_builder' => function (ActivityRepository $repo) use ($data, $activity) {
return $repo->builderForEntityType($activity, $data['project']);
return $repo->getQueryBuilderForFormType(new ActivityFormTypeQuery($activity, $data['project']));
},
]);
}

View File

@@ -21,9 +21,9 @@ use App\Form\Type\VisibilityType;
use App\Repository\ActivityRepository;
use App\Repository\CustomerRepository;
use App\Repository\ProjectRepository;
use App\Repository\Query\ActivityQuery;
use App\Repository\Query\CustomerQuery;
use App\Repository\Query\ProjectQuery;
use App\Repository\Query\ActivityFormTypeQuery;
use App\Repository\Query\CustomerFormTypeQuery;
use App\Repository\Query\ProjectFormTypeQuery;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
@@ -39,7 +39,7 @@ abstract class AbstractToolbarForm extends AbstractType
{
/**
* Dirty hack to enable easy handling of GET form in controller and javascript.
*Cleans up the name of all form elents (and unfortunately of the form itself).
* Cleans up the name of all form elements (and unfortunately of the form itself).
*
* @return null|string
*/
@@ -59,22 +59,29 @@ abstract class AbstractToolbarForm extends AbstractType
]);
}
/**
* @param FormBuilderInterface $builder
*/
protected function addCustomerChoice(FormBuilderInterface $builder)
{
$builder->add('customer', CustomerType::class, [
'required' => false,
'project_enabled' => true,
'query_builder' => function (CustomerRepository $repo) {
$query = new CustomerQuery();
$query->setResultType(CustomerQuery::RESULT_TYPE_QUERYBUILDER);
$query->setOrderBy('name');
// just a fake field for having this field at the right position in the frontend
$builder->add('customer', HiddenType::class);
return $repo->findByQuery($query);
},
]);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$data = $event->getData();
$event->getForm()->add('customer', CustomerType::class, [
'required' => false,
'project_enabled' => true,
'query_builder' => function (CustomerRepository $repo) use ($data) {
$query = new CustomerFormTypeQuery();
if (isset($data['customer']) && !empty($data['customer'])) {
$query->setCustomer($data['customer']);
}
return $repo->getQueryBuilderForFormType($query);
},
]);
}
);
}
/**
@@ -126,32 +133,27 @@ abstract class AbstractToolbarForm extends AbstractType
*/
protected function addProjectChoice(FormBuilderInterface $builder)
{
$builder->add('project', ProjectType::class, [
'required' => false,
'activity_enabled' => true,
'choices' => [],
'disabled' => true,
]);
// just a fake field for having this field at the right position in the frontend
$builder->add('project', HiddenType::class);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$data = $event->getData();
if (!isset($data['customer']) || empty($data['customer'])) {
return;
}
$event->getForm()->add('project', ProjectType::class, [
'group_by' => null,
'required' => false,
'activity_enabled' => true,
'query_builder' => function (ProjectRepository $repo) use ($data) {
$query = new ProjectQuery();
$query->setCustomer($data['customer']);
$query->setResultType(ProjectQuery::RESULT_TYPE_QUERYBUILDER);
$query->setOrderBy('name');
$query = new ProjectFormTypeQuery();
return $repo->findByQuery($query);
if (isset($data['customer']) && !empty($data['customer'])) {
$query->setCustomer($data['customer']);
}
if (isset($data['project']) && !empty($data['project'])) {
$query->setProject($data['project']);
}
return $repo->getQueryBuilderForFormType($query);
},
]);
}
@@ -163,37 +165,26 @@ abstract class AbstractToolbarForm extends AbstractType
*/
protected function addActivityChoice(FormBuilderInterface $builder)
{
$builder->add('activity', ActivityType::class, [
'required' => false,
'query_builder' => function (ActivityRepository $repo) {
$query = new ActivityQuery();
$query->setResultType(ActivityQuery::RESULT_TYPE_QUERYBUILDER);
$query->setGlobalsOnly(true);
$query->setOrderGlobalsFirst(true);
$query->setOrderBy('name');
return $repo->findByQuery($query);
},
]);
// just a fake field for having this field at the right position in the frontend
$builder->add('activity', HiddenType::class);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$data = $event->getData();
if (!isset($data['project']) || empty($data['project'])) {
return;
}
$event->getForm()->add('activity', ActivityType::class, [
'required' => false,
'query_builder' => function (ActivityRepository $repo) use ($data) {
$query = new ActivityQuery();
$query->setResultType(ActivityQuery::RESULT_TYPE_QUERYBUILDER);
$query->setProject($data['project']);
$query->setOrderGlobalsFirst(true);
$query->setOrderBy('name');
$query = new ActivityFormTypeQuery();
return $repo->findByQuery($query);
if (isset($data['activity']) && !empty($data['activity'])) {
$query->setActivity($data['activity']);
}
if (isset($data['project']) && !empty($data['project'])) {
$query->setProject($data['project']);
}
return $repo->getQueryBuilderForFormType($query);
},
]);
}

View File

@@ -11,6 +11,7 @@ namespace App\Form\Type;
use App\Entity\Activity;
use App\Repository\ActivityRepository;
use App\Repository\Query\ActivityFormTypeQuery;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -78,7 +79,7 @@ class ActivityType extends AbstractType
'group_by' => [$this, 'groupBy'],
'choice_attr' => [$this, 'choiceAttr'],
'query_builder' => function (ActivityRepository $repo) {
return $repo->builderForEntityType();
return $repo->getQueryBuilderForFormType(new ActivityFormTypeQuery());
},
]);
}

View File

@@ -11,6 +11,7 @@ namespace App\Form\Type;
use App\Entity\Customer;
use App\Repository\CustomerRepository;
use App\Repository\Query\CustomerFormTypeQuery;
use App\Repository\Query\ProjectQuery;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
@@ -37,7 +38,7 @@ class CustomerType extends AbstractType
'class' => Customer::class,
'choice_label' => 'name',
'query_builder' => function (CustomerRepository $repo) {
return $repo->builderForEntityType(null);
return $repo->getQueryBuilderForFormType(new CustomerFormTypeQuery());
},
'project_enabled' => false,
'project_visibility' => ProjectQuery::SHOW_VISIBLE,
@@ -48,7 +49,8 @@ class CustomerType extends AbstractType
return [
'select' => 'project',
'route' => 'get_projects',
'route_params' => ['customer' => '-s-', 'orderBy' => 'name', 'visible' => $options['project_visibility']],
'route_params' => ['customer' => '-s-', 'visible' => $options['project_visibility']],
'empty_route_params' => ['visible' => $options['project_visibility']],
];
}

View File

@@ -12,6 +12,7 @@ namespace App\Form\Type;
use App\Entity\Project;
use App\Repository\ProjectRepository;
use App\Repository\Query\ActivityQuery;
use App\Repository\Query\ProjectFormTypeQuery;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\Options;
@@ -62,7 +63,7 @@ class ProjectType extends AbstractType
return $project->getCustomer()->getName();
},
'query_builder' => function (ProjectRepository $repo) {
return $repo->builderForEntityType(null);
return $repo->getQueryBuilderForFormType(new ProjectFormTypeQuery());
},
'activity_enabled' => false,
'activity_visibility' => ActivityQuery::SHOW_VISIBLE,
@@ -73,8 +74,8 @@ class ProjectType extends AbstractType
return [
'select' => 'activity',
'route' => 'get_activities',
'route_params' => ['project' => '-s-', 'orderBy' => 'name', 'visible' => $options['activity_visibility']],
'empty_route_params' => ['globals' => 'true', 'orderBy' => 'name', 'visible' => $options['activity_visibility']],
'route_params' => ['project' => '-s-', 'visible' => $options['activity_visibility']],
'empty_route_params' => ['globals' => 'true', 'visible' => $options['activity_visibility']],
];
}