mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-20 22:53:49 +00:00
add possibility to generate filter/order elements, with only search box
for now
This commit is contained in:
@@ -5,6 +5,7 @@ namespace Chill\ThirdPartyBundle\Controller;
|
||||
use Chill\MainBundle\CRUD\Controller\AbstractCRUDController;
|
||||
use Chill\MainBundle\CRUD\Controller\CRUDController;
|
||||
use Chill\MainBundle\Pagination\PaginatorInterface;
|
||||
use Chill\MainBundle\Templating\Listing\FilterOrderHelper;
|
||||
use Chill\ThirdPartyBundle\Repository\ThirdPartyACLAwareRepositoryInterface;
|
||||
use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
|
||||
@@ -56,15 +57,20 @@ final class ThirdPartyController extends CRUDController
|
||||
$this->thirdPartyACLAwareRepository = $thirdPartyACLAwareRepository;
|
||||
}
|
||||
|
||||
protected function countEntities(string $action, Request $request): int
|
||||
protected function countEntities(string $action, Request $request, ?FilterOrderHelper $filterOrder = null): int
|
||||
{
|
||||
return $this->thirdPartyACLAwareRepository->countThirdParties(ThirdPartyVoter::SHOW);
|
||||
if (NULL === $filterOrder){
|
||||
throw new \LogicException('filterOrder should not be null');
|
||||
}
|
||||
|
||||
return $this->thirdPartyACLAwareRepository->countThirdParties(ThirdPartyVoter::SHOW,
|
||||
$filterOrder->getQueryString());
|
||||
}
|
||||
|
||||
protected function getQueryResult(string $action, Request $request, int $totalItems, PaginatorInterface $paginator)
|
||||
protected function getQueryResult(string $action, Request $request, int $totalItems, PaginatorInterface $paginator, ?FilterOrderHelper $filterOrder = null)
|
||||
{
|
||||
return $this->thirdPartyACLAwareRepository
|
||||
->listThirdParties(ThirdPartyVoter::class, ['name' => 'ASC'], $paginator->getItemsPerPage(),
|
||||
->listThirdParties(ThirdPartyVoter::SHOW, $filterOrder->getQueryString(), ['name' => 'ASC'], $paginator->getItemsPerPage(),
|
||||
$paginator->getCurrentPageFirstItemNumber());
|
||||
}
|
||||
|
||||
@@ -78,4 +84,12 @@ final class ThirdPartyController extends CRUDController
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected function buildFilterOrderHelper(string $action, Request $request): ?FilterOrderHelper
|
||||
{
|
||||
return $this->getFilterOrderHelperFactory()
|
||||
->create(self::class)
|
||||
->addSearchBox(['name', 'company_name', 'acronym'])
|
||||
->build();
|
||||
}
|
||||
}
|
||||
|
@@ -22,11 +22,12 @@ final class ThirdPartyACLAwareRepository implements ThirdPartyACLAwareRepository
|
||||
|
||||
public function listThirdParties(
|
||||
string $role,
|
||||
?string $filterString,
|
||||
?array $orderBy = [],
|
||||
?int $limit = null,
|
||||
?int $offset = null
|
||||
): array {
|
||||
$qb = $this->buildQuery($role);
|
||||
$qb = $this->buildQuery($filterString);
|
||||
|
||||
foreach ($orderBy as $sort => $direction) {
|
||||
$qb->addOrderBy('tp.'.$sort, $direction);
|
||||
@@ -39,15 +40,24 @@ final class ThirdPartyACLAwareRepository implements ThirdPartyACLAwareRepository
|
||||
}
|
||||
|
||||
public function countThirdParties(
|
||||
string $role
|
||||
string $role,
|
||||
?string $filterString
|
||||
): int {
|
||||
$qb = $this->buildQuery($role);
|
||||
$qb = $this->buildQuery($filterString);
|
||||
$qb->select('count(tp)');
|
||||
|
||||
return $qb->getQuery()->getSingleScalarResult();
|
||||
}
|
||||
|
||||
public function buildQuery(): QueryBuilder {
|
||||
return $this->thirdPartyRepository->createQueryBuilder('tp');
|
||||
public function buildQuery(?string $filterString = null): QueryBuilder
|
||||
{
|
||||
$qb = $this->thirdPartyRepository->createQueryBuilder('tp');
|
||||
|
||||
if (NULL !== $filterString) {
|
||||
$qb->andWhere($qb->expr()->like('tp.canonicalized', 'LOWER(UNACCENT(:filterString))'))
|
||||
->setParameter('filterString', '%'.$filterString.'%');
|
||||
}
|
||||
|
||||
return $qb;
|
||||
}
|
||||
}
|
||||
|
@@ -6,7 +6,7 @@ use Chill\ThirdPartyBundle\Entity\ThirdParty;
|
||||
|
||||
interface ThirdPartyACLAwareRepositoryInterface
|
||||
{
|
||||
public function countThirdParties(string $role): int;
|
||||
public function countThirdParties(string $role, ?string $filterString): int;
|
||||
|
||||
/**
|
||||
* @param string $role
|
||||
@@ -17,8 +17,9 @@ interface ThirdPartyACLAwareRepositoryInterface
|
||||
*/
|
||||
public function listThirdParties(
|
||||
string $role,
|
||||
?string $filterString,
|
||||
?array $orderBy = [],
|
||||
int $limit = null,
|
||||
int $offset = null
|
||||
?int $limit = 0,
|
||||
?int $offset = 50
|
||||
): array;
|
||||
}
|
||||
|
@@ -12,21 +12,6 @@
|
||||
|
||||
{% block table_entities %}
|
||||
<div class="thirdparty-list my-5">
|
||||
{#
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-10 col-xxl">
|
||||
|
||||
{% if third_parties|length == 0 %}
|
||||
<p class="chill-no-data-statement">{{ 'No third parties'|trans }}</p>
|
||||
{% else %}
|
||||
|
||||
<nav class="filter-actions border border-secondary my-4 p-3">
|
||||
<i>outils de filtrage</i>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
#}
|
||||
<div class="row justify-content-center">
|
||||
<div>
|
||||
|
||||
@@ -34,49 +19,11 @@
|
||||
<span>{{ paginator.totalItems }}</span> {{ 'third parties'|trans }}
|
||||
</label>
|
||||
|
||||
<table class="table table-bordered border-dark table-striped align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="chill-pink" style="width: 35px;"></th>
|
||||
<th class="chill-pink">{{ 'Name'|trans }}
|
||||
<i class="fa fa-fw fa-sort"></i>
|
||||
</th>
|
||||
<th class="chill-pink">{{ 'Category'|trans }}
|
||||
<i class="fa fa-fw fa-sort"></i>
|
||||
</th>
|
||||
<th class="chill-pink">{{ 'Address'|trans }}
|
||||
<i class="fa fa-fw fa-sort"></i>
|
||||
</th>
|
||||
<th class="chill-pink">{{ 'thirdparty.UpdatedAt.short'|trans }}
|
||||
<i class="fa fa-fw fa-sort"></i>
|
||||
</th>
|
||||
<th class="chill-pink"></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for tp in third_parties %}
|
||||
<tr>
|
||||
<th>{{ (tp.active ? '<i class="fa fa-check chill-green">' : '<i class="fa fa-times chill-red">')|raw }}</th>
|
||||
<td>
|
||||
{{ tp.name }}
|
||||
{% if tp.isChild %}<span class="badge bg-info">{{ 'Contact'|trans }}</span>{% endif %}
|
||||
</td>
|
||||
{% set types = [] %}
|
||||
{% for t in tp.types %}
|
||||
{% set types = types|merge( [ ('chill_3party.key_label.'~t)|trans ] ) %}
|
||||
{% endfor %}
|
||||
<td>{{ types|join(', ') }}</td>
|
||||
<td>
|
||||
{{ tp.address|chill_entity_render_box({'multiline': false, 'with_valid_from': false}) }}
|
||||
</td>
|
||||
<td>
|
||||
{% if tp.updatedAt != null %}
|
||||
{{ tp.updatedAt|format_date('short') }}
|
||||
{% else %}
|
||||
{{ tp.createdAt|format_date('short') }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<div class="flex-table">
|
||||
{% for tp in third_parties %}
|
||||
<div class="item-bloc">
|
||||
{{ tp|chill_entity_render_box({'render': 'bloc', 'addLink': false}) }}
|
||||
<div class="item-row separator">
|
||||
<ul class="record_actions">
|
||||
{% if is_granted('CHILL_3PARTY_3PARTY_UPDATE', tp) %}
|
||||
<li>
|
||||
@@ -91,11 +38,11 @@
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user