*/
class PickCenterType extends AbstractType
{
@@ -49,6 +51,12 @@ class PickCenterType extends AbstractType
*/
protected $exportManager;
+ /**
+ *
+ * @var GroupingCenterInterface[]
+ */
+ protected $groupingCenters = [];
+
const CENTERS_IDENTIFIERS = 'c';
/**
@@ -87,10 +95,87 @@ class PickCenterType extends AbstractType
return $qb->where($qb->expr()->in('c.id', $ids));
},
'multiple' => true,
- 'expanded' => false,
+ 'expanded' => true,
'choice_label' => function(Center $c) { return $c->getName(); },
- 'data' => $centers
+ 'data' => count($this->groupingCenters) > 0 ? null : $centers
));
+
+ if (count($this->groupingCenters) > 0) {
+ $groupingBuilder = $builder->create('g', null, [
+ 'compound' => true
+ ]);
+
+ foreach ($this->groupingCenters as $key => $gc) {
+ $choices = $this->buildChoices($centers, $gc);
+
+ if (count($choices) > 0) {
+ $groupingBuilder->add($key, ChoiceType::class, [
+ 'choices' => $choices,
+ 'multiple' => true,
+ 'expanded' => true,
+ 'label' => $gc->getName()
+ ]);
+ }
+ }
+
+ if ($groupingBuilder->count() > 0) {
+ $builder->add($groupingBuilder);
+ }
+ }
+ $builder->addModelTransformer(new CallbackTransformer(
+ function($data) use ($centers) { return $this->transform($data, $centers); },
+ function($data) use ($centers) { return $this->reverseTransform($data, $centers); }
+ ));
+ }
+
+ public function addGroupingCenter(GroupingCenterInterface $grouping)
+ {
+ $this->groupingCenters[md5($grouping->getName())] = $grouping;
+ }
+
+ protected function buildChoices($reachablesCenters, GroupingCenterInterface $gc)
+ {
+ $result = [];
+
+ foreach ($gc->getGroups() as $group) {
+ foreach ($gc->getCentersForGroup($group) as $center) {
+ if (\in_array($center, $reachablesCenters)) {
+ $result[$group] = $group;
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ protected function transform($data, $centers)
+ {
+ return $data;
+ }
+
+ protected function reverseTransform($data, $centers)
+ {
+ $picked = $data[self::CENTERS_IDENTIFIERS]
+ instanceof \Doctrine\Common\Collections\Collection ?
+ $data[self::CENTERS_IDENTIFIERS]->toArray()
+ :
+ $data[self::CENTERS_IDENTIFIERS];
+
+ if (\array_key_exists('g', $data)) {
+ foreach($data['g'] as $gcid => $group) {
+ $picked =
+ \array_merge(
+ \array_intersect(
+ $this->groupingCenters[$gcid] ->getCentersForGroup($group),
+ $centers
+ ),
+ $picked
+ )
+ ;
+ }
+ }
+
+ return \array_unique($picked);
}
}
diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml
index d810fcc41..93cab97d0 100644
--- a/Resources/translations/messages.fr.yml
+++ b/Resources/translations/messages.fr.yml
@@ -152,6 +152,7 @@ Pick centers: Choisir les centres
The export will contains only data from the picked centers.: L'export ne contiendra que les données des centres choisis.
This will eventually restrict your possibilities in filtering the data.: Les possibilités de filtrages seront adaptées aux droits de consultation pour les centres choisis.
Go to export options: Vers la préparation de l'export
+Pick aggregated centers: Regroupement de centres
# export creation step 'export' : choose aggregators, filtering and formatter
Formatter: Mise en forme
Choose the formatter: Choisissez le format d'export voulu.
diff --git a/Resources/views/Export/new_centers_step.html.twig b/Resources/views/Export/new_centers_step.html.twig
index 454abf85b..2afc437f2 100644
--- a/Resources/views/Export/new_centers_step.html.twig
+++ b/Resources/views/Export/new_centers_step.html.twig
@@ -35,6 +35,15 @@
{{ form_widget(form.centers.c) }}
+ {% if form.centers.children.g is defined %}
+
+ {{ 'Pick aggregated centers'|trans }}
+
+ {% for f in form.centers.children.g.children %}
+ {{ form_row(f) }}
+ {% endfor %}
+ {% endif %}
+
{{ form_widget(form.submit, { 'attr' : { 'class' : 'sc-button btn-action bt-create' }, 'label' : 'Go to export options' } ) }}
{{ form_end(form) }}