mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-09-10 16:55:00 +00:00
Compare commits
20 Commits
Author | SHA1 | Date | |
---|---|---|---|
35170e1f7c
|
|||
7132dfa3f6 | |||
7e09e0ea54 | |||
ccf8cc4d6e | |||
63124f8f92
|
|||
75d80ebd98 | |||
0ea6f36297 | |||
975ea417b7 | |||
af8e02f76b | |||
cbaeb3d7e8 | |||
f609ddb315 | |||
d0bceb59dc
|
|||
2883e085ed
|
|||
b05ed86d1e
|
|||
c855d0badc | |||
be57c96a2f | |||
ff344dbb0c
|
|||
8719b4dedd | |||
d8fa743bc9
|
|||
eaa40d6725
|
@@ -15,7 +15,7 @@
|
|||||||
* Export: fix typo in filter "filter accompanying period work on end date"
|
* Export: fix typo in filter "filter accompanying period work on end date"
|
||||||
* ([#189](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/189)) Export: Fix failure in export linked to household
|
* ([#189](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/189)) Export: Fix failure in export linked to household
|
||||||
* ([#205](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/205)) Fix loading of accompanying period work referrers
|
* ([#205](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/205)) Fix loading of accompanying period work referrers
|
||||||
### Traduction francophone des différents changements
|
### Traduction francophone des principaux changements
|
||||||
* export: ajout d'un regroupement "grouper les échanges par présence de l'usager";
|
* export: ajout d'un regroupement "grouper les échanges par présence de l'usager";
|
||||||
* export: ajout d'un filtre "filtre les échanges par présence de l'usager";
|
* export: ajout d'un filtre "filtre les échanges par présence de l'usager";
|
||||||
* export: ajout d'un regroupement "regrouper les échanges par personne" (seulement pour les échanges enregistrés dans le contexte de l'usager);
|
* export: ajout d'un regroupement "regrouper les échanges par personne" (seulement pour les échanges enregistrés dans le contexte de l'usager);
|
||||||
|
3
.changes/v2.12.1.md
Normal file
3
.changes/v2.12.1.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
## v2.12.1 - 2023-11-16
|
||||||
|
### Fixed
|
||||||
|
* ([#208](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/208)) Export: fix loading of form for "filter action by type, goal and result"
|
9
.changes/v2.13.0.md
Normal file
9
.changes/v2.13.0.md
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
## v2.13.0 - 2023-11-21
|
||||||
|
### Feature
|
||||||
|
* ([#173](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/173)) Allow user to add a phonenumber to their profile which will be included in automatically generated documents
|
||||||
|
### Fixed
|
||||||
|
* ([#211](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/211)) Export: fix loading of "Group activity by type"
|
||||||
|
* ([#190](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/190)) Export: fix loading of "group activity by reasons"
|
||||||
|
* ([#213](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/213)) Export: fix usage of some Collection returned instead of array in export filters
|
||||||
|
* ([#215](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/215)) Use only the string 'both' for gender (with a database migration)
|
||||||
|
* ([#212](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/212)) Clean the database to make working the "Group people by gender" aggregator
|
41
CHANGELOG.md
41
CHANGELOG.md
@@ -6,6 +6,47 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
|
|||||||
and is generated by [Changie](https://github.com/miniscruff/changie).
|
and is generated by [Changie](https://github.com/miniscruff/changie).
|
||||||
|
|
||||||
|
|
||||||
|
## v2.13.0 - 2023-11-21
|
||||||
|
### Feature
|
||||||
|
* ([#173](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/173)) Allow user to add a phonenumber to their profile which will be included in automatically generated documents
|
||||||
|
### Fixed
|
||||||
|
* ([#211](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/211)) Export: fix loading of "Group activity by type"
|
||||||
|
* ([#190](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/190)) Export: fix loading of "group activity by reasons"
|
||||||
|
* ([#213](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/213)) Export: fix usage of some Collection returned instead of array in export filters
|
||||||
|
* ([#215](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/215)) Use only the string 'both' for gender (with a database migration)
|
||||||
|
* ([#212](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/212)) Clean the database to make working the "Group people by gender" aggregator
|
||||||
|
|
||||||
|
## v2.12.1 - 2023-11-16
|
||||||
|
### Fixed
|
||||||
|
* ([#208](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/208)) Export: fix loading of form for "filter action by type, goal and result"
|
||||||
|
|
||||||
|
## v2.12.0 - 2023-11-15
|
||||||
|
### Feature
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by presence"
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a filter "filter activity by activity presence"
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by person" (only for the activities saved in a person context)
|
||||||
|
* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a new aggregator "group peoples by postal code"
|
||||||
|
* ([#200](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/200)) Export: split export about person on accompanying period work: one with the people associated with the work, another one with the people associated with the accompanying period
|
||||||
|
* ([#204](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/204)) Add 3 new filters and 3 new aggregators for work action creator (with jobs and scopes)
|
||||||
|
|
||||||
|
* ([#202](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/202)) Create export for the average duration of social work actions
|
||||||
|
* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add a export which count persons on accompanying period work
|
||||||
|
* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add an export which count persons on activity
|
||||||
|
* ([#203](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/203)) Export: add clauses on the social work start date and end date within the filter "Filter accompanying period by accompanying period work"
|
||||||
|
### Fixed
|
||||||
|
* Export: fix typo in filter "filter accompanying period work on end date"
|
||||||
|
* ([#189](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/189)) Export: Fix failure in export linked to household
|
||||||
|
* ([#205](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/205)) Fix loading of accompanying period work referrers
|
||||||
|
### Traduction francophone des principaux changements
|
||||||
|
* export: ajout d'un regroupement "grouper les échanges par présence de l'usager";
|
||||||
|
* export: ajout d'un filtre "filtre les échanges par présence de l'usager";
|
||||||
|
* export: ajout d'un regroupement "regrouper les échanges par personne" (seulement pour les échanges enregistrés dans le contexte de l'usager);
|
||||||
|
* export: ajout d'un regroupement "grouper les usagers par codes postaux"
|
||||||
|
* export: séparation des exports sur les actions: dans l'un, les filtres des usagers portent sur les usagers concernés par l'action, dans l'autre, les filtres portent sur les usagers concernés par le parcours de l'action;
|
||||||
|
* export: ajout de 3 nouveaux filtres et regroupements sur le créateur de l'action, son métier et son service;
|
||||||
|
* export: correction de l'export sur les ménages liés aux parcours;
|
||||||
|
* correction du chargement des actions d'accompagnement
|
||||||
|
|
||||||
## v2.11.0 - 2023-11-07
|
## v2.11.0 - 2023-11-07
|
||||||
### Feature
|
### Feature
|
||||||
* ([#194](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/194)) Export: add a filter "filter activity by creator job"
|
* ([#194](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/194)) Export: add a filter "filter activity by creator job"
|
||||||
|
@@ -56,20 +56,15 @@ class ActivityTypeAggregator implements AggregatorInterface
|
|||||||
|
|
||||||
public function getLabels($key, array $values, $data): \Closure
|
public function getLabels($key, array $values, $data): \Closure
|
||||||
{
|
{
|
||||||
// for performance reason, we load data from db only once
|
return function (null|int|string $value): string {
|
||||||
$this->activityTypeRepository->findBy(['id' => $values]);
|
|
||||||
|
|
||||||
return function ($value): string {
|
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return 'Activity type';
|
return 'Activity type';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $value || '' === $value) {
|
if (null === $value || '' === $value || null === $t = $this->activityTypeRepository->find($value)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
$t = $this->activityTypeRepository->find($value);
|
|
||||||
|
|
||||||
return $this->translatableStringHelper->localize($t->getName());
|
return $this->translatableStringHelper->localize($t->getName());
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -99,12 +99,6 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali
|
|||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
match ($data['level']) {
|
|
||||||
'reasons' => $this->activityReasonRepository->findBy(['id' => $values]),
|
|
||||||
'categories' => $this->activityReasonCategoryRepository->findBy(['id' => $values]),
|
|
||||||
default => throw new \RuntimeException(sprintf("The level data '%s' is invalid.", $data['level'])),
|
|
||||||
};
|
|
||||||
|
|
||||||
return function ($value) use ($data) {
|
return function ($value) use ($data) {
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return 'reasons' === $data['level'] ? 'Group by reasons' : 'Group by categories of reason';
|
return 'reasons' === $data['level'] ? 'Group by reasons' : 'Group by categories of reason';
|
||||||
|
@@ -11,14 +11,14 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Chill\DocGeneratorBundle\Serializer\Helper;
|
namespace Chill\DocGeneratorBundle\Serializer\Helper;
|
||||||
|
|
||||||
use Symfony\Component\Serializer\Mapping\ClassMetadata;
|
use Symfony\Component\Serializer\Mapping\ClassMetadataInterface;
|
||||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
|
||||||
class NormalizeNullValueHelper
|
class NormalizeNullValueHelper
|
||||||
{
|
{
|
||||||
public function __construct(private readonly NormalizerInterface $normalizer, private readonly ?string $discriminatorType = null, private readonly ?string $discriminatorValue = null) {}
|
public function __construct(private readonly NormalizerInterface $normalizer, private readonly ?string $discriminatorType = null, private readonly ?string $discriminatorValue = null) {}
|
||||||
|
|
||||||
public function normalize(array $attributes, string $format = 'docgen', ?array $context = [], ClassMetadata $classMetadata = null)
|
public function normalize(array $attributes, string $format = 'docgen', ?array $context = [], ClassMetadataInterface $classMetadata = null)
|
||||||
{
|
{
|
||||||
$data = [];
|
$data = [];
|
||||||
$data['isNull'] = true;
|
$data['isNull'] = true;
|
||||||
@@ -44,7 +44,7 @@ class NormalizeNullValueHelper
|
|||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getContextForAttribute(string $key, array $initialContext, ?ClassMetadata $classMetadata): array
|
private function getContextForAttribute(string $key, array $initialContext, ?ClassMetadataInterface $classMetadata): array
|
||||||
{
|
{
|
||||||
if (null === $classMetadata) {
|
if (null === $classMetadata) {
|
||||||
return $initialContext;
|
return $initialContext;
|
||||||
|
@@ -19,6 +19,7 @@ use Symfony\Component\PropertyAccess\PropertyAccessor;
|
|||||||
use Symfony\Component\Serializer\Exception\ExceptionInterface;
|
use Symfony\Component\Serializer\Exception\ExceptionInterface;
|
||||||
use Symfony\Component\Serializer\Exception\LogicException;
|
use Symfony\Component\Serializer\Exception\LogicException;
|
||||||
use Symfony\Component\Serializer\Mapping\AttributeMetadata;
|
use Symfony\Component\Serializer\Mapping\AttributeMetadata;
|
||||||
|
use Symfony\Component\Serializer\Mapping\AttributeMetadataInterface;
|
||||||
use Symfony\Component\Serializer\Mapping\ClassMetadata;
|
use Symfony\Component\Serializer\Mapping\ClassMetadata;
|
||||||
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
|
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactoryInterface;
|
||||||
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
|
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
|
||||||
@@ -52,12 +53,15 @@ class DocGenObjectNormalizer implements NormalizerAwareInterface, NormalizerInte
|
|||||||
}
|
}
|
||||||
|
|
||||||
$metadata = $this->classMetadataFactory->getMetadataFor($classMetadataKey);
|
$metadata = $this->classMetadataFactory->getMetadataFor($classMetadataKey);
|
||||||
|
if (!$metadata instanceof ClassMetadata) {
|
||||||
|
throw new \LogicException('ClassMetadata should be the only one implementation for ClassMetadataInterface. See https://github.com/symfony/symfony/pull/17114');
|
||||||
|
}
|
||||||
$expectedGroups = \array_key_exists(AbstractNormalizer::GROUPS, $context) ?
|
$expectedGroups = \array_key_exists(AbstractNormalizer::GROUPS, $context) ?
|
||||||
\is_array($context[AbstractNormalizer::GROUPS]) ? $context[AbstractNormalizer::GROUPS] : [$context[AbstractNormalizer::GROUPS]]
|
\is_array($context[AbstractNormalizer::GROUPS]) ? $context[AbstractNormalizer::GROUPS] : [$context[AbstractNormalizer::GROUPS]]
|
||||||
: [];
|
: [];
|
||||||
$attributes = \array_filter(
|
$attributes = \array_filter(
|
||||||
$metadata->getAttributesMetadata(),
|
$metadata->getAttributesMetadata(),
|
||||||
static function (AttributeMetadata $a) use ($expectedGroups) {
|
static function (AttributeMetadataInterface $a) use ($expectedGroups) {
|
||||||
foreach ($a->getGroups() as $g) {
|
foreach ($a->getGroups() as $g) {
|
||||||
if (\in_array($g, $expectedGroups, true)) {
|
if (\in_array($g, $expectedGroups, true)) {
|
||||||
return true;
|
return true;
|
||||||
@@ -119,7 +123,7 @@ class DocGenObjectNormalizer implements NormalizerAwareInterface, NormalizerInte
|
|||||||
return $type->getName();
|
return $type->getName();
|
||||||
}
|
}
|
||||||
if ($type instanceof \ReflectionIntersectionType) {
|
if ($type instanceof \ReflectionIntersectionType) {
|
||||||
foreach (array_map(fn (\ReflectionNamedType $t) => $t->getName(), $type->getTypes()) as $classString) {
|
foreach (array_map(fn (\ReflectionType $t) => $t->getName(), $type->getTypes()) as $classString) {
|
||||||
if (ReadableCollection::class === $classString) {
|
if (ReadableCollection::class === $classString) {
|
||||||
return ReadableCollection::class;
|
return ReadableCollection::class;
|
||||||
}
|
}
|
||||||
@@ -211,7 +215,7 @@ class DocGenObjectNormalizer implements NormalizerAwareInterface, NormalizerInte
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array|AttributeMetadata[] $attributes
|
* @param array<AttributeMetadata> $attributes
|
||||||
*
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*
|
*
|
||||||
|
@@ -0,0 +1,65 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Controller;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Form\UserPhonenumberType;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||||
|
use Symfony\Component\Form\FormInterface;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\Security\Core\User\UserInterface;
|
||||||
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
|
|
||||||
|
class UserProfileController extends AbstractController
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly TranslatorInterface $translator,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User profile that allows editing of phonenumber and visualization of certain data.
|
||||||
|
*
|
||||||
|
* @Route("/{_locale}/main/user/my-profile", name="chill_main_user_profile")
|
||||||
|
*/
|
||||||
|
public function __invoke(Request $request)
|
||||||
|
{
|
||||||
|
$user = $this->getUser();
|
||||||
|
$editForm = $this->createPhonenumberEditForm($user);
|
||||||
|
$editForm->handleRequest($request);
|
||||||
|
|
||||||
|
if ($editForm->isSubmitted() && $editForm->isValid()) {
|
||||||
|
$phonenumber = $editForm->get('phonenumber')->getData();
|
||||||
|
|
||||||
|
$user->setPhonenumber($phonenumber);
|
||||||
|
|
||||||
|
$this->getDoctrine()->getManager()->flush();
|
||||||
|
$this->addFlash('success', $this->translator->trans('user.profile.Phonenumber successfully updated!'));
|
||||||
|
|
||||||
|
return $this->redirectToRoute('chill_main_user_profile');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->render('@ChillMain/User/profile.html.twig', [
|
||||||
|
'user' => $user,
|
||||||
|
'form' => $editForm->createView(),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function createPhonenumberEditForm(UserInterface $user): FormInterface
|
||||||
|
{
|
||||||
|
return $this->createForm(
|
||||||
|
UserPhonenumberType::class,
|
||||||
|
$user,
|
||||||
|
)
|
||||||
|
->add('submit', SubmitType::class, ['label' => $this->translator->trans('Save')]);
|
||||||
|
}
|
||||||
|
}
|
@@ -18,9 +18,11 @@ use Doctrine\Common\Collections\Collection;
|
|||||||
use Doctrine\Common\Collections\Criteria;
|
use Doctrine\Common\Collections\Criteria;
|
||||||
use Doctrine\Common\Collections\Selectable;
|
use Doctrine\Common\Collections\Selectable;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
use libphonenumber\PhoneNumber;
|
||||||
use Symfony\Component\Security\Core\User\UserInterface;
|
use Symfony\Component\Security\Core\User\UserInterface;
|
||||||
use Symfony\Component\Serializer\Annotation as Serializer;
|
use Symfony\Component\Serializer\Annotation as Serializer;
|
||||||
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
|
use Chill\MainBundle\Validation\Constraint\PhonenumberConstraint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User.
|
* User.
|
||||||
@@ -161,6 +163,15 @@ class User implements UserInterface, \Stringable
|
|||||||
*/
|
*/
|
||||||
private ?string $usernameCanonical = null;
|
private ?string $usernameCanonical = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The user's mobile phone number.
|
||||||
|
*
|
||||||
|
* @ORM\Column(type="phone_number", nullable=true)
|
||||||
|
*
|
||||||
|
* @PhonenumberConstraint()
|
||||||
|
*/
|
||||||
|
private ?PhoneNumber $phonenumber = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User constructor.
|
* User constructor.
|
||||||
*/
|
*/
|
||||||
@@ -419,6 +430,11 @@ class User implements UserInterface, \Stringable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getPhonenumber(): ?PhoneNumber
|
||||||
|
{
|
||||||
|
return $this->phonenumber;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws \RuntimeException if the groupCenter is not in the collection
|
* @throws \RuntimeException if the groupCenter is not in the collection
|
||||||
*/
|
*/
|
||||||
@@ -639,4 +655,11 @@ class User implements UserInterface, \Stringable
|
|||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setPhonenumber(?PhoneNumber $phonenumber): self
|
||||||
|
{
|
||||||
|
$this->phonenumber = $phonenumber;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
36
src/Bundle/ChillMainBundle/Form/UserPhonenumberType.php
Normal file
36
src/Bundle/ChillMainBundle/Form/UserPhonenumberType.php
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Form;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
|
use Chill\MainBundle\Form\Type\ChillPhoneNumberType;
|
||||||
|
use Symfony\Component\Form\AbstractType;
|
||||||
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
|
|
||||||
|
class UserPhonenumberType extends AbstractType
|
||||||
|
{
|
||||||
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||||
|
{
|
||||||
|
$builder
|
||||||
|
->add('phonenumber', ChillPhoneNumberType::class, [
|
||||||
|
'required' => false,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
|
{
|
||||||
|
$resolver->setDefaults([
|
||||||
|
'data_class' => User::class,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
@@ -16,6 +16,7 @@ use Chill\MainBundle\Entity\Location;
|
|||||||
use Chill\MainBundle\Entity\Scope;
|
use Chill\MainBundle\Entity\Scope;
|
||||||
use Chill\MainBundle\Entity\UserJob;
|
use Chill\MainBundle\Entity\UserJob;
|
||||||
use Chill\MainBundle\Form\Type\ChillDateType;
|
use Chill\MainBundle\Form\Type\ChillDateType;
|
||||||
|
use Chill\MainBundle\Form\Type\ChillPhoneNumberType;
|
||||||
use Chill\MainBundle\Form\Type\PickCivilityType;
|
use Chill\MainBundle\Form\Type\PickCivilityType;
|
||||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
|
use Chill\MainBundle\Templating\TranslatableStringHelper;
|
||||||
use Doctrine\ORM\EntityRepository;
|
use Doctrine\ORM\EntityRepository;
|
||||||
@@ -44,6 +45,9 @@ class UserType extends AbstractType
|
|||||||
->add('email', EmailType::class, [
|
->add('email', EmailType::class, [
|
||||||
'required' => true,
|
'required' => true,
|
||||||
])
|
])
|
||||||
|
->add('phonenumber', ChillPhoneNumberType::class, [
|
||||||
|
'required' => false,
|
||||||
|
])
|
||||||
->add('label', TextType::class)
|
->add('label', TextType::class)
|
||||||
->add('civility', PickCivilityType::class, [
|
->add('civility', PickCivilityType::class, [
|
||||||
'required' => false,
|
'required' => false,
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
import {ShowHide} from 'ChillMainAssets/lib/show_hide/index';
|
import {ShowHide} from 'ChillMainAssets/lib/show_hide/index';
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function(_e) {
|
document.addEventListener('DOMContentLoaded', function(_e) {
|
||||||
console.log('pick-rolling-date');
|
|
||||||
document.querySelectorAll('div[data-rolling-date]').forEach( (picker) => {
|
document.querySelectorAll('div[data-rolling-date]').forEach( (picker) => {
|
||||||
const
|
const
|
||||||
roll_wrapper = picker.querySelector('div.roll-wrapper'),
|
roll_wrapper = picker.querySelector('div.roll-wrapper'),
|
||||||
@@ -11,12 +10,8 @@ document.addEventListener('DOMContentLoaded', function(_e) {
|
|||||||
froms: [roll_wrapper],
|
froms: [roll_wrapper],
|
||||||
container: [fixed_wrapper],
|
container: [fixed_wrapper],
|
||||||
test: function (elems) {
|
test: function (elems) {
|
||||||
console.log('testing');
|
|
||||||
console.log('elems', elems);
|
|
||||||
for (let el of elems) {
|
for (let el of elems) {
|
||||||
for (let select_roll of el.querySelectorAll('select[data-roll-picker]')) {
|
for (let select_roll of el.querySelectorAll('select[data-roll-picker]')) {
|
||||||
console.log('select_roll', select_roll);
|
|
||||||
console.log('value', select_roll.value);
|
|
||||||
return select_roll.value === 'fixed_date';
|
return select_roll.value === 'fixed_date';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -28,9 +28,7 @@
|
|||||||
{% block js %}
|
{% block js %}
|
||||||
{{ encore_entry_script_tags('mod_pickentity_type') }}
|
{{ encore_entry_script_tags('mod_pickentity_type') }}
|
||||||
{{ encore_entry_script_tags('page_export') }}
|
{{ encore_entry_script_tags('page_export') }}
|
||||||
{% if export_alias == 'count_social_work_actions' %}
|
{{ encore_entry_script_tags('vue_export_action_goal_result') }}
|
||||||
{{ encore_entry_script_tags('vue_export_action_goal_result') }}
|
|
||||||
{% endif %}
|
|
||||||
{{ encore_entry_script_tags('mod_pick_rolling_date') }}
|
{{ encore_entry_script_tags('mod_pick_rolling_date') }}
|
||||||
{% endblock js %}
|
{% endblock js %}
|
||||||
|
|
||||||
|
@@ -0,0 +1,58 @@
|
|||||||
|
{#
|
||||||
|
* Copyright (C) 2014-2015, Champs Libres Cooperative SCRLFS,
|
||||||
|
<info@champs-libres.coop> / <http://www.champs-libres.coop>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, either version 3 of the
|
||||||
|
* License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#}
|
||||||
|
|
||||||
|
|
||||||
|
{% extends "@ChillMain/layout.html.twig" %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block title %}{{"My profile"|trans}}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="justify-content-center col-10">
|
||||||
|
<h1>{{ 'user.profile.title'|trans }}</h1>
|
||||||
|
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt>{{ 'Job'|trans }}</dt>
|
||||||
|
{% if user.getUserJob is not null %}
|
||||||
|
<dd>{{ user.getUserJob.label|localize_translatable_string }}</dd>
|
||||||
|
{% else %}
|
||||||
|
<dd class="chill-no-data-statement">{{ 'user.profile.no job'|trans }}</dd>
|
||||||
|
{% endif %}
|
||||||
|
<dt>{{ 'Scope'|trans }}</dt>
|
||||||
|
{% if user.getMainScope is not null %}
|
||||||
|
<dd>{{ user.getMainScope.name|localize_translatable_string }}</dd>
|
||||||
|
{% else %}
|
||||||
|
<dd class="chill-no-data-statement">{{ 'user.profile.no scope'|trans }}</dd>
|
||||||
|
{% endif %}
|
||||||
|
</dl>
|
||||||
|
<div>
|
||||||
|
{{ form_start(form) }}
|
||||||
|
{{ form_row(form.phonenumber) }}
|
||||||
|
|
||||||
|
<ul class="record_actions">
|
||||||
|
<li>
|
||||||
|
{{ form_widget(form.submit, { 'attr': { 'class': 'btn btn-save' } } ) }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{{ form_end(form) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
@@ -29,6 +29,14 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
|
|||||||
$user = $this->security->getUser();
|
$user = $this->security->getUser();
|
||||||
|
|
||||||
if ($user instanceof User) {
|
if ($user instanceof User) {
|
||||||
|
$menu->addChild($this->translator->trans('user.profile.title'), [
|
||||||
|
'route' => 'chill_main_user_profile',
|
||||||
|
])
|
||||||
|
->setExtras([
|
||||||
|
'order' => -11_111_111,
|
||||||
|
'icon' => 'user',
|
||||||
|
]);
|
||||||
|
|
||||||
if (null !== $user->getCurrentLocation()) {
|
if (null !== $user->getCurrentLocation()) {
|
||||||
$locationTextMenu = $user->getCurrentLocation()->getName();
|
$locationTextMenu = $user->getCurrentLocation()->getName();
|
||||||
} else {
|
} else {
|
||||||
|
@@ -18,6 +18,7 @@ use Chill\MainBundle\Entity\Scope;
|
|||||||
use Chill\MainBundle\Entity\User;
|
use Chill\MainBundle\Entity\User;
|
||||||
use Chill\MainBundle\Entity\UserJob;
|
use Chill\MainBundle\Entity\UserJob;
|
||||||
use Chill\MainBundle\Templating\Entity\UserRender;
|
use Chill\MainBundle\Templating\Entity\UserRender;
|
||||||
|
use libphonenumber\PhoneNumber;
|
||||||
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
|
use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface;
|
||||||
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
|
use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface;
|
||||||
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;
|
use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait;
|
||||||
@@ -34,6 +35,7 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware
|
|||||||
'text_without_absent' => '',
|
'text_without_absent' => '',
|
||||||
'label' => '',
|
'label' => '',
|
||||||
'email' => '',
|
'email' => '',
|
||||||
|
'isAbsent' => false,
|
||||||
];
|
];
|
||||||
|
|
||||||
public function __construct(private readonly UserRender $userRender) {}
|
public function __construct(private readonly UserRender $userRender) {}
|
||||||
@@ -61,9 +63,13 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware
|
|||||||
$context,
|
$context,
|
||||||
['docgen:expects' => Civility::class, 'groups' => 'docgen:read']
|
['docgen:expects' => Civility::class, 'groups' => 'docgen:read']
|
||||||
);
|
);
|
||||||
|
$phonenumberContext = array_merge(
|
||||||
|
$context,
|
||||||
|
['docgen:expects' => PhoneNumber::class, 'groups' => 'docgen:read']
|
||||||
|
);
|
||||||
|
|
||||||
if (null === $object && 'docgen' === $format) {
|
if (null === $object && 'docgen' === $format) {
|
||||||
return [...self::NULL_USER, 'civility' => $this->normalizer->normalize(null, $format, $civilityContext), 'user_job' => $this->normalizer->normalize(null, $format, $userJobContext), 'main_center' => $this->normalizer->normalize(null, $format, $centerContext), 'main_scope' => $this->normalizer->normalize(null, $format, $scopeContext), 'current_location' => $this->normalizer->normalize(null, $format, $locationContext), 'main_location' => $this->normalizer->normalize(null, $format, $locationContext)];
|
return [...self::NULL_USER, 'phonenumber' => $this->normalizer->normalize(null, $format, $phonenumberContext), 'civility' => $this->normalizer->normalize(null, $format, $civilityContext), 'user_job' => $this->normalizer->normalize(null, $format, $userJobContext), 'main_center' => $this->normalizer->normalize(null, $format, $centerContext), 'main_scope' => $this->normalizer->normalize(null, $format, $scopeContext), 'current_location' => $this->normalizer->normalize(null, $format, $locationContext), 'main_location' => $this->normalizer->normalize(null, $format, $locationContext)];
|
||||||
}
|
}
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
@@ -74,6 +80,7 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware
|
|||||||
'text_without_absent' => $this->userRender->renderString($object, ['absence' => false]),
|
'text_without_absent' => $this->userRender->renderString($object, ['absence' => false]),
|
||||||
'label' => $object->getLabel(),
|
'label' => $object->getLabel(),
|
||||||
'email' => (string) $object->getEmail(),
|
'email' => (string) $object->getEmail(),
|
||||||
|
'phonenumber' => $this->normalizer->normalize($object->getPhonenumber(), $format, $phonenumberContext),
|
||||||
'user_job' => $this->normalizer->normalize($object->getUserJob(), $format, $userJobContext),
|
'user_job' => $this->normalizer->normalize($object->getUserJob(), $format, $userJobContext),
|
||||||
'main_center' => $this->normalizer->normalize($object->getMainCenter(), $format, $centerContext),
|
'main_center' => $this->normalizer->normalize($object->getMainCenter(), $format, $centerContext),
|
||||||
'main_scope' => $this->normalizer->normalize($object->getMainScope(), $format, $scopeContext),
|
'main_scope' => $this->normalizer->normalize($object->getMainScope(), $format, $scopeContext),
|
||||||
|
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\MainBundle\Tests\Controller;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Test\PrepareClientTrait;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @coversNothing
|
||||||
|
*/
|
||||||
|
final class UserProfileControllerTest extends WebTestCase
|
||||||
|
{
|
||||||
|
use PrepareClientTrait;
|
||||||
|
|
||||||
|
public function testPage()
|
||||||
|
{
|
||||||
|
$client = $this->getClientAuthenticated();
|
||||||
|
|
||||||
|
$client->request('GET', '/fr/main/user/my-profile');
|
||||||
|
$this->assertResponseIsSuccessful('Request GET /main/user/my-profile was successful');
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,140 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Serializer\Normalizer;
|
||||||
|
|
||||||
|
use Chill\MainBundle\Entity\Center;
|
||||||
|
use Chill\MainBundle\Entity\Civility;
|
||||||
|
use Chill\MainBundle\Entity\Location;
|
||||||
|
use Chill\MainBundle\Entity\Scope;
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
|
use Chill\MainBundle\Entity\UserJob;
|
||||||
|
use Chill\MainBundle\Serializer\Normalizer\UserNormalizer;
|
||||||
|
use Chill\MainBundle\Templating\Entity\UserRender;
|
||||||
|
use libphonenumber\NumberParseException;
|
||||||
|
use libphonenumber\PhoneNumber;
|
||||||
|
use libphonenumber\PhoneNumberUtil;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Prophecy\Argument;
|
||||||
|
use Prophecy\PhpUnit\ProphecyTrait;
|
||||||
|
use Symfony\Component\Serializer\Exception\ExceptionInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @coversNothing
|
||||||
|
*/
|
||||||
|
final class UserNormalizerTest extends TestCase
|
||||||
|
{
|
||||||
|
use ProphecyTrait;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws NumberParseException
|
||||||
|
*/
|
||||||
|
public function dataProviderUserNormalizer()
|
||||||
|
{
|
||||||
|
$user = new User();
|
||||||
|
$userNoPhone = new User();
|
||||||
|
|
||||||
|
$user
|
||||||
|
->setUsername('SomeUser')
|
||||||
|
->setLabel('SomeUser')
|
||||||
|
->setPhonenumber(PhoneNumberUtil::getInstance()->parse('+32475928635'))
|
||||||
|
->setEmail('some.user@chill.com');
|
||||||
|
|
||||||
|
$userNoPhone
|
||||||
|
->setUsername('AnotherUser')
|
||||||
|
->setLabel('AnotherUser');
|
||||||
|
|
||||||
|
yield [$user, 'docgen', ['docgen:expects' => User::class],
|
||||||
|
[
|
||||||
|
'id' => $user->getId(), // id
|
||||||
|
'type' => 'user', // type
|
||||||
|
'username' => 'SomeUser', // username
|
||||||
|
'email' => 'some.user@chill.com', // email
|
||||||
|
'text' => 'SomeUser', // text
|
||||||
|
'label' => 'SomeUser', // label
|
||||||
|
'phonenumber' => ['context' => PhoneNumber::class], // phonenumber
|
||||||
|
'main_scope' => ['context' => Scope::class], // scope
|
||||||
|
'user_job' => ['context' => UserJob::class], // user job
|
||||||
|
'current_location' => ['context' => Location::class], // curent location
|
||||||
|
'main_location' => ['context' => Location::class], // main location
|
||||||
|
'civility' => ['context' => Civility::class], // civility
|
||||||
|
'text_without_absent' => 'SomeUser',
|
||||||
|
'isAbsent' => false,
|
||||||
|
'main_center' => ['context' => Center::class],
|
||||||
|
]];
|
||||||
|
|
||||||
|
yield [$userNoPhone, 'docgen', ['docgen:expects' => User::class],
|
||||||
|
[
|
||||||
|
'id' => $user->getId(), // id
|
||||||
|
'type' => 'user', // type
|
||||||
|
'username' => 'AnotherUser', // username
|
||||||
|
'email' => '', // email
|
||||||
|
'text' => 'AnotherUser', // text
|
||||||
|
'label' => 'AnotherUser', // label
|
||||||
|
'phonenumber' => ['context' => PhoneNumber::class], // phonenumber
|
||||||
|
'main_scope' => ['context' => Scope::class], // scope
|
||||||
|
'user_job' => ['context' => UserJob::class], // user job
|
||||||
|
'current_location' => ['context' => Location::class], // curent location
|
||||||
|
'main_location' => ['context' => Location::class], // main location
|
||||||
|
'civility' => ['context' => Civility::class], // civility
|
||||||
|
'text_without_absent' => 'AnotherUser',
|
||||||
|
'isAbsent' => false,
|
||||||
|
'main_center' => ['context' => Center::class],
|
||||||
|
]];
|
||||||
|
|
||||||
|
yield [null, 'docgen', ['docgen:expects' => User::class], [
|
||||||
|
'id' => '', // id
|
||||||
|
'type' => 'user', // type
|
||||||
|
'username' => '', // username
|
||||||
|
'email' => '', // email
|
||||||
|
'text' => '', // text
|
||||||
|
'label' => '', // label
|
||||||
|
'phonenumber' => ['context' => PhoneNumber::class], // phonenumber
|
||||||
|
'main_scope' => ['context' => Scope::class], // scope
|
||||||
|
'user_job' => ['context' => UserJob::class], // user job
|
||||||
|
'current_location' => ['context' => Location::class], // curent location
|
||||||
|
'main_location' => ['context' => Location::class], // main location
|
||||||
|
'civility' => ['context' => Civility::class], // civility
|
||||||
|
'text_without_absent' => '',
|
||||||
|
'isAbsent' => false,
|
||||||
|
'main_center' => ['context' => Center::class],
|
||||||
|
]];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider dataProviderUserNormalizer
|
||||||
|
*
|
||||||
|
* @throws ExceptionInterface
|
||||||
|
*/
|
||||||
|
public function testNormalize(null|User $user, mixed $format, mixed $context, mixed $expected)
|
||||||
|
{
|
||||||
|
$userRender = $this->prophesize(UserRender::class);
|
||||||
|
$userRender->renderString(Argument::type(User::class), Argument::type('array'))->willReturn($user ? $user->getLabel() : '');
|
||||||
|
|
||||||
|
$normalizer = new UserNormalizer($userRender->reveal());
|
||||||
|
$normalizer->setNormalizer(new class () implements NormalizerInterface {
|
||||||
|
public function normalize($object, string $format = null, array $context = [])
|
||||||
|
{
|
||||||
|
return ['context' => $context['docgen:expects'] ?? null];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function supportsNormalization($data, string $format = null)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $normalizer->normalize($user, $format, $context));
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\Migrations\Main;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add phonenumber to user profile.
|
||||||
|
*/
|
||||||
|
final class Version20231020075524 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return 'Add phonenumber to user profile';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE users ADD phonenumber VARCHAR(35) DEFAULT NULL');
|
||||||
|
$this->addSql('COMMENT ON COLUMN users.phonenumber IS \'(DC2Type:phone_number)\'');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql('ALTER TABLE users DROP phonenumber');
|
||||||
|
}
|
||||||
|
}
|
@@ -44,6 +44,13 @@ address_fields: Données liées à l'adresse
|
|||||||
Datas: Données
|
Datas: Données
|
||||||
No title: Aucun titre
|
No title: Aucun titre
|
||||||
|
|
||||||
|
user:
|
||||||
|
profile:
|
||||||
|
title: Mon profil
|
||||||
|
Phonenumber successfully updated!: Numéro de téléphone mis à jour!
|
||||||
|
no job: Pas de métier assigné
|
||||||
|
no scope: Pas de cercle assigné
|
||||||
|
|
||||||
inactive: inactif
|
inactive: inactif
|
||||||
|
|
||||||
Edit: Modifier
|
Edit: Modifier
|
||||||
|
@@ -39,6 +39,13 @@ Last updated by: Laatste update door
|
|||||||
on: "op "
|
on: "op "
|
||||||
Last updated on: Laatste update op
|
Last updated on: Laatste update op
|
||||||
by_user: "door "
|
by_user: "door "
|
||||||
|
lifecycleUpdate: Updates en creatie gebeurtenissen
|
||||||
|
address_fields: Gegevens gelinked aan het adres
|
||||||
|
Datas: Gegevens
|
||||||
|
No title: Geen titel
|
||||||
|
User profile: Mijn gebruikersprofiel
|
||||||
|
Phonenumber successfully updated!: Telefoonnummer bijgewerkt!
|
||||||
|
|
||||||
|
|
||||||
Edit: Bewerken
|
Edit: Bewerken
|
||||||
Update: Updaten
|
Update: Updaten
|
||||||
|
@@ -70,7 +70,7 @@ class ChildrenNumberAggregator implements AggregatorInterface
|
|||||||
|
|
||||||
public function getLabels($key, array $values, $data)
|
public function getLabels($key, array $values, $data)
|
||||||
{
|
{
|
||||||
return static function ($value): string {
|
return static function (int|string|null $value): string {
|
||||||
if ('_header' === $value) {
|
if ('_header' === $value) {
|
||||||
return 'Number of children';
|
return 'Number of children';
|
||||||
}
|
}
|
||||||
@@ -79,7 +79,7 @@ class ChildrenNumberAggregator implements AggregatorInterface
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
return $value;
|
return (string) $value;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\User;
|
|||||||
use Chill\MainBundle\Export\FilterInterface;
|
use Chill\MainBundle\Export\FilterInterface;
|
||||||
use Chill\MainBundle\Form\Type\PickUserDynamicType;
|
use Chill\MainBundle\Form\Type\PickUserDynamicType;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
@@ -59,7 +60,13 @@ class CreatorFilter implements FilterInterface
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'Filtered by creator: only %creators%', [
|
'Filtered by creator: only %creators%', [
|
||||||
'%creators%' => implode(', ', array_map(static fn (User $u) => $u->getLabel(), $data['accepted_creators'])),
|
'%creators%' => implode(
|
||||||
|
', ',
|
||||||
|
array_map(
|
||||||
|
static fn (User $u) => $u->getLabel(),
|
||||||
|
$data['accepted_creators'] instanceof Collection ? $data['accepted_creators']->toArray() : $data['accepted_creators']
|
||||||
|
)
|
||||||
|
),
|
||||||
], ];
|
], ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -23,6 +23,7 @@ use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
|||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Entity\Household\PersonHouseholdAddress;
|
use Chill\PersonBundle\Entity\Household\PersonHouseholdAddress;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
@@ -68,7 +69,10 @@ class GeographicalUnitStatFilter implements FilterInterface
|
|||||||
'acp_geog_filter_date',
|
'acp_geog_filter_date',
|
||||||
$this->rollingDateConverter->convert($data['date_calc'])
|
$this->rollingDateConverter->convert($data['date_calc'])
|
||||||
)
|
)
|
||||||
->setParameter('acp_geog_filter_units', array_map(static fn (SimpleGeographicalUnitDTO $unitDTO) => $unitDTO->id, $data['units']));
|
->setParameter('acp_geog_filter_units', array_map(
|
||||||
|
static fn (SimpleGeographicalUnitDTO $unitDTO) => $unitDTO->id,
|
||||||
|
$data['units'] instanceof Collection ? $data['units']->toArray() : $data['units']
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function applyOn(): string
|
public function applyOn(): string
|
||||||
|
@@ -16,6 +16,7 @@ use Chill\PersonBundle\Export\Declarations;
|
|||||||
use Chill\ThirdPartyBundle\Entity\ThirdParty;
|
use Chill\ThirdPartyBundle\Entity\ThirdParty;
|
||||||
use Chill\ThirdPartyBundle\Form\Type\PickThirdpartyDynamicType;
|
use Chill\ThirdPartyBundle\Form\Type\PickThirdpartyDynamicType;
|
||||||
use Chill\ThirdPartyBundle\Templating\Entity\ThirdPartyRender;
|
use Chill\ThirdPartyBundle\Templating\Entity\ThirdPartyRender;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
@@ -52,7 +53,10 @@ final readonly class HandlingThirdPartyFilter implements FilterInterface
|
|||||||
[
|
[
|
||||||
'%3parties%' => implode(
|
'%3parties%' => implode(
|
||||||
', ',
|
', ',
|
||||||
array_map(fn (ThirdParty $thirdParty) => $this->thirdPartyRender->renderString($thirdParty, []), $data['handling_3parties'])
|
array_map(
|
||||||
|
fn (ThirdParty $thirdParty) => $this->thirdPartyRender->renderString($thirdParty, []),
|
||||||
|
$data['handling_3parties'] instanceof Collection ? $data['handling_3parties']->toArray() : $data['handling_3parties']
|
||||||
|
)
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
@@ -21,6 +21,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
|||||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodInfo;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodInfo;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
@@ -115,7 +116,7 @@ readonly class JobWorkingOnCourseFilter implements FilterInterface
|
|||||||
', ',
|
', ',
|
||||||
array_map(
|
array_map(
|
||||||
fn (UserJob $userJob) => $this->translatableStringHelper->localize($userJob->getLabel()),
|
fn (UserJob $userJob) => $this->translatableStringHelper->localize($userJob->getLabel()),
|
||||||
$data['jobs']
|
$data['jobs'] instanceof Collection ? $data['jobs']->toArray() : $data['jobs']
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'),
|
'%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'),
|
||||||
|
@@ -21,6 +21,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
|||||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodInfo;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodInfo;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
@@ -110,7 +111,7 @@ readonly class ScopeWorkingOnCourseFilter implements FilterInterface
|
|||||||
', ',
|
', ',
|
||||||
array_map(
|
array_map(
|
||||||
fn (Scope $scope) => $this->translatableStringHelper->localize($scope->getName()),
|
fn (Scope $scope) => $this->translatableStringHelper->localize($scope->getName()),
|
||||||
$data['scopes']
|
$data['scopes'] instanceof Collection ? $data['scopes']->toArray() : $data['scopes']
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'),
|
'%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'),
|
||||||
|
@@ -17,6 +17,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDate;
|
|||||||
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
@@ -98,7 +99,10 @@ class StepFilterBetweenDates implements FilterInterface
|
|||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
$steps = array_map(fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]), $data['accepted_steps_multi']);
|
$steps = array_map(
|
||||||
|
fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]),
|
||||||
|
$data['accepted_steps_multi'] instanceof Collection ? $data['accepted_steps_multi']->toArray() : $data['accepted_steps_multi']
|
||||||
|
);
|
||||||
|
|
||||||
return ['export.filter.course.by_step.Filtered by steps: only %step% and between %date_from% and %date_to%', [
|
return ['export.filter.course.by_step.Filtered by steps: only %step% and between %date_from% and %date_to%', [
|
||||||
'%step%' => implode(', ', $steps),
|
'%step%' => implode(', ', $steps),
|
||||||
|
@@ -17,6 +17,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDate;
|
|||||||
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
@@ -101,7 +102,10 @@ class StepFilterOnDate implements FilterInterface
|
|||||||
|
|
||||||
public function describeAction($data, $format = 'string')
|
public function describeAction($data, $format = 'string')
|
||||||
{
|
{
|
||||||
$steps = array_map(fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]), $data['accepted_steps_multi']);
|
$steps = array_map(
|
||||||
|
fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]),
|
||||||
|
$data['accepted_steps_multi'] instanceof Collection ? $data['accepted_steps_multi']->toArray() : $data['accepted_steps_multi']
|
||||||
|
);
|
||||||
|
|
||||||
return ['Filtered by steps: only %step%', [
|
return ['Filtered by steps: only %step%', [
|
||||||
'%step%' => implode(', ', $steps),
|
'%step%' => implode(', ', $steps),
|
||||||
|
@@ -20,6 +20,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
|||||||
use Chill\MainBundle\Templating\Entity\UserRender;
|
use Chill\MainBundle\Templating\Entity\UserRender;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
@@ -72,7 +73,7 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface
|
|||||||
', ',
|
', ',
|
||||||
array_map(
|
array_map(
|
||||||
fn (User $u) => $this->userRender->renderString($u, []),
|
fn (User $u) => $this->userRender->renderString($u, []),
|
||||||
$data['users']
|
$data['users'] instanceof Collection ? $data['users']->toArray() : $data['users']
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
'%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'),
|
'%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'),
|
||||||
|
@@ -21,6 +21,7 @@ use Chill\PersonBundle\Entity\Household\HouseholdCompositionType;
|
|||||||
use Chill\PersonBundle\Entity\Household\HouseholdMember;
|
use Chill\PersonBundle\Entity\Household\HouseholdMember;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
use Chill\PersonBundle\Repository\Household\HouseholdCompositionTypeRepositoryInterface;
|
use Chill\PersonBundle\Repository\Household\HouseholdCompositionTypeRepositoryInterface;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||||
@@ -84,7 +85,7 @@ class ByHouseholdCompositionFilter implements FilterInterface
|
|||||||
{
|
{
|
||||||
$compos = array_map(
|
$compos = array_map(
|
||||||
fn (HouseholdCompositionType $compositionType) => $this->translatableStringHelper->localize($compositionType->getLabel()),
|
fn (HouseholdCompositionType $compositionType) => $this->translatableStringHelper->localize($compositionType->getLabel()),
|
||||||
$data['compositions']->toArray()
|
$data['compositions'] instanceof Collection ? $data['compositions']->toArray() : $data['compositions']
|
||||||
);
|
);
|
||||||
|
|
||||||
return ['export.filter.person.by_composition.Filtered by composition at %date%: only %compositions%', [
|
return ['export.filter.person.by_composition.Filtered by composition at %date%: only %compositions%', [
|
||||||
|
@@ -77,6 +77,7 @@ class GenderFilter implements
|
|||||||
'Woman' => Person::FEMALE_GENDER,
|
'Woman' => Person::FEMALE_GENDER,
|
||||||
'Man' => Person::MALE_GENDER,
|
'Man' => Person::MALE_GENDER,
|
||||||
'Both' => Person::BOTH_GENDER,
|
'Both' => Person::BOTH_GENDER,
|
||||||
|
'Unknown' => Person::NO_INFORMATION,
|
||||||
'Not given' => 'null',
|
'Not given' => 'null',
|
||||||
],
|
],
|
||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
|
@@ -20,6 +20,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
|
|||||||
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
use Chill\PersonBundle\Entity\Household\PersonHouseholdAddress;
|
use Chill\PersonBundle\Entity\Household\PersonHouseholdAddress;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
@@ -102,7 +103,7 @@ class GeographicalUnitFilter implements \Chill\MainBundle\Export\FilterInterface
|
|||||||
', ',
|
', ',
|
||||||
array_map(
|
array_map(
|
||||||
fn (SimpleGeographicalUnitDTO $item) => $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()).' > '.$item->unitName,
|
fn (SimpleGeographicalUnitDTO $item) => $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()).' > '.$item->unitName,
|
||||||
$data['units']
|
$data['units'] instanceof Collection ? $data['units']->toArray() : $data['units']
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\User;
|
|||||||
use Chill\MainBundle\Export\FilterInterface;
|
use Chill\MainBundle\Export\FilterInterface;
|
||||||
use Chill\MainBundle\Form\Type\PickUserDynamicType;
|
use Chill\MainBundle\Form\Type\PickUserDynamicType;
|
||||||
use Chill\PersonBundle\Export\Declarations;
|
use Chill\PersonBundle\Export\Declarations;
|
||||||
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
@@ -55,7 +56,13 @@ class CreatorFilter implements FilterInterface
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'export.filter.work.by_creator.Filtered by creator: only %creators%', [
|
'export.filter.work.by_creator.Filtered by creator: only %creators%', [
|
||||||
'%creators%' => implode(', ', array_map(static fn (User $u) => $u->getLabel(), $data['creators'])),
|
'%creators%' => implode(
|
||||||
|
', ',
|
||||||
|
array_map(
|
||||||
|
static fn (User $u) => $u->getLabel(),
|
||||||
|
$data['creators'] instanceof Collection ? $data['creators']->toArray() : $data['creators']
|
||||||
|
)
|
||||||
|
),
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<teleport to="#export_filters_social_work_type_filter_form">
|
<teleport to="#export_filters_social_work_type_filter_form">
|
||||||
|
|
||||||
<fieldset class="mb-3" id="actionType">
|
<fieldset class="mb-3" id="actionType">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<legend class="col-sm-4 col-form-label">{{ $t('action.label')}}</legend>
|
<legend class="col-sm-4 col-form-label">{{ $t('action.label')}}</legend>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
|
||||||
<VueMultiselect
|
<VueMultiselect
|
||||||
v-model="action"
|
v-model="action"
|
||||||
:options="actions.options"
|
:options="actions.options"
|
||||||
@@ -18,16 +18,16 @@
|
|||||||
track-by="id"
|
track-by="id"
|
||||||
:searchable="true"
|
:searchable="true"
|
||||||
></VueMultiselect>
|
></VueMultiselect>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset class="mb-3" id="goal">
|
<fieldset class="mb-3" id="goal">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<legend class="col-sm-4 col-form-label">{{ $t('goal.label')}}</legend>
|
<legend class="col-sm-4 col-form-label">{{ $t('goal.label')}}</legend>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
|
||||||
<VueMultiselect
|
<VueMultiselect
|
||||||
v-model="goal"
|
v-model="goal"
|
||||||
:options="goals.options"
|
:options="goals.options"
|
||||||
@@ -41,16 +41,16 @@
|
|||||||
track-by="id"
|
track-by="id"
|
||||||
:searchable="true"
|
:searchable="true"
|
||||||
></VueMultiselect>
|
></VueMultiselect>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset class="mb-3" id="result">
|
<fieldset class="mb-3" id="result">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<legend class="col-sm-4 col-form-label">{{ $t('result.label')}}</legend>
|
<legend class="col-sm-4 col-form-label">{{ $t('result.label')}}</legend>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
|
|
||||||
<VueMultiselect
|
<VueMultiselect
|
||||||
v-model="result"
|
v-model="result"
|
||||||
:options="results.options"
|
:options="results.options"
|
||||||
@@ -64,11 +64,11 @@
|
|||||||
track-by="id"
|
track-by="id"
|
||||||
:searchable="true"
|
:searchable="true"
|
||||||
></VueMultiselect>
|
></VueMultiselect>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
</teleport>
|
</teleport>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -152,18 +152,18 @@ export default {
|
|||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.getSocialActionsList();
|
this.getSocialActionsList();
|
||||||
|
|
||||||
this.actions.hiddenField.value = '';
|
this.actions.hiddenField.value = '';
|
||||||
this.goals.hiddenField.value = '';
|
this.goals.hiddenField.value = '';
|
||||||
this.results.hiddenField.value = '';
|
this.results.hiddenField.value = '';
|
||||||
|
|
||||||
//console.log(this.actions.hiddenField, this.goals.hiddenField, this.results.hiddenField);
|
//console.log(this.actions.hiddenField, this.goals.hiddenField, this.results.hiddenField);
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async getSocialActionsList() {
|
async getSocialActionsList() {
|
||||||
this.actions.options = await getSocialActions();
|
this.actions.options = await getSocialActions();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select/unselect in Action Multiselect
|
* Select/unselect in Action Multiselect
|
||||||
* @param value
|
* @param value
|
||||||
@@ -172,7 +172,7 @@ export default {
|
|||||||
//console.log('----'); console.log('select action', value.id);
|
//console.log('----'); console.log('select action', value.id);
|
||||||
let children = this.getChildrensFromParent(value);
|
let children = this.getChildrensFromParent(value);
|
||||||
this.addSelectedElement('actions', children);
|
this.addSelectedElement('actions', children);
|
||||||
|
|
||||||
let parentAndChildren = [...[value], ...children];
|
let parentAndChildren = [...[value], ...children];
|
||||||
parentAndChildren.forEach(elem => {
|
parentAndChildren.forEach(elem => {
|
||||||
getGoalByAction(elem.id).then(response => new Promise((resolve, reject) => {
|
getGoalByAction(elem.id).then(response => new Promise((resolve, reject) => {
|
||||||
@@ -185,7 +185,7 @@ export default {
|
|||||||
})).catch;
|
})).catch;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
unselectAction(value) {
|
unselectAction(value) {
|
||||||
//console.log('----'); console.log('unselect action', value.id);
|
//console.log('----'); console.log('unselect action', value.id);
|
||||||
getGoalByAction(value.id).then(response => new Promise((resolve, reject) => {
|
getGoalByAction(value.id).then(response => new Promise((resolve, reject) => {
|
||||||
@@ -197,7 +197,7 @@ export default {
|
|||||||
resolve();
|
resolve();
|
||||||
})).catch;
|
})).catch;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select/unselect in Goal Multiselect
|
* Select/unselect in Goal Multiselect
|
||||||
* @param value
|
* @param value
|
||||||
@@ -209,7 +209,7 @@ export default {
|
|||||||
resolve();
|
resolve();
|
||||||
})).catch;
|
})).catch;
|
||||||
},
|
},
|
||||||
|
|
||||||
unselectGoal(value) {
|
unselectGoal(value) {
|
||||||
//console.log('----'); console.log('unselect goal', value.id);
|
//console.log('----'); console.log('unselect goal', value.id);
|
||||||
getResultByGoal(value.id).then(response => new Promise((resolve, reject) => {
|
getResultByGoal(value.id).then(response => new Promise((resolve, reject) => {
|
||||||
@@ -217,7 +217,7 @@ export default {
|
|||||||
resolve();
|
resolve();
|
||||||
})).catch;
|
})).catch;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Select/unselect in Result Multiselect
|
* Select/unselect in Result Multiselect
|
||||||
* @param value
|
* @param value
|
||||||
@@ -225,11 +225,11 @@ export default {
|
|||||||
selectResult(value) {
|
selectResult(value) {
|
||||||
//console.log('----'); console.log('select result', value.id);
|
//console.log('----'); console.log('select result', value.id);
|
||||||
},
|
},
|
||||||
|
|
||||||
unselectResult(value) {
|
unselectResult(value) {
|
||||||
//console.log('----'); console.log('unselect result', value.id);
|
//console.log('----'); console.log('unselect result', value.id);
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Choose parent action will involve retaining the "children" actions.
|
* Choose parent action will involve retaining the "children" actions.
|
||||||
* @param value
|
* @param value
|
||||||
@@ -244,7 +244,7 @@ export default {
|
|||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add response elements in data target
|
* Add response elements in data target
|
||||||
* @param target string -> 'actions', 'goals' or 'results'
|
* @param target string -> 'actions', 'goals' or 'results'
|
||||||
@@ -264,7 +264,7 @@ export default {
|
|||||||
//console.log('push ' + dump.length + ' elems in', target, dump);
|
//console.log('push ' + dump.length + ' elems in', target, dump);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove response elements from data target
|
* Remove response elements from data target
|
||||||
* @param target string -> 'actions', 'goals' or 'results'
|
* @param target string -> 'actions', 'goals' or 'results'
|
||||||
@@ -279,7 +279,7 @@ export default {
|
|||||||
if (found) {
|
if (found) {
|
||||||
data.options = data.options.filter(e => e.id !== elem.id);
|
data.options = data.options.filter(e => e.id !== elem.id);
|
||||||
dump.push(elem.id);
|
dump.push(elem.id);
|
||||||
|
|
||||||
this.removeSelectedElement(target, elem);
|
this.removeSelectedElement(target, elem);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -288,7 +288,7 @@ export default {
|
|||||||
}
|
}
|
||||||
return [ data.options, data.value ];
|
return [ data.options, data.value ];
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param target
|
* @param target
|
||||||
@@ -300,10 +300,10 @@ export default {
|
|||||||
elements.forEach(elem => {
|
elements.forEach(elem => {
|
||||||
let selected = data.value.some(e => e.id === elem.id);
|
let selected = data.value.some(e => e.id === elem.id);
|
||||||
if (!selected) {
|
if (!selected) {
|
||||||
|
|
||||||
data.value.push(elem);
|
data.value.push(elem);
|
||||||
dump.push(elem.id);
|
dump.push(elem.id);
|
||||||
|
|
||||||
// add in hiddenField
|
// add in hiddenField
|
||||||
this.rebuildHiddenFieldValues(target);
|
this.rebuildHiddenFieldValues(target);
|
||||||
}
|
}
|
||||||
@@ -312,7 +312,7 @@ export default {
|
|||||||
//console.log('add ' + dump.length + ' selected elems in', target, dump);
|
//console.log('add ' + dump.length + ' selected elems in', target, dump);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove element from selected and from hiddenField
|
* Remove element from selected and from hiddenField
|
||||||
* @param target
|
* @param target
|
||||||
@@ -322,19 +322,19 @@ export default {
|
|||||||
let data = this[target];
|
let data = this[target];
|
||||||
let selected = data.value.some(e => e.id === elem.id);
|
let selected = data.value.some(e => e.id === elem.id);
|
||||||
if (selected) {
|
if (selected) {
|
||||||
|
|
||||||
// remove from selected
|
// remove from selected
|
||||||
data.value = data.value.filter(e => e.id !== elem.id);
|
data.value = data.value.filter(e => e.id !== elem.id);
|
||||||
//console.log('remove ' + elem.id + ' from selected ' + target);
|
//console.log('remove ' + elem.id + ' from selected ' + target);
|
||||||
|
|
||||||
// remove from hiddenField
|
// remove from hiddenField
|
||||||
this.rebuildHiddenFieldValues(target);
|
this.rebuildHiddenFieldValues(target);
|
||||||
|
|
||||||
// in any cases, remove should be recursive
|
// in any cases, remove should be recursive
|
||||||
this.unselectToNextField(target, elem);
|
this.unselectToNextField(target, elem);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When unselect Action, it could remove elements in goals multiselect.
|
* When unselect Action, it could remove elements in goals multiselect.
|
||||||
* In that case, we have to unselect Goal to remove elements in results too.
|
* In that case, we have to unselect Goal to remove elements in results too.
|
||||||
@@ -348,7 +348,7 @@ export default {
|
|||||||
//console.log('!!!! done');
|
//console.log('!!!! done');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rebuild values serie (string) in target HiddenField
|
* Rebuild values serie (string) in target HiddenField
|
||||||
* @param target
|
* @param target
|
||||||
@@ -362,14 +362,14 @@ export default {
|
|||||||
})
|
})
|
||||||
//console.log(data.hiddenField);
|
//console.log(data.hiddenField);
|
||||||
},
|
},
|
||||||
|
|
||||||
addIdToValue(string, id) {
|
addIdToValue(string, id) {
|
||||||
let array = string ? string.split(',') : [];
|
let array = string ? string.split(',') : [];
|
||||||
array.push(id.toString());
|
array.push(id.toString());
|
||||||
let str = array.join();
|
let str = array.join();
|
||||||
return str;
|
return str;
|
||||||
},
|
},
|
||||||
|
|
||||||
transTitle ({ title }) {
|
transTitle ({ title }) {
|
||||||
return title.fr //TODO multilang
|
return title.fr //TODO multilang
|
||||||
},
|
},
|
||||||
@@ -378,4 +378,4 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
</style>
|
</style>
|
||||||
|
@@ -2,12 +2,13 @@ import { createApp } from "vue";
|
|||||||
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n';
|
import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n';
|
||||||
import App from './App.vue';
|
import App from './App.vue';
|
||||||
|
|
||||||
const i18n = _createI18n({});
|
if (null !== document.getElementById('export_filters_social_work_type_filter_enabled')) {
|
||||||
|
const i18n = _createI18n({});
|
||||||
|
|
||||||
const app = createApp({
|
const app = createApp({
|
||||||
template: `<app></app>`,
|
template: `<app></app>`,
|
||||||
})
|
})
|
||||||
.use(i18n)
|
.use(i18n)
|
||||||
.component('app', App)
|
.component('app', App)
|
||||||
.mount('#export_export')
|
.mount('#export_export');
|
||||||
;
|
}
|
||||||
|
@@ -12,7 +12,7 @@ const visMessages = {
|
|||||||
Holder: 'Titulaire',
|
Holder: 'Titulaire',
|
||||||
Legend: 'Calques',
|
Legend: 'Calques',
|
||||||
concerned: 'concerné',
|
concerned: 'concerné',
|
||||||
both: 'neutre, non binaire',
|
// both: 'neutre, non binaire',
|
||||||
woman: 'féminin',
|
woman: 'féminin',
|
||||||
man: 'masculin',
|
man: 'masculin',
|
||||||
undefined: "genre non précisé",
|
undefined: "genre non précisé",
|
||||||
@@ -64,8 +64,9 @@ const visMessages = {
|
|||||||
placeholder: "Choisissez le genre de l'usager",
|
placeholder: "Choisissez le genre de l'usager",
|
||||||
woman: "Féminin",
|
woman: "Féminin",
|
||||||
man: "Masculin",
|
man: "Masculin",
|
||||||
neuter: "Neutre, non binaire",
|
both: "Neutre, non binaire",
|
||||||
undefined: "Non renseigné"
|
undefined: "Non renseigné",
|
||||||
|
unknown: "Non renseigné"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error_only_one_person: "Une seule personne peut être sélectionnée !",
|
error_only_one_person: "Une seule personne peut être sélectionnée !",
|
||||||
|
@@ -153,6 +153,8 @@ const getGender = (gender) => {
|
|||||||
return visMessages.fr.visgraph.woman
|
return visMessages.fr.visgraph.woman
|
||||||
case 'man':
|
case 'man':
|
||||||
return visMessages.fr.visgraph.man
|
return visMessages.fr.visgraph.man
|
||||||
|
case 'unknown':
|
||||||
|
return visMessages.fr.visgraph.unknown
|
||||||
default:
|
default:
|
||||||
return visMessages.fr.visgraph.undefined
|
return visMessages.fr.visgraph.undefined
|
||||||
}
|
}
|
||||||
|
@@ -81,7 +81,7 @@
|
|||||||
<li v-else-if="options.addNoData">
|
<li v-else-if="options.addNoData">
|
||||||
<i class="fa fa-li fa-map-marker"></i><p class="chill-no-data-statement">{{ $t('renderbox.no_data') }}</p>
|
<i class="fa fa-li fa-map-marker"></i><p class="chill-no-data-statement">{{ $t('renderbox.no_data') }}</p>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<template v-if="this.showResidentialAddresses && (person.current_residential_addresses || []).length > 0">
|
<template v-if="this.showResidentialAddresses && (person.current_residential_addresses || []).length > 0">
|
||||||
<li v-for="(addr, i) in person.current_residential_addresses" :key="i">
|
<li v-for="(addr, i) in person.current_residential_addresses" :key="i">
|
||||||
<i class="fa fa-li fa-map-marker"></i>
|
<i class="fa fa-li fa-map-marker"></i>
|
||||||
@@ -223,13 +223,13 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
getGenderIcon: function () {
|
getGenderIcon: function () {
|
||||||
return this.person.gender === 'woman' ? 'fa-venus' : this.person.gender === 'man' ? 'fa-mars' : this.person.gender === 'neuter' ? 'fa-neuter' : 'fa-genderless';
|
return this.person.gender === 'woman' ? 'fa-venus' : this.person.gender === 'man' ? 'fa-mars' : this.person.gender === 'both' ? 'fa-neuter' : 'fa-genderless';
|
||||||
},
|
},
|
||||||
getGenderTranslation: function () {
|
getGenderTranslation: function () {
|
||||||
return this.person.gender === 'woman' ? 'renderbox.birthday.woman' : 'renderbox.birthday.man';
|
return this.person.gender === 'woman' ? 'renderbox.birthday.woman' : 'renderbox.birthday.man';
|
||||||
},
|
},
|
||||||
getGender() {
|
getGender() {
|
||||||
return this.person.gender === 'woman' ? 'person.gender.woman' : this.person.gender === 'man' ? 'person.gender.man' : this.person.gender === 'neuter' ? 'person.gender.neuter' : 'person.gender.undefined';
|
return this.person.gender === 'woman' ? 'person.gender.woman' : this.person.gender === 'man' ? 'person.gender.man' : this.person.gender === 'both' ? 'person.gender.both' : 'person.gender.undefined';
|
||||||
},
|
},
|
||||||
birthdate: function () {
|
birthdate: function () {
|
||||||
if (this.person.birthdate !== null || this.person.birthdate === "undefined") {
|
if (this.person.birthdate !== null || this.person.birthdate === "undefined") {
|
||||||
|
@@ -82,7 +82,7 @@
|
|||||||
<option selected disabled >{{ $t('person.gender.placeholder') }}</option>
|
<option selected disabled >{{ $t('person.gender.placeholder') }}</option>
|
||||||
<option value="woman">{{ $t('person.gender.woman') }}</option>
|
<option value="woman">{{ $t('person.gender.woman') }}</option>
|
||||||
<option value="man">{{ $t('person.gender.man') }}</option>
|
<option value="man">{{ $t('person.gender.man') }}</option>
|
||||||
<option value="neuter">{{ $t('person.gender.neuter') }}</option>
|
<option value="both">{{ $t('person.gender.both') }}</option>
|
||||||
</select>
|
</select>
|
||||||
<label>{{ $t('person.gender.title') }}</label>
|
<label>{{ $t('person.gender.title') }}</label>
|
||||||
</div>
|
</div>
|
||||||
@@ -291,8 +291,12 @@ export default {
|
|||||||
return 'fa-venus';
|
return 'fa-venus';
|
||||||
case 'man':
|
case 'man':
|
||||||
return 'fa-mars';
|
return 'fa-mars';
|
||||||
case 'neuter':
|
case 'both':
|
||||||
return 'fa-neuter';
|
return 'fa-neuter';
|
||||||
|
case 'unknown':
|
||||||
|
return 'fa-genderless';
|
||||||
|
default:
|
||||||
|
return 'fa-genderless';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
genderTranslation() {
|
genderTranslation() {
|
||||||
@@ -301,8 +305,12 @@ export default {
|
|||||||
return 'person.gender.woman';
|
return 'person.gender.woman';
|
||||||
case 'man':
|
case 'man':
|
||||||
return 'person.gender.man';
|
return 'person.gender.man';
|
||||||
case 'neuter':
|
case 'both':
|
||||||
return 'person.gender.neuter';
|
return 'person.gender.both';
|
||||||
|
case 'unknown':
|
||||||
|
return 'person.gender.unknown';
|
||||||
|
default:
|
||||||
|
return 'person.gender.unknown';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
feminized() {
|
feminized() {
|
||||||
|
@@ -36,7 +36,8 @@ const personMessages = {
|
|||||||
placeholder: "Choisissez le genre de l'usager",
|
placeholder: "Choisissez le genre de l'usager",
|
||||||
woman: "Féminin",
|
woman: "Féminin",
|
||||||
man: "Masculin",
|
man: "Masculin",
|
||||||
neuter: "Neutre, non binaire",
|
both: "Neutre, non binaire",
|
||||||
|
unknown: "Non renseigné",
|
||||||
undefined: "Non renseigné"
|
undefined: "Non renseigné"
|
||||||
},
|
},
|
||||||
civility: {
|
civility: {
|
||||||
|
@@ -86,9 +86,9 @@
|
|||||||
</div>
|
</div>
|
||||||
{%- if options['addInfo'] -%}
|
{%- if options['addInfo'] -%}
|
||||||
{% set gender = (person.gender == 'woman') ? 'fa-venus' :
|
{% set gender = (person.gender == 'woman') ? 'fa-venus' :
|
||||||
(person.gender == 'man') ? 'fa-mars' : (person.gender == 'neuter') ? 'fa-neuter' : 'fa-genderless' %}
|
(person.gender == 'man') ? 'fa-mars' : (person.gender == 'both') ? 'fa-neuter' : 'fa-genderless' %}
|
||||||
{% set genderTitle = (person.gender == 'woman') ? 'woman' :
|
{% set genderTitle = (person.gender == 'woman') ? 'woman' :
|
||||||
(person.gender == 'man') ? 'man' : (person.gender == 'neuter') ? 'neuter' : 'Not given'|trans %}
|
(person.gender == 'man') ? 'man' : (person.gender == 'both') ? 'both' : 'Not given'|trans %}
|
||||||
<p class="moreinfo">
|
<p class="moreinfo">
|
||||||
<i class="fa fa-fw {{ gender }}" title="{{ genderTitle|trans }}"></i>
|
<i class="fa fa-fw {{ gender }}" title="{{ genderTitle|trans }}"></i>
|
||||||
|
|
||||||
|
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Chill is a software for social workers
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view
|
||||||
|
* the LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\Migrations\Person;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change gender instances of 'neuter' to 'both'.
|
||||||
|
*/
|
||||||
|
final class Version20231121070151 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return 'Change gender instances of "neuter" to "both"';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
$this->addSql("UPDATE chill_person_person SET gender = 'both' WHERE chill_person_person.gender = 'neuter'");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void {}
|
||||||
|
}
|
@@ -61,10 +61,10 @@ Spoken languages': 'Langues parlées'
|
|||||||
'Unknown spoken languages': 'Langues parlées inconnues'
|
'Unknown spoken languages': 'Langues parlées inconnues'
|
||||||
Male: Homme
|
Male: Homme
|
||||||
Female: Femme
|
Female: Femme
|
||||||
Neuter: Neutre
|
#Both: Neutre
|
||||||
man: Homme
|
man: Homme
|
||||||
woman: Femme
|
woman: Femme
|
||||||
neuter: Neutre
|
#both: Neutre
|
||||||
Man: Homme
|
Man: Homme
|
||||||
Woman: Femme
|
Woman: Femme
|
||||||
both: Indéterminé
|
both: Indéterminé
|
||||||
|
@@ -61,14 +61,14 @@ Remove phone: Verwijderen
|
|||||||
'Unknown spoken languages': 'Gesproken talen ongekend'
|
'Unknown spoken languages': 'Gesproken talen ongekend'
|
||||||
Male: Man
|
Male: Man
|
||||||
Female: Vrouw
|
Female: Vrouw
|
||||||
Neuter: Non-binair
|
Both: Non-binair
|
||||||
man: Man
|
man: Man
|
||||||
woman: Vrouw
|
woman: Vrouw
|
||||||
neuter: Non-binair
|
both: Non-binair
|
||||||
Man: Man
|
Man: Man
|
||||||
Woman: Vrouw
|
Woman: Vrouw
|
||||||
both: Onbepaald
|
#both: Onbepaald
|
||||||
Both: Onbepaald
|
#Both: Onbepaald
|
||||||
Divorced: Gescheiden
|
Divorced: Gescheiden
|
||||||
Separated: Uit elkaar
|
Separated: Uit elkaar
|
||||||
Widow: Weduwe/weduwnaar
|
Widow: Weduwe/weduwnaar
|
||||||
|
Reference in New Issue
Block a user