diff --git a/CHANGELOG.md b/CHANGELOG.md
index 142d1f0be..09d974cb2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,7 +11,16 @@ and this project adheres to
## Unreleased
+* [person] add a returnPath when clicking on some Person or ThirdParty badge (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/427)
+* [person] accompanying course work: fix on-the-fly update of thirdParty
+* [on-the-fly] close modal only after validation
+* [person] correct thirdparty PATCH url + add email and altnames in AddPerson and serializer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/433)
* change order for accompanying course work list
+* [person]: style fix in parcours listing per person. (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/432)
+* ajoute un ordre dans les localisation (api)
+* [pick entity]: fix translations in modal (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/419)
+* [homepage_widget]: fix translation on emergency badge (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/440)
+* [person]: create person and household added to button dropdown (https://gitlab.com/champs-libres/departement-de-la-vendee/accent-suivi-developpement/-/issues/454)
## Test releases
diff --git a/phpstan-deprecations.neon b/phpstan-deprecations.neon
index bc372e96b..b41a746b9 100644
--- a/phpstan-deprecations.neon
+++ b/phpstan-deprecations.neon
@@ -927,15 +927,6 @@ parameters:
count: 1
path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php
- -
- message:
- """
- #^Parameter \\$trans of method Chill\\\\PersonBundle\\\\Controller\\\\AccompanyingCourseWorkController\\:\\:__construct\\(\\) has typehint with deprecated interface Symfony\\\\Component\\\\Translation\\\\TranslatorInterface\\:
- since Symfony 4\\.2, use Symfony\\\\Contracts\\\\Translation\\\\TranslatorInterface instead$#
- """
- count: 1
- path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseWorkController.php
-
-
message:
"""
diff --git a/src/Bundle/ChillMainBundle/Controller/LocationApiController.php b/src/Bundle/ChillMainBundle/Controller/LocationApiController.php
index 250d92980..2cf5caaf9 100644
--- a/src/Bundle/ChillMainBundle/Controller/LocationApiController.php
+++ b/src/Bundle/ChillMainBundle/Controller/LocationApiController.php
@@ -12,6 +12,8 @@ declare(strict_types=1);
namespace Chill\MainBundle\Controller;
use Chill\MainBundle\CRUD\Controller\ApiController;
+use Chill\MainBundle\Pagination\PaginatorInterface;
+use Doctrine\ORM\QueryBuilder;
use Symfony\Component\HttpFoundation\Request;
/**
@@ -19,7 +21,7 @@ use Symfony\Component\HttpFoundation\Request;
*/
class LocationApiController extends ApiController
{
- public function customizeQuery(string $action, Request $request, $query): void
+ protected function customizeQuery(string $action, Request $request, $query): void
{
$query
->leftJoin('e.locationType', 'lt')
@@ -31,4 +33,14 @@ class LocationApiController extends ApiController
)
);
}
+
+ /**
+ * @param QueryBuilder $query
+ * @param mixed $_format
+ */
+ protected function orderQuery(string $action, $query, Request $request, PaginatorInterface $paginator, $_format)
+ {
+ return $query
+ ->addOrderBy('e.name', 'ASC');
+ }
}
diff --git a/src/Bundle/ChillMainBundle/Controller/WorkflowController.php b/src/Bundle/ChillMainBundle/Controller/WorkflowController.php
index 247cdf552..876e095a8 100644
--- a/src/Bundle/ChillMainBundle/Controller/WorkflowController.php
+++ b/src/Bundle/ChillMainBundle/Controller/WorkflowController.php
@@ -167,6 +167,7 @@ class WorkflowController extends AbstractController
$handler = $this->entityWorkflowManager->getHandler($entityWorkflow);
$workflow = $this->registry->get($entityWorkflow, $entityWorkflow->getWorkflowName());
+ $errors = [];
if (count($workflow->getEnabledTransitions($entityWorkflow)) > 0) {
// possible transition
@@ -245,7 +246,7 @@ class WorkflowController extends AbstractController
'handler_template_data' => $handler->getTemplateData($entityWorkflow),
'transition_form' => isset($transitionForm) ? $transitionForm->createView() : null,
'entity_workflow' => $entityWorkflow,
- 'transition_form_errors' => $errors ?? [],
+ 'transition_form_errors' => $errors,
//'comment_form' => $commentForm->createView(),
]
);
diff --git a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php
index a132706d7..b9773040a 100644
--- a/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php
+++ b/src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php
@@ -135,6 +135,7 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
if (!$this->steps->contains($step)) {
$this->steps[] = $step;
$step->setEntityWorkflow($this);
+ $this->stepsChainedCache = null;
}
return $this;
@@ -332,32 +333,26 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
public function isFinal(): bool
{
- $steps = $this->getStepsChained();
-
- if (1 === count($steps)) {
- // the initial step cannot be finalized
- return false;
+ foreach ($this->getStepsChained() as $step) {
+ if ($step->isFinal()) {
+ return true;
+ }
}
- /** @var EntityWorkflowStep $last */
- $last = end($steps);
-
- return $last->isFinal();
+ return false;
}
public function isFreeze(): bool
{
$steps = $this->getStepsChained();
- if (1 === count($steps)) {
- // the initial step cannot be finalized
- return false;
+ foreach ($this->getStepsChained() as $step) {
+ if ($step->isFreezeAfter()) {
+ return true;
+ }
}
- /** @var EntityWorkflowStep $last */
- $last = end($steps);
-
- return $last->getPrevious()->isFreezeAfter();
+ return false;
}
public function isUserSubscribedToFinal(User $user): bool
@@ -434,7 +429,7 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
$newStep->setCurrentStep($step);
// copy the freeze
- if ($this->getCurrentStep()->isFreezeAfter()) {
+ if ($this->isFreeze()) {
$newStep->setFreezeAfter(true);
}
diff --git a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php
index ad1b21c79..e4f0aa45d 100644
--- a/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php
+++ b/src/Bundle/ChillMainBundle/Repository/Workflow/EntityWorkflowStepRepository.php
@@ -56,7 +56,7 @@ class EntityWorkflowStepRepository implements ObjectRepository
public function getClassName()
{
- return EntityWorkflow::class;
+ return EntityWorkflowStep::class;
}
private function buildQueryByUser(User $user): QueryBuilder
diff --git a/src/Bundle/ChillMainBundle/Resources/public/module/pick-entity/index.js b/src/Bundle/ChillMainBundle/Resources/public/module/pick-entity/index.js
index 4cc917502..f184bf100 100644
--- a/src/Bundle/ChillMainBundle/Resources/public/module/pick-entity/index.js
+++ b/src/Bundle/ChillMainBundle/Resources/public/module/pick-entity/index.js
@@ -17,7 +17,12 @@ function loadDynamicPicker(element) {
isMultiple = parseInt(el.dataset.multiple) === 1,
uniqId = el.dataset.uniqid,
input = element.querySelector('[data-input-uniqid="'+ el.dataset.uniqid +'"]'),
- picked = (isMultiple) ? (JSON.parse(input.value)) : ((input.value === '[]') ? (null) : ([JSON.parse(input.value)]));
+ picked = isMultiple ?
+ JSON.parse(input.value) : (
+ (input.value === '[]' || input.value === '') ?
+ null : [ JSON.parse(input.value) ]
+ )
+ ;
if (!isMultiple) {
if (input.value === '[]'){
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/MyAccompanyingCourses.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/MyAccompanyingCourses.vue
index 4292c3af5..1c3b5e152 100644
--- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/MyAccompanyingCourses.vue
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/MyAccompanyingCourses.vue
@@ -32,7 +32,7 @@
- {{ $t('emergency') }}
+ {{ $t('emergency') }}
{{ $t('confidential') }}
@@ -80,5 +80,7 @@ export default {
\ No newline at end of file
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/js/i18n.js b/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/js/i18n.js
index 0b3d6a428..29f9dac62 100644
--- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/js/i18n.js
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/HomepageWidget/js/i18n.js
@@ -50,7 +50,9 @@ const appMessages = {
assignated_evaluations: "{n} évaluation assignée | {n} évaluations assignées",
alert_tasks: "{n} tâche en rappel | {n} tâches en rappel",
warning_tasks: "{n} tâche à échéance | {n} tâches à échéance",
- }
+ },
+ emergency: "Urgent",
+ confidential: "Confidentiel",
}
};
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/OnTheFly/components/OnTheFly.vue b/src/Bundle/ChillMainBundle/Resources/public/vuejs/OnTheFly/components/OnTheFly.vue
index 116ed86c1..7b06776ba 100644
--- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/OnTheFly/components/OnTheFly.vue
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/OnTheFly/components/OnTheFly.vue
@@ -90,7 +90,7 @@ export default {
OnTheFlyThirdparty,
OnTheFlyCreate
},
- props: ['type', 'id', 'action', 'buttonText', 'displayBadge', 'isDead', 'parent', 'canCloseModal'],
+ props: ['type', 'id', 'action', 'buttonText', 'displayBadge', 'isDead', 'parent'],
emits: ['saveFormOnTheFly'],
data() {
return {
@@ -160,17 +160,10 @@ export default {
},
badgeType() {
return 'entity-' + this.type + ' badge-' + this.type;
- }
- },
- watch: {
- canCloseModal: {
- handler: function(val, oldVal) {
- if (val) {
- this.closeModal();
- }
- },
- deep: true
- }
+ },
+ getReturnPath() {
+ return `?returnPath=${window.location.pathname}${window.location.search}${window.location.hash}`;
+ },
},
methods: {
closeModal() {
@@ -217,9 +210,9 @@ export default {
buildLocation(id, type) {
if (type === 'person') {
// TODO i18n
- return `/fr/person/${id}/general`;
+ return encodeURI(`/fr/person/${id}/general${this.getReturnPath}`);
} else if (type === 'thirdparty') {
- return `/fr/3party/3party/${id}/view`;
+ return encodeURI(`/fr/3party/3party/${id}/view${this.getReturnPath}`);
}
}
}
diff --git a/src/Bundle/ChillMainBundle/Resources/public/vuejs/PickEntity/i18n.js b/src/Bundle/ChillMainBundle/Resources/public/vuejs/PickEntity/i18n.js
index 2c4432218..f3ae3a928 100644
--- a/src/Bundle/ChillMainBundle/Resources/public/vuejs/PickEntity/i18n.js
+++ b/src/Bundle/ChillMainBundle/Resources/public/vuejs/PickEntity/i18n.js
@@ -1,4 +1,7 @@
import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n';
+import { thirdpartyMessages } from 'ChillThirdPartyAssets/vuejs/_js/i18n';
+import { addressMessages } from 'ChillMainAssets/vuejs/Address/i18n';
+import { ontheflyMessages } from 'ChillMainAssets/vuejs/OnTheFly/i18n';
const appMessages = {
fr: {
@@ -12,6 +15,6 @@ const appMessages = {
}
}
-Object.assign(appMessages.fr, personMessages.fr);
+Object.assign(appMessages.fr, personMessages.fr, thirdpartyMessages.fr, addressMessages.fr, ontheflyMessages.fr );
export { appMessages };
diff --git a/src/Bundle/ChillMainBundle/Tests/Entity/Workflow/EntityWorkflowTest.php b/src/Bundle/ChillMainBundle/Tests/Entity/Workflow/EntityWorkflowTest.php
index c89101c5b..91783a77b 100644
--- a/src/Bundle/ChillMainBundle/Tests/Entity/Workflow/EntityWorkflowTest.php
+++ b/src/Bundle/ChillMainBundle/Tests/Entity/Workflow/EntityWorkflowTest.php
@@ -24,30 +24,30 @@ final class EntityWorkflowTest extends TestCase
{
$entityWorkflow = new EntityWorkflow();
- $entityWorkflow->getCurrentStep()->setFinalizeAfter(true);
$entityWorkflow->setStep('final');
+ $entityWorkflow->getCurrentStep()->setIsFinal(true);
- $this->assertTrue($entityWorkflow->isFinalize());
+ $this->assertTrue($entityWorkflow->isFinal());
}
public function testIsFinalizeWith4Steps()
{
$entityWorkflow = new EntityWorkflow();
- $this->assertFalse($entityWorkflow->isFinalize());
+ $this->assertFalse($entityWorkflow->isFinal());
$entityWorkflow->setStep('two');
- $this->assertFalse($entityWorkflow->isFinalize());
+ $this->assertFalse($entityWorkflow->isFinal());
$entityWorkflow->setStep('previous_final');
- $this->assertFalse($entityWorkflow->isFinalize());
+ $this->assertFalse($entityWorkflow->isFinal());
- $entityWorkflow->getCurrentStep()->setFinalizeAfter(true);
+ $entityWorkflow->getCurrentStep()->setIsFinal(true);
$entityWorkflow->setStep('final');
- $this->assertTrue($entityWorkflow->isFinalize());
+ $this->assertTrue($entityWorkflow->isFinal());
}
public function testIsFreeze()
@@ -64,11 +64,8 @@ final class EntityWorkflowTest extends TestCase
$this->assertFalse($entityWorkflow->isFreeze());
- $entityWorkflow->getCurrentStep()->setFreezeAfter(true);
-
- $this->assertFalse($entityWorkflow->isFreeze());
-
$entityWorkflow->setStep('freezed');
+ $entityWorkflow->getCurrentStep()->setFreezeAfter(true);
$this->assertTrue($entityWorkflow->isFreeze());
diff --git a/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php b/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php
index 41ffd63c2..aaac6b216 100644
--- a/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php
+++ b/src/Bundle/ChillMainBundle/Workflow/Counter/WorkflowByUserCounter.php
@@ -32,20 +32,20 @@ final class WorkflowByUserCounter implements NotificationCounterInterface, Event
$this->cacheItemPool = $cacheItemPool;
}
- public function addNotification(UserInterface $user): int
+ public function addNotification(UserInterface $u): int
{
- if (!$user instanceof User) {
+ if (!$u instanceof User) {
return 0;
}
- $key = self::generateCacheKeyWorkflowByUser($user);
+ $key = self::generateCacheKeyWorkflowByUser($u);
$item = $this->cacheItemPool->getItem($key);
if ($item->isHit()) {
return $item->get();
}
- $nb = $this->getCountUnreadByUser($user);
+ $nb = $this->getCountUnreadByUser($u);
$item->set($nb)
->expiresAfter(60 * 15);
diff --git a/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php b/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php
index 60b65020e..32f78a548 100644
--- a/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php
+++ b/src/Bundle/ChillMainBundle/Workflow/Helper/MetadataExtractor.php
@@ -72,17 +72,18 @@ class MetadataExtractor
foreach ($transitions as $transition) {
if ($transition->getName() === $transitionName) {
- break;
+ $metadata = $workflow->getMetadataStore()->getTransitionMetadata($transition);
+
+ return [
+ 'name' => $transition->getName(),
+ 'text' => array_key_exists('label', $metadata) ?
+ $this->translatableStringHelper->localize($metadata['label']) : $transition->getName(),
+ 'isForward' => $metadata['isForward'] ?? null,
+ ];
}
}
- $metadata = $workflow->getMetadataStore()->getTransitionMetadata($transition);
- return [
- 'name' => $transition->getName(),
- 'text' => array_key_exists('label', $metadata) ?
- $this->translatableStringHelper->localize($metadata['label']) : $transition->getName(),
- 'isForward' => $metadata['isForward'] ?? null,
- ];
+ return [];
}
public function buildArrayPresentationForWorkflow(WorkflowInterface $workflow): array
diff --git a/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php b/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php
index da8655f3d..1ebde2b57 100644
--- a/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php
+++ b/src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php
@@ -50,7 +50,6 @@ class HouseholdApiController extends ApiController
*/
public function getHouseholdByAddressReference(AddressReference $addressReference): Response
{
- // TODO ACL
$this->denyAccessUnlessGranted('ROLE_USER');
$total = $this->householdACLAwareRepository->countByAddressReference($addressReference);
diff --git a/src/Bundle/ChillPersonBundle/Controller/PersonController.php b/src/Bundle/ChillPersonBundle/Controller/PersonController.php
index 02c77ebd3..ac371a2af 100644
--- a/src/Bundle/ChillPersonBundle/Controller/PersonController.php
+++ b/src/Bundle/ChillPersonBundle/Controller/PersonController.php
@@ -224,6 +224,8 @@ final class PersonController extends AbstractController
'label' => 'Add the person',
])->add('createPeriod', SubmitType::class, [
'label' => 'Add the person and create an accompanying period',
+ ])->add('createHousehold', SubmitType::class, [
+ 'label' => 'Add the person and create a household'
]);
$form->handleRequest($request);
@@ -252,6 +254,12 @@ final class PersonController extends AbstractController
]);
}
+ if ($form->get('createHousehold')->isClicked()) {
+ return $this->redirectToRoute('chill_person_household_members_editor', [
+ 'persons' => [$person->getId()],
+ ]);
+ }
+
return $this->redirectToRoute(
'chill_person_general_edit',
['person_id' => $person->getId()]
diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php
index 593cdfc83..1e7444af6 100644
--- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php
+++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php
@@ -1153,11 +1153,8 @@ class AccompanyingPeriod implements
$this->removeComment($this->pinnedComment);
}
- if ($comment instanceof Comment) {
- if (null !== $this->pinnedComment) {
- $this->addComment($this->pinnedComment);
- }
- $this->addComment($comment);
+ if (null !== $this->pinnedComment) {
+ $this->addComment($this->pinnedComment);
}
$this->pinnedComment = $comment;
diff --git a/src/Bundle/ChillPersonBundle/Repository/Household/HouseholdACLAwareRepository.php b/src/Bundle/ChillPersonBundle/Repository/Household/HouseholdACLAwareRepository.php
index dc5e8f5d3..48dabd054 100644
--- a/src/Bundle/ChillPersonBundle/Repository/Household/HouseholdACLAwareRepository.php
+++ b/src/Bundle/ChillPersonBundle/Repository/Household/HouseholdACLAwareRepository.php
@@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Repository\Household;
use Chill\MainBundle\Entity\AddressReference;
use Chill\MainBundle\Security\Authorization\AuthorizationHelper;
use Chill\PersonBundle\Entity\Household\Household;
-use Chill\PersonBundle\Security\Authorization\HouseholdVoter;
+use Chill\PersonBundle\Security\Authorization\PersonVoter;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\QueryBuilder;
@@ -39,7 +39,7 @@ final class HouseholdACLAwareRepository implements HouseholdACLAwareRepositoryIn
{
$centers = $this->authorizationHelper->getReachableCenters(
$this->security->getUser(),
- HouseholdVoter::SEE
+ PersonVoter::SEE // the authorization to see a household is the same as seeing a person
);
if ([] === $centers) {
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/PersonsAssociated/ParticipationItem.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/PersonsAssociated/ParticipationItem.vue
index ed2d69f42..1a1a7e26e 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/PersonsAssociated/ParticipationItem.vue
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/PersonsAssociated/ParticipationItem.vue
@@ -29,7 +29,7 @@
-
+
{
- this.$store.dispatch('addPerson', { target: payload.target, body: response })
- this.canCloseOnTheFlyModal = true;
+ this.$store.dispatch('addPerson', { target: payload.target, body: response });
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
@@ -144,10 +145,10 @@ export default {
body.telephone = payload.data.phonenumber;
body.address = { id: payload.data.address.address_id };
- makeFetch('PATCH', `/api/1.0/third-party/third-party/${payload.data.id}.json`, body)
+ makeFetch('PATCH', `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, body)
.then(response => {
this.$store.dispatch('addThirdparty', { target: payload.target, body: response })
- this.canCloseOnTheFlyModal = true;
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue
index 8f29f4771..92931cfcb 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue
@@ -26,7 +26,7 @@
@@ -52,7 +52,7 @@
@@ -92,7 +92,7 @@
@@ -114,7 +114,7 @@
@@ -189,7 +189,6 @@ export default {
uniq: true,
}
},
- canCloseOnTheFlyModal: false
}
},
computed: {
@@ -261,12 +260,14 @@ export default {
if (payload.data.birthdate !== null) { body.birthdate = payload.data.birthdate; }
body.phonenumber = payload.data.phonenumber;
body.mobilenumber = payload.data.mobilenumber;
+ body.email = payload.data.email;
+ body.altNames = payload.data.altNames;
body.gender = payload.data.gender;
makeFetch('PATCH', `/api/1.0/person/person/${payload.data.id}.json`, body)
.then(response => {
this.$store.dispatch('addPerson', { target: payload.target, body: response })
- this.canCloseOnTheFlyModal = true;
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
@@ -284,10 +285,10 @@ export default {
body.telephone = payload.data.phonenumber;
body.address = { id: payload.data.address.address_id };
- makeFetch('PATCH', `/api/1.0/third-party/third-party/${payload.data.id}.json`, body)
+ makeFetch('PATCH', `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, body)
.then(response => {
this.$store.dispatch('addThirdparty', { target: payload.target, body: response })
- this.canCloseOnTheFlyModal = true;
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue
index 102dcf741..edd90f262 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Resources/ResourceItem.vue
@@ -35,7 +35,7 @@
:id="resource.resource.id"
action="edit"
@saveFormOnTheFly="saveFormOnTheFly"
- :canCloseModal="canCloseOnTheFlyModal">
+ ref="onTheFly">
@@ -82,7 +82,7 @@
:id="resource.resource.id"
action="edit"
@saveFormOnTheFly="saveFormOnTheFly"
- :canCloseModal="canCloseOnTheFlyModal">
+ ref="onTheFly">
@@ -116,11 +116,6 @@ export default {
},
props: ['resource'],
emits: ['remove'],
- data() {
- return {
- canCloseOnTheFlyModal: false
- }
- },
computed: {
parent() {
return {
@@ -152,12 +147,14 @@ export default {
if (payload.data.birthdate !== null) { body.birthdate = payload.data.birthdate; }
body.phonenumber = payload.data.phonenumber;
body.mobilenumber = payload.data.mobilenumber;
+ body.email = payload.data.email;
+ body.altNames = payload.data.altNames;
body.gender = payload.data.gender;
makeFetch('PATCH', `/api/1.0/person/person/${payload.data.id}.json`, body)
.then(response => {
this.$store.dispatch('addPerson', { target: payload.target, body: response })
- this.canCloseOnTheFlyModal = true;
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
@@ -175,10 +172,10 @@ export default {
body.telephone = payload.data.phonenumber;
body.address = { id: payload.data.address.address_id };
- makeFetch('PATCH', `/api/1.0/third-party/third-party/${payload.data.id}.json`, body)
+ makeFetch('PATCH', `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, body)
.then(response => {
this.$store.dispatch('addThirdparty', { target: payload.target, body: response })
- this.canCloseOnTheFlyModal = true;
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue
index f9d1a747c..34c0794fb 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue
@@ -211,7 +211,7 @@
-
+
@@ -286,6 +286,8 @@ import ListWorkflowModal from 'ChillMainAssets/vuejs/_components/EntityWorkflow/
import PickWorkflow from 'ChillMainAssets/vuejs/_components/EntityWorkflow/PickWorkflow.vue';
import PersonText from 'ChillPersonAssets/vuejs/_components/Entity/PersonText.vue';
import {buildLinkCreate} from 'ChillMainAssets/lib/entity-workflow/api.js';
+import { makeFetch } from 'ChillMainAssets/lib/api/apiMethods';
+
const i18n = {
messages: {
@@ -476,15 +478,27 @@ export default {
},
saveFormOnTheFly(payload) {
console.log('saveFormOnTheFly: type', payload.type, ', data', payload.data);
- payload.target = 'resource';
- this.$store.dispatch('patchOnTheFly', payload)
- .catch(({name, violations}) => {
- if (name === 'ValidationException' || name === 'AccessException') {
- violations.forEach((violation) => this.$toast.open({message: violation}));
+
+ let body = { type: payload.type };
+ body.name = payload.data.text;
+ body.email = payload.data.email;
+ body.telephone = payload.data.phonenumber;
+ body.address = { id: payload.data.address.address_id };
+
+ makeFetch('PATCH', `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, body)
+ .then(response => {
+ this.$store.dispatch('updateThirdParty', response)
+ this.$refs.onTheFly.closeModal();
+ })
+ .catch((error) => {
+ if (error.name === 'ValidationException') {
+ for (let v of error.violations) {
+ this.$toast.open({message: v });
+ }
} else {
- this.$toast.open({message: 'An error occurred'})
+ this.$toast.open({message: 'An error occurred'});
}
- });
+ })
}
}
};
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/index.js
index 0ef2d0de4..143d34215 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/index.js
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/index.js
@@ -1,7 +1,9 @@
import { createApp } from 'vue';
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n';
import { store } from './store';
-import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n'
+import { personMessages } from 'ChillPersonAssets/vuejs/_js/i18n';
+import VueToast from 'vue-toast-notification';
+import 'vue-toast-notification/dist/theme-sugar.css';
import App from './App.vue';
const i18n = _createI18n(personMessages);
@@ -10,6 +12,12 @@ const app = createApp({
template: ` `,
})
.use(store)
+.use(VueToast, {
+ position: "bottom-right",
+ type: "error",
+ duration: 5000,
+ dismissible: true
+})
.use(i18n)
.component('app', App)
.mount('#accompanying_course_work_edit');
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/store.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/store.js
index 0cc85fb76..6c81748d2 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/store.js
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/store.js
@@ -266,6 +266,14 @@ const store = createStore({
state.thirdParties.push(unexistings[i]);
}
},
+ updateThirdParty(state, thirdParty) {
+ for (let t of state.thirdParties) {
+ if (t.id === thirdParty.id){
+ state.thirdParties = state.thirdParties.filter(t => t.id !== thirdParty.id);
+ state.thirdParties.push(thirdParty);
+ }
+ }
+ },
removeThirdParty(state, thirdParty) {
state.thirdParties = state.thirdParties
.filter(t => t.id !== thirdParty.id);
@@ -278,6 +286,10 @@ const store = createStore({
},
},
actions: {
+ updateThirdParty({ commit }, payload) {
+ console.log(payload);
+ commit('updateThirdParty', payload);
+ },
getReachablesGoalsForAction({ getters, commit, dispatch }) {
let
socialActionId = getters.socialAction.id,
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AddPersons.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AddPersons.vue
index 9e318ff96..1f017d28d 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AddPersons.vue
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AddPersons.vue
@@ -69,7 +69,7 @@
:buttonText="$t('onthefly.create.button', {q: query})"
action="create"
@saveFormOnTheFly="saveFormOnTheFly"
- :canCloseModal="canCloseOnTheFlyModal">
+ ref="onTheFly">
@@ -121,7 +121,6 @@ export default {
selected: [],
priorSuggestion: {}
},
- canCloseOnTheFlyModal: false
}
},
computed: {
@@ -271,7 +270,7 @@ export default {
makeFetch('POST', '/api/1.0/person/person.json', data)
.then(response => {
this.newPriorSuggestion(response);
- this.canCloseOnTheFlyModal = true;
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
@@ -287,7 +286,7 @@ export default {
makeFetch('POST', '/api/1.0/thirdparty/thirdparty.json', data)
.then(response => {
this.newPriorSuggestion(response);
- this.canCloseOnTheFlyModal = true;
+ this.$refs.onTheFly.closeModal();
})
.catch((error) => {
if (error.name === 'ValidationException') {
@@ -299,7 +298,6 @@ export default {
}
})
}
- this.canCloseOnTheFlyModal = false;
}
},
}
diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue
index 9543da3bb..0e511ce5e 100644
--- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue
+++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/OnTheFly/Person.vue
@@ -43,10 +43,11 @@
{{ $t('person.firstname') }}
-
+
{{ a.labels.fr }}
@@ -199,6 +200,9 @@ export default {
},
feminized() {
return (this.person.gender === 'woman')? 'e' : '';
+ },
+ personAltNamesLabels() {
+ return this.person.altNames.map(a => a ? a.label : '');
}
},
mounted() {
diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriod/_list_item.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriod/_list_item.html.twig
index 5f12f60f1..72e635f7d 100644
--- a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriod/_list_item.html.twig
+++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriod/_list_item.html.twig
@@ -41,7 +41,7 @@
{% endif %}
{% endif %}
-
+
{% if chill_accompanying_periods.fields.user == 'visible' %}
{# the tags `data-referrer-text` is used by module `@ChillPerson/mod/AccompanyingPeriod/setReferrer.js` #}
{% if period.user %}
diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/create.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/create.html.twig
index 70d6a4a8e..3a9083310 100644
--- a/src/Bundle/ChillPersonBundle/Resources/views/Person/create.html.twig
+++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/create.html.twig
@@ -115,6 +115,9 @@
{{ form_widget(form.editPerson, { 'attr': { 'class': 'dropdown-item' }}) }}
+
+ {{ form_widget(form.createHousehold, { 'attr': { 'class': 'dropdown-item' }}) }}
+
{{ form_widget(form.createPeriod, { 'attr': { 'class': 'dropdown-item' }}) }}
diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php
index 6288663e2..e91748de8 100644
--- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php
+++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php
@@ -91,6 +91,7 @@ class PersonJsonNormalizer implements
'deathdate',
'center',
'altNames',
+ 'email',
];
$fields = array_filter(
@@ -161,6 +162,11 @@ class PersonJsonNormalizer implements
}
}
+ break;
+
+ case 'email':
+ $person->setEmail($data[$item]);
+
break;
}
}
@@ -189,6 +195,7 @@ class PersonJsonNormalizer implements
'centers' => $this->normalizer->normalize($this->centerResolverManager->resolveCenters($person), $format, $context),
'phonenumber' => $person->getPhonenumber(),
'mobilenumber' => $person->getMobilenumber(),
+ 'email' => $person->getEmail(),
'altNames' => $this->normalizeAltNames($person->getAltNames()),
'gender' => $person->getGender(),
'current_household_address' => $this->normalizer->normalize($person->getCurrentHouseholdAddress(), $format, $context),
diff --git a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php
index 419179077..08034978e 100644
--- a/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php
+++ b/src/Bundle/ChillPersonBundle/Tests/Controller/HouseholdApiControllerTest.php
@@ -21,6 +21,7 @@ use Chill\PersonBundle\Entity\Household\HouseholdMember;
use Chill\PersonBundle\Entity\Person;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
+use RuntimeException;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\HttpFoundation\Request;
use function array_map;
@@ -58,10 +59,16 @@ final class HouseholdApiControllerTest extends WebTestCase
$centerA = $em->getRepository(Center::class)->findOneBy(['name' => 'Center A']);
$nbReference = $em->createQueryBuilder()->select('count(ar)')->from(AddressReference::class, 'ar')
->getQuery()->getSingleScalarResult();
+
+ if (0 === $nbReference) {
+ throw new RuntimeException('any reference found. Add a reference in database to perform this test');
+ }
+
$reference = $em->createQueryBuilder()->select('ar')->from(AddressReference::class, 'ar')
->setFirstResult(random_int(0, $nbReference))
->setMaxResults(1)
->getQuery()->getSingleResult();
+
$p = new Person();
$p->setFirstname('test')->setLastName('test lastname')
->setGender(Person::BOTH_GENDER)
@@ -79,6 +86,7 @@ final class HouseholdApiControllerTest extends WebTestCase
[HouseholdMember::class, $m->getId()],
[User::class, $p->getId()],
[Household::class, $h->getId()],
+ [Person::class, $p->getId()],
];
yield [$reference->getId(), $h->getId()];
diff --git a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php
index a459c3c18..6c78d817d 100644
--- a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php
+++ b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriodTest.php
@@ -129,20 +129,27 @@ final class AccompanyingPeriodTest extends \PHPUnit\Framework\TestCase
$this->assertNull($period->getPinnedComment());
$period->setPinnedComment($comment);
+
$this->assertSame($period->getPinnedComment(), $comment);
- $this->assertSame($period, $comment->getAccompanyingPeriod());
- $this->assertEquals(0, count($period->getComments()), 'The initial comment should not appears in the list of comments');
+ $this->assertNull($comment->getAccompanyingPeriod());
+ $this->assertEquals(0, count($period->getComments()));
$period->setPinnedComment($replacingComment);
+
$this->assertSame($period->getPinnedComment(), $replacingComment);
- $this->assertSame($period, $replacingComment->getAccompanyingPeriod());
- $this->assertEquals(0, count($period->getComments()), 'The initial comment should not appears in the list of comments');
- $this->assertNull($comment->getAccompanyingPeriod());
+ $this->assertNull($replacingComment->getAccompanyingPeriod());
+ $this->assertSame($period, $comment->getAccompanyingPeriod());
+ $this->assertEquals(1, count($period->getComments()));
+ $this->assertContains($comment, $period->getComments());
$period->setPinnedComment(null);
+
$this->assertNull($period->getPinnedComment());
- $this->assertNull($replacingComment->getAccompanyingPeriod());
- $this->assertEquals(0, count($period->getComments()), 'The initial comment should not appears in the list of comments');
+ $this->assertSame($period, $comment->getAccompanyingPeriod());
+ $this->assertSame($period, $replacingComment->getAccompanyingPeriod());
+ $this->assertEquals(2, count($period->getComments()));
+ $this->assertContains($comment, $period->getComments());
+ $this->assertContains($replacingComment, $period->getComments());
}
public function testRequestor()
diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml
index 91aed0304..60cf842af 100644
--- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml
+++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml
@@ -124,7 +124,7 @@ address_country_code: Code pays
'Alreay existing person': 'Dossiers déjà encodés'
'Add the person': 'Ajouter la personne'
'Add the person and create an accompanying period': "Créer la personne & créer une période d'accompagnement"
-'Add the person and create an household': "Créer la personne & créer un ménage"
+'Add the person and create a household': "Créer la personne & créer un ménage"
Show person: Voir le dossier de la personne
'Confirm the creation': 'Confirmer la création'
'You will create this person': 'Vous allez créer le dossier suivant'