diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/App.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/App.vue
new file mode 100644
index 000000000..39a7c023a
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/App.vue
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/api.js b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/api.js
new file mode 100644
index 000000000..afcece4f4
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/api.js
@@ -0,0 +1,41 @@
+import { fetchResults } from 'ChillMainAssets/lib/api/apiMethods';
+
+const getSocialActions = () => fetchResults(
+ '/api/1.0/person/social/social-action.json', {
+ item_per_page: 200
+ }
+);
+
+const getGoalByAction = (id) => {
+ let url = `/api/1.0/person/social-work/goal/by-social-action/${id}.json`;
+ return fetch(url)
+ .then(response => {
+ if (response.ok) { return response.json(); }
+ throw Error('Error with request resource response');
+ });
+};
+
+const getResultByAction = (id) => {
+ let url = `/api/1.0/person/social-work/result/by-social-action/${id}.json`;
+ return fetch(url)
+ .then(response => {
+ if (response.ok) { return response.json(); }
+ throw Error('Error with request resource response');
+ });
+};
+
+const getResultByGoal = (id) => {
+ let url = `/api/1.0/person/social-work/result/by-goal/${id}.json`;
+ return fetch(url)
+ .then(response => {
+ if (response.ok) { return response.json(); }
+ throw Error('Error with request resource response');
+ });
+};
+
+export {
+ getSocialActions,
+ getGoalByAction,
+ getResultByAction,
+ getResultByGoal,
+}
\ No newline at end of file
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/index.js b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/index.js
new file mode 100644
index 000000000..d838fb0be
--- /dev/null
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/FormActionGoalResult/index.js
@@ -0,0 +1,13 @@
+import { createApp } from "vue";
+import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n';
+import App from './App.vue';
+
+const i18n = _createI18n({});
+
+const app = createApp({
+ template: ``,
+})
+.use(i18n)
+.component('app', App)
+.mount('#export_export')
+;
\ No newline at end of file
diff --git a/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig
index 7f7efae9a..c6adb241d 100644
--- a/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig
+++ b/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig
@@ -22,6 +22,9 @@
{% block js %}
{{ encore_entry_script_tags('page_export') }}
+ {% if export_alias == 'count_social_work_actions' %}
+ {{ encore_entry_script_tags('vue_form_action_goal_result') }}
+ {% endif %}
{% endblock js %}
{% block content %}
diff --git a/src/Bundle/ChillMainBundle/chill.webpack.config.js b/src/Bundle/ChillMainBundle/chill.webpack.config.js
index 628f04ba5..c4c445d31 100644
--- a/src/Bundle/ChillMainBundle/chill.webpack.config.js
+++ b/src/Bundle/ChillMainBundle/chill.webpack.config.js
@@ -74,4 +74,5 @@ module.exports = function(encore, entries)
// Vue entrypoints
encore.addEntry('vue_address', __dirname + '/Resources/public/vuejs/Address/index.js');
encore.addEntry('vue_onthefly', __dirname + '/Resources/public/vuejs/OnTheFly/index.js');
+ encore.addEntry('vue_form_action_goal_result', __dirname + '/Resources/public/vuejs/FormActionGoalResult/index.js');
};
diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php
index fc41459ca..c2ffd74c6 100644
--- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php
+++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/SocialWorkTypeFilter.php
@@ -13,105 +13,114 @@ namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
-use Chill\PersonBundle\Entity\SocialWork\Goal;
use Chill\PersonBundle\Entity\SocialWork\SocialAction;
+use Chill\PersonBundle\Entity\SocialWork\Goal;
+use Chill\PersonBundle\Entity\SocialWork\Result;
use Chill\PersonBundle\Export\Declarations;
-use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository;
-use Chill\PersonBundle\Templating\Entity\SocialActionRender;
+use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\Expr\Andx;
use Doctrine\ORM\QueryBuilder;
-use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
+use Symfony\Component\Form\CallbackTransformer;
+use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
-use Symfony\Component\Form\FormEvent;
-use Symfony\Component\Form\FormEvents;
-use Symfony\Component\Form\FormInterface;
+use Chill\PersonBundle\Templating\Entity\SocialActionRender;
class SocialWorkTypeFilter implements FilterInterface
{
private SocialActionRender $socialActionRender;
- private SocialActionRepository $socialActionRepository;
-
private TranslatableStringHelper $translatableStringHelper;
- public function __construct(
+ private EntityManagerInterface $em;
+
+ public function __construct
+ (
SocialActionRender $socialActionRender,
TranslatableStringHelper $translatableStringHelper,
- SocialActionRepository $socialActionRepository
- ) {
+ EntityManagerInterface $em
+ )
+ {
$this->socialActionRender = $socialActionRender;
$this->translatableStringHelper = $translatableStringHelper;
- $this->socialActionRepository = $socialActionRepository;
- }
-
- public function addRole(): ?string
- {
- return null;
- }
-
- public function alterQuery(QueryBuilder $qb, $data)
- {
- $where = $qb->getDQLPart('where');
- $clause = $qb->expr()->in('r', ':referrers');
-
- if ($where instanceof Andx) {
- $where->add($clause);
- } else {
- $where = $qb->expr()->andX($clause);
- }
-
- $qb->add('where', $where);
- $qb->setParameter('referrers', $data['referrers']);
- }
-
- public function applyOn(): string
- {
- return Declarations::SOCIAL_WORK_ACTION_TYPE;
+ $this->em = $em;
}
public function buildForm(FormBuilderInterface $builder)
{
- $socialActions = $this->socialActionRepository->findAll();
-
- $builder->add('actionType', ChoiceType::class, [
- 'choices' => $socialActions,
- 'choice_label' => function (SocialAction $sa) {
- return $this->socialActionRender->renderString($sa, []);
- },
- 'multiple' => true,
- 'expanded' => true,
- ]);
-
- /*
- $refreshGoals = function (FormInterface $form, SocialAction $actionType = null) {
-
- $goals = null === $actionType ? [] : $actionType->getGoals();
-
- $form->add('goal', ChoiceType::class, [
- 'placeholder' => '',
- 'choices' => $goals,
- 'choice_label' => function (Goal $g) {
- return $this->translatableStringHelper->localize($g->getTitle());
+ $builder
+ ->add('actionType', HiddenType::class)
+ ->get('actionType')
+ ->addModelTransformer(new CallbackTransformer(
+ static function (?iterable $actionsAsIterable): string {
+ if (null === $actionsAsIterable) { return ''; }
+ $actionIds = [];
+ foreach ($actionsAsIterable as $value) {
+ $actionIds[] = $value->getId();
+ }
+ return implode(',', $actionIds);
},
- ]);
- };
+ function (?string $actionsAsString): array {
+ if (null === $actionsAsString) { return []; }
+ return array_map(
+ fn (string $id): ?SocialAction
+ => $this->socialActionRepository->findOneBy(['id' => (int) $id]),
+ explode(',', $actionsAsString)
+ );
+ }
+ ))
+ ;
- $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($refreshGoals) {
- $data = $event->getData();
- dump($data);
+ $builder
+ ->add('goal', HiddenType::class)
+ ->get('goal')
+ ->addModelTransformer(new CallbackTransformer(
+ static function (?iterable $goalsAsIterable): string {
+ if (null === $goalsAsIterable) { return ''; }
+ $goalIds = [];
+ foreach ($goalsAsIterable as $value) {
+ $goalIds[] = $value->getId();
+ }
+ return implode(',', $goalIds);
+ },
+ function (?string $goalsAsString): array {
+ if (null === $goalsAsString) { return []; }
+ return array_map(
+ fn (string $id): ?Goal
+ => $this->socialActionRepository->findOneBy(['id' => (int) $id]),
+ explode(',', $goalsAsString)
+ );
+ }
+ ))
+ ;
- $refreshGoals($event->getForm(), $data);
- });
+ $builder
+ ->add('result', HiddenType::class)
+ ->get('result')
+ ->addModelTransformer(new CallbackTransformer(
+ static function (?iterable $resultsAsIterable): string {
+ if (null === $resultsAsIterable) { return ''; }
+ $resultIds = [];
+ foreach ($resultsAsIterable as $value) {
+ $resultIds[] = $value->getId();
+ }
+ return implode(',', $resultIds);
+ },
+ function (?string $resultsAsString): array {
+ if (null === $resultsAsString) { return []; }
+ return array_map(
+ fn (string $id): ?Result
+ => $this->socialActionRepository->findOneBy(['id' => (int) $id]),
+ explode(',', $resultsAsString)
+ );
+ }
+ ))
+ ;
- $builder->get('actionType')->addEventListener(
- FormEvents::POST_SUBMIT,
- function (FormEvent $event) use ($refreshGoals) {
- $actionType = $event->getForm()->getData();
- dump($actionType);
- $refreshGoals($event->getForm()->getParent(), $actionType);
- }
- );
- */
+ }
+
+ public function getTitle(): string
+ {
+ return 'Filter by type of action, objectives and results';
}
public function describeAction($data, $format = 'string'): array
@@ -123,22 +132,52 @@ class SocialWorkTypeFilter implements FilterInterface
foreach ($data['actionType'] as $at) {
$actionTypes[] = $at->getTitle();
}
-
foreach ($data['objectives'] as $o) {
$objectives[] = $o->getTitle();
}
-
foreach ($data['results'] as $r) {
$results[] = $r->getTitle();
}
return ['Filtered by referrers: only %actionTypes%', [
- '%actionTypes%' => implode(', ou ', $actionTypes),
+ '%actionTypes%' => implode(', ou ', $actionTypes)
]];
}
- public function getTitle(): string
+ public function addRole(): ?string
{
- return 'Filter by type of action, objectives and results';
+ return null;
+ }
+
+ public function alterQuery(QueryBuilder $qb, $data)
+ {
+ $where = $qb->getDQLPart('where');
+ $clause = $qb->expr()->eq('acpw.socialAction',':actionType');
+
+ /*
+ if (!empty($data['goal'])) {
+ $clause
+ $qb->expr()->in('acpw.goals', ':goals');
+ }
+ $qb->expr()->in('acpw.results', ':results');
+ */
+
+ if ($where instanceof Andx) {
+ $where->add($clause);
+ } else {
+ $where = $qb->expr()->andX($clause);
+ }
+
+ $qb->add('where', $where);
+ $qb->setParameters([
+ 'actionType' => $data['actionType'],
+ 'goal' => $data['goal'],
+ 'result' => $data['result'],
+ ]);
+ }
+
+ public function applyOn(): string
+ {
+ return Declarations::SOCIAL_WORK_ACTION_TYPE;
}
}