fix closing search dropdown (#1142)
* using a different library for javascript selects, fixing the closing search dropdown * fix closing dropdown for daterangepicker * added missing search button for mobile on customer page * fix meta fields with same names than existing columns
This commit is contained in:
@@ -313,7 +313,7 @@ class Configuration implements ConfigurationInterface
|
||||
->setDeprecated('The node "%node%" at path "%path%" was removed, please delete it from your config.')
|
||||
->end()
|
||||
->scalarNode('select_type')
|
||||
->defaultNull()
|
||||
->defaultValue('selectpicker')
|
||||
->end()
|
||||
->scalarNode('auto_reload_datatable')
|
||||
->defaultFalse()
|
||||
|
||||
@@ -16,6 +16,7 @@ use App\Form\Type\PageSizeType;
|
||||
use App\Form\Type\ProjectType;
|
||||
use App\Form\Type\SearchTermType;
|
||||
use App\Form\Type\TagsInputType;
|
||||
use App\Form\Type\TagsSelectType;
|
||||
use App\Form\Type\UserRoleType;
|
||||
use App\Form\Type\UserType;
|
||||
use App\Form\Type\VisibilityType;
|
||||
@@ -53,23 +54,11 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the Javascript select-picker is allowed.
|
||||
* TODO can be removed... once all bugs are fixed.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function getSelectpickerConfig(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function addUserChoice(FormBuilderInterface $builder)
|
||||
{
|
||||
$builder->add('user', UserType::class, [
|
||||
'label' => 'label.user',
|
||||
'required' => false,
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -79,7 +68,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
'label' => 'label.user',
|
||||
'multiple' => true,
|
||||
'required' => false,
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -104,7 +92,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
|
||||
return $repo->getQueryBuilderForFormType($query);
|
||||
},
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
);
|
||||
@@ -116,7 +103,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
'required' => false,
|
||||
'placeholder' => null,
|
||||
'label' => $label,
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -124,7 +110,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
{
|
||||
$builder->add('pageSize', PageSizeType::class, [
|
||||
'required' => false,
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -132,7 +117,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
{
|
||||
$builder->add('role', UserRoleType::class, [
|
||||
'required' => false,
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -169,7 +153,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
|
||||
return $repo->getQueryBuilderForFormType($query);
|
||||
},
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
);
|
||||
@@ -198,7 +181,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
|
||||
return $repo->getQueryBuilderForFormType($query);
|
||||
},
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
);
|
||||
@@ -236,6 +218,14 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
]);
|
||||
}
|
||||
|
||||
protected function addTagSelectField(FormBuilderInterface $builder)
|
||||
{
|
||||
$builder->add('tags', TagsSelectType::class, [
|
||||
'required' => false,
|
||||
'multiple' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
protected function addSearchTermInputField(FormBuilderInterface $builder)
|
||||
{
|
||||
$builder->add('searchTerm', SearchTermType::class);
|
||||
@@ -252,7 +242,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
'entryState.running' => TimesheetQuery::STATE_RUNNING,
|
||||
'entryState.stopped' => TimesheetQuery::STATE_STOPPED
|
||||
],
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -267,7 +256,6 @@ abstract class AbstractToolbarForm extends AbstractType
|
||||
'entryState.exported' => TimesheetQuery::STATE_EXPORTED,
|
||||
'entryState.not_exported' => TimesheetQuery::STATE_NOT_EXPORTED
|
||||
],
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,6 @@ class ActivityToolbarForm extends AbstractToolbarForm
|
||||
'placeholder' => null,
|
||||
'required' => false,
|
||||
'label' => 'label.globalsOnly',
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
$this->addVisibilityChoice($builder);
|
||||
$this->addPageSizeChoice($builder);
|
||||
|
||||
@@ -21,11 +21,6 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
*/
|
||||
class ExportToolbarForm extends AbstractToolbarForm
|
||||
{
|
||||
protected function getSelectpickerConfig(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
||||
@@ -21,11 +21,6 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
*/
|
||||
class InvoiceToolbarForm extends AbstractToolbarForm
|
||||
{
|
||||
protected function getSelectpickerConfig(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
@@ -58,7 +53,6 @@ class InvoiceToolbarForm extends AbstractToolbarForm
|
||||
$builder->add('template', InvoiceTemplateType::class, [
|
||||
'required' => true,
|
||||
'placeholder' => null,
|
||||
'selectpicker' => $this->getSelectpickerConfig(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
55
src/Form/Type/TagsSelectType.php
Normal file
55
src/Form/Type/TagsSelectType.php
Normal file
@@ -0,0 +1,55 @@
|
||||
<?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\Type;
|
||||
|
||||
use App\Entity\Tag;
|
||||
use App\Repository\Query\TagFormTypeQuery;
|
||||
use App\Repository\TagRepository;
|
||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\OptionsResolver\Options;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
/**
|
||||
* Custom form field type to select a tag.
|
||||
*/
|
||||
class TagsSelectType extends AbstractType
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'class' => Tag::class,
|
||||
'label' => 'label.tag',
|
||||
'choice_label' => function (Tag $tag) {
|
||||
return $tag->getName();
|
||||
},
|
||||
]);
|
||||
|
||||
$resolver->setDefault('query_builder', function (Options $options) {
|
||||
return function (TagRepository $repo) use ($options) {
|
||||
$query = new TagFormTypeQuery();
|
||||
$query->setUser($options['user']);
|
||||
|
||||
return $repo->getQueryBuilderForFormType($query);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getParent()
|
||||
{
|
||||
return EntityType::class;
|
||||
}
|
||||
}
|
||||
32
src/Repository/Query/TagFormTypeQuery.php
Normal file
32
src/Repository/Query/TagFormTypeQuery.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?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\Repository\Query;
|
||||
|
||||
use App\Entity\User;
|
||||
|
||||
final class TagFormTypeQuery
|
||||
{
|
||||
/**
|
||||
* @var User
|
||||
*/
|
||||
private $user;
|
||||
|
||||
public function getUser(): ?User
|
||||
{
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
public function setUser(User $user): TagFormTypeQuery
|
||||
{
|
||||
$this->user = $user;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
@@ -10,9 +10,11 @@
|
||||
namespace App\Repository;
|
||||
|
||||
use App\Entity\Tag;
|
||||
use App\Repository\Query\TagFormTypeQuery;
|
||||
use App\Repository\Query\TagQuery;
|
||||
use Doctrine\ORM\EntityRepository;
|
||||
use Doctrine\ORM\ORMException;
|
||||
use Doctrine\ORM\QueryBuilder;
|
||||
use Pagerfanta\Adapter\DoctrineORMAdapter;
|
||||
use Pagerfanta\Pagerfanta;
|
||||
|
||||
@@ -148,4 +150,13 @@ class TagRepository extends EntityRepository
|
||||
|
||||
return $paginator;
|
||||
}
|
||||
|
||||
public function getQueryBuilderForFormType(TagFormTypeQuery $query): QueryBuilder
|
||||
{
|
||||
$qb = $this->createQueryBuilder('tag');
|
||||
|
||||
$qb->orderBy('tag.name', 'ASC');
|
||||
|
||||
return $qb;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user