mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-09-25 16:14:59 +00:00
Merge branch 'master' of https://gitlab.com/Chill-Projet/chill-bundles into chill_amli
This commit is contained in:
@@ -20,6 +20,7 @@ use Chill\MainBundle\Notification\Exception\NotificationHandlerNotFound;
|
||||
use Chill\MainBundle\Notification\NotificationHandlerManager;
|
||||
use Chill\MainBundle\Pagination\PaginatorFactory;
|
||||
use Chill\MainBundle\Repository\NotificationRepository;
|
||||
use Chill\MainBundle\Repository\UserRepository;
|
||||
use Chill\MainBundle\Security\Authorization\NotificationVoter;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Psr\Log\LoggerInterface;
|
||||
@@ -29,6 +30,7 @@ use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
|
||||
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Symfony\Component\Security\Core\Security;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
@@ -55,6 +57,8 @@ class NotificationController extends AbstractController
|
||||
|
||||
private TranslatorInterface $translator;
|
||||
|
||||
private UserRepository $userRepository;
|
||||
|
||||
public function __construct(
|
||||
EntityManagerInterface $em,
|
||||
LoggerInterface $chillLogger,
|
||||
@@ -63,7 +67,8 @@ class NotificationController extends AbstractController
|
||||
NotificationRepository $notificationRepository,
|
||||
NotificationHandlerManager $notificationHandlerManager,
|
||||
PaginatorFactory $paginatorFactory,
|
||||
TranslatorInterface $translator
|
||||
TranslatorInterface $translator,
|
||||
UserRepository $userRepository
|
||||
) {
|
||||
$this->em = $em;
|
||||
$this->logger = $logger;
|
||||
@@ -73,6 +78,7 @@ class NotificationController extends AbstractController
|
||||
$this->notificationHandlerManager = $notificationHandlerManager;
|
||||
$this->paginatorFactory = $paginatorFactory;
|
||||
$this->translator = $translator;
|
||||
$this->userRepository = $userRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -100,6 +106,15 @@ class NotificationController extends AbstractController
|
||||
->setRelatedEntityId($request->query->getInt('entityId'))
|
||||
->setSender($this->security->getUser());
|
||||
|
||||
if ($request->query->has('tos')) {
|
||||
foreach ($request->query->get('tos') as $toId) {
|
||||
if (null === $to = $this->userRepository->find($toId)) {
|
||||
throw new NotFoundHttpException("user with id {$toId} is not found");
|
||||
}
|
||||
$notification->addAddressee($to);
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
$handler = $this->notificationHandlerManager->getHandler($notification);
|
||||
} catch (NotificationHandlerNotFound $e) {
|
||||
|
@@ -23,6 +23,7 @@ use Chill\MainBundle\Repository\UserRepository;
|
||||
use Chill\MainBundle\Templating\Listing\FilterOrderHelper;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use RuntimeException;
|
||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
|
||||
use Symfony\Component\Form\Form;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
@@ -37,6 +38,8 @@ class UserController extends CRUDController
|
||||
{
|
||||
public const FORM_GROUP_CENTER_COMPOSED = 'composed_groupcenter';
|
||||
|
||||
protected ParameterBagInterface $parameterBag;
|
||||
|
||||
private LoggerInterface $logger;
|
||||
|
||||
private UserPasswordEncoderInterface $passwordEncoder;
|
||||
@@ -49,12 +52,14 @@ class UserController extends CRUDController
|
||||
LoggerInterface $chillLogger,
|
||||
ValidatorInterface $validator,
|
||||
UserPasswordEncoderInterface $passwordEncoder,
|
||||
UserRepository $userRepository
|
||||
UserRepository $userRepository,
|
||||
ParameterBagInterface $parameterBag
|
||||
) {
|
||||
$this->logger = $chillLogger;
|
||||
$this->userRepository = $userRepository;
|
||||
$this->validator = $validator;
|
||||
$this->passwordEncoder = $passwordEncoder;
|
||||
$this->parameterBag = $parameterBag;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -104,6 +109,7 @@ class UserController extends CRUDController
|
||||
|
||||
return $this->render('@ChillMain/User/edit.html.twig', [
|
||||
'entity' => $user,
|
||||
'access_permissions_group_list' => $this->parameterBag->get('chill_main.access_permissions_group_list'),
|
||||
'edit_form' => $this->createEditForm($user)->createView(),
|
||||
'add_groupcenter_form' => $this->createAddLinkGroupCenterForm($user, $request)->createView(),
|
||||
'delete_groupcenter_form' => array_map(
|
||||
@@ -153,6 +159,73 @@ class UserController extends CRUDController
|
||||
return $this->redirect($this->generateUrl('chill_crud_admin_user_edit', ['id' => $uid]));
|
||||
}
|
||||
|
||||
public function edit(Request $request, $id): Response
|
||||
{
|
||||
$action = 'edit';
|
||||
$entity = $this->getEntity($action, $id, $request);
|
||||
|
||||
if (null === $entity) {
|
||||
throw $this->createNotFoundException(
|
||||
sprintf(
|
||||
'The %s with id %s is not found',
|
||||
$this->getCrudName(),
|
||||
$id
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$response = $this->checkACL($action, $entity);
|
||||
|
||||
if ($response instanceof Response) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
$response = $this->onPostCheckACL($action, $request, $entity);
|
||||
|
||||
if ($response instanceof Response) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
$form = $this->createFormFor($action, $entity);
|
||||
|
||||
$form->handleRequest($request);
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$this->onFormValid($action, $entity, $form, $request);
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
|
||||
$this->onPreFlush($action, $entity, $form, $request);
|
||||
$em->flush();
|
||||
$this->onPostFlush($action, $entity, $form, $request);
|
||||
|
||||
$this->addFlash('success', $this->generateFormSuccessMessage($action, $entity));
|
||||
|
||||
$result = $this->onBeforeRedirectAfterSubmission($action, $entity, $form, $request);
|
||||
|
||||
if ($result instanceof Response) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
return $this->redirectToRoute('chill_crud_' . $this->getCrudName() . '_index');
|
||||
}
|
||||
|
||||
if ($form->isSubmitted()) {
|
||||
$this->addFlash('error', $this->generateFormErrorMessage($action, $form));
|
||||
}
|
||||
|
||||
$defaultTemplateParameters = [
|
||||
'form' => $form->createView(),
|
||||
'entity' => $entity,
|
||||
'crud_name' => $this->getCrudName(),
|
||||
'access_permissions_group_list' => $this->parameterBag->get('chill_main.access_permissions_group_list'),
|
||||
];
|
||||
|
||||
return $this->render(
|
||||
$this->getTemplateFor($action, $entity, $request),
|
||||
$this->generateTemplateParameter($action, $entity, $request, $defaultTemplateParameters)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a form to edit the user current location.
|
||||
*
|
||||
@@ -271,6 +344,11 @@ class UserController extends CRUDController
|
||||
),
|
||||
]
|
||||
);
|
||||
} elseif ('index' === $action) {
|
||||
return array_merge(
|
||||
['allow_change_password' => $this->parameterBag->get('chill_main.access_user_change_password')],
|
||||
$defaultTemplateParameters
|
||||
);
|
||||
}
|
||||
|
||||
// default behaviour
|
||||
@@ -307,7 +385,7 @@ class UserController extends CRUDController
|
||||
protected function onPrePersist(string $action, $entity, FormInterface $form, Request $request)
|
||||
{
|
||||
// for "new", encode the password
|
||||
if ('new' === $action) {
|
||||
if ('new' === $action && $this->parameterBag->get('chill_main.access_user_change_password')) {
|
||||
$entity->setPassword($this->passwordEncoder
|
||||
->encodePassword($entity, $form['plainPassword']->getData()));
|
||||
}
|
||||
|
@@ -129,6 +129,16 @@ class ChillMainExtension extends Extension implements
|
||||
$config['access_global_history']
|
||||
);
|
||||
|
||||
$container->setParameter(
|
||||
'chill_main.access_user_change_password',
|
||||
$config['access_user_change_password']
|
||||
);
|
||||
|
||||
$container->setParameter(
|
||||
'chill_main.access_permissions_group_list',
|
||||
$config['access_permissions_group_list']
|
||||
);
|
||||
|
||||
$container->setParameter(
|
||||
'chill_main.routing.resources',
|
||||
$config['routing']['resources']
|
||||
|
@@ -116,6 +116,12 @@ class Configuration implements ConfigurationInterface
|
||||
->booleanNode('access_global_history')
|
||||
->defaultTrue()
|
||||
->end()
|
||||
->booleanNode('access_user_change_password')
|
||||
->defaultTrue()
|
||||
->end()
|
||||
->booleanNode('access_permissions_group_list')
|
||||
->defaultTrue()
|
||||
->end()
|
||||
->arrayNode('redis')
|
||||
->children()
|
||||
->scalarNode('host')
|
||||
|
@@ -0,0 +1,70 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Entity\Embeddable;
|
||||
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use function array_key_exists;
|
||||
|
||||
/**
|
||||
* @ORM\Embeddable
|
||||
*/
|
||||
class PrivateCommentEmbeddable
|
||||
{
|
||||
/**
|
||||
* @ORM\Column(type="json", nullable=false, options={"default": "{}"})
|
||||
*
|
||||
* @var array<int, string>
|
||||
*/
|
||||
private array $comments = [];
|
||||
|
||||
public function getCommentForUser(User $user): string
|
||||
{
|
||||
return $this->comments[$user->getId()] ?? '';
|
||||
}
|
||||
|
||||
public function getComments(): ?array
|
||||
{
|
||||
return $this->comments;
|
||||
}
|
||||
|
||||
public function hasCommentForUser(User $user): bool
|
||||
{
|
||||
return array_key_exists($user->getId(), $this->comments)
|
||||
&& '' !== $this->comments[$user->getId()];
|
||||
}
|
||||
|
||||
public function merge(PrivateCommentEmbeddable $newComment): self
|
||||
{
|
||||
$currentComments = null === $this->getComments() ? [] : $this->getComments();
|
||||
|
||||
$mergedComments = $newComment->getComments() + $currentComments;
|
||||
|
||||
$this->setComments($mergedComments);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setCommentForUser(User $user, ?string $content): self
|
||||
{
|
||||
$this->comments[$user->getId()] = trim((string) $content);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setComments($comments)
|
||||
{
|
||||
$this->comments = $comments;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
@@ -47,6 +47,11 @@ class User implements AdvancedUserInterface
|
||||
*/
|
||||
private array $attributes = [];
|
||||
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity=Civility::class)
|
||||
*/
|
||||
private ?Civility $civility = null;
|
||||
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity=Location::class)
|
||||
*/
|
||||
@@ -184,6 +189,11 @@ class User implements AdvancedUserInterface
|
||||
return $this->attributes;
|
||||
}
|
||||
|
||||
public function getCivility(): ?Civility
|
||||
{
|
||||
return $this->civility;
|
||||
}
|
||||
|
||||
public function getCurrentLocation(): ?Location
|
||||
{
|
||||
return $this->currentLocation;
|
||||
@@ -363,6 +373,13 @@ class User implements AdvancedUserInterface
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setCivility(?Civility $civility): User
|
||||
{
|
||||
$this->civility = $civility;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setCurrentLocation(?Location $currentLocation): User
|
||||
{
|
||||
$this->currentLocation = $currentLocation;
|
||||
|
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Form\DataMapper;
|
||||
|
||||
use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\DataMapperInterface;
|
||||
use Symfony\Component\Form\Exception\UnexpectedTypeException;
|
||||
use Symfony\Component\Security\Core\Security;
|
||||
|
||||
final class PrivateCommentDataMapper extends AbstractType implements DataMapperInterface
|
||||
{
|
||||
private Security $security;
|
||||
|
||||
public function __construct(Security $security)
|
||||
{
|
||||
$this->security = $security;
|
||||
}
|
||||
|
||||
public function mapDataToForms($viewData, $forms)
|
||||
{
|
||||
if (null === $viewData) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!$viewData instanceof PrivateCommentEmbeddable) {
|
||||
throw new UnexpectedTypeException($viewData, PrivateCommentEmbeddable::class);
|
||||
}
|
||||
|
||||
$forms = iterator_to_array($forms);
|
||||
|
||||
$forms['comments']->setData($viewData->getCommentForUser($this->security->getUser()));
|
||||
}
|
||||
|
||||
public function mapFormsToData($forms, &$viewData)
|
||||
{
|
||||
$forms = iterator_to_array($forms);
|
||||
|
||||
$viewData->setCommentForUser($this->security->getUser(), $forms['comments']->getData());
|
||||
}
|
||||
}
|
62
src/Bundle/ChillMainBundle/Form/Type/PrivateCommentType.php
Normal file
62
src/Bundle/ChillMainBundle/Form/Type/PrivateCommentType.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Form\Type;
|
||||
|
||||
use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable;
|
||||
use Chill\MainBundle\Form\DataMapper\PrivateCommentDataMapper;
|
||||
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Form\FormView;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
|
||||
class PrivateCommentType extends AbstractType
|
||||
{
|
||||
protected PrivateCommentDataMapper $dataMapper;
|
||||
|
||||
protected UserInterface $user;
|
||||
|
||||
public function __construct(TokenStorageInterface $tokenStorage, PrivateCommentDataMapper $dataMapper)
|
||||
{
|
||||
$this->user = $tokenStorage->getToken()->getUser();
|
||||
$this->dataMapper = $dataMapper;
|
||||
}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder
|
||||
->add('comments', ChillTextareaType::class, [
|
||||
'disable_editor' => $options['disable_editor'],
|
||||
'label' => false,
|
||||
])
|
||||
->setDataMapper($this->dataMapper);
|
||||
}
|
||||
|
||||
public function buildView(FormView $view, FormInterface $form, array $options)
|
||||
{
|
||||
$view->vars['hideLabel'] = true;
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver
|
||||
->setDefined('disable_editor')
|
||||
->setAllowedTypes('disable_editor', 'bool')
|
||||
->setDefaults([
|
||||
'data_class' => PrivateCommentEmbeddable::class,
|
||||
'disable_editor' => false,
|
||||
]);
|
||||
}
|
||||
}
|
@@ -43,6 +43,7 @@ class UserCurrentLocationType extends AbstractType
|
||||
},
|
||||
'placeholder' => 'Pick a location',
|
||||
'required' => false,
|
||||
'attr' => ['class' => 'select2'],
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
@@ -15,9 +15,11 @@ use Chill\MainBundle\Entity\Center;
|
||||
use Chill\MainBundle\Entity\Location;
|
||||
use Chill\MainBundle\Entity\Scope;
|
||||
use Chill\MainBundle\Entity\UserJob;
|
||||
use Chill\MainBundle\Form\Type\PickCivilityType;
|
||||
use Chill\MainBundle\Templating\TranslatableStringHelper;
|
||||
use Doctrine\ORM\EntityRepository;
|
||||
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
|
||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
@@ -32,11 +34,16 @@ use Symfony\Component\Validator\Constraints\Regex;
|
||||
|
||||
class UserType extends AbstractType
|
||||
{
|
||||
protected ParameterBagInterface $parameterBag;
|
||||
|
||||
private TranslatableStringHelper $translatableStringHelper;
|
||||
|
||||
public function __construct(TranslatableStringHelper $translatableStringHelper)
|
||||
{
|
||||
public function __construct(
|
||||
TranslatableStringHelper $translatableStringHelper,
|
||||
ParameterBagInterface $parameterBag
|
||||
) {
|
||||
$this->translatableStringHelper = $translatableStringHelper;
|
||||
$this->parameterBag = $parameterBag;
|
||||
}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
@@ -47,6 +54,11 @@ class UserType extends AbstractType
|
||||
'required' => true,
|
||||
])
|
||||
->add('label', TextType::class)
|
||||
->add('civility', PickCivilityType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Civility',
|
||||
'placeholder' => 'choose civility',
|
||||
])
|
||||
->add('mainCenter', EntityType::class, [
|
||||
'label' => 'Main center',
|
||||
'required' => false,
|
||||
@@ -76,6 +88,12 @@ class UserType extends AbstractType
|
||||
'choice_label' => function (UserJob $c) {
|
||||
return $this->translatableStringHelper->localize($c->getLabel());
|
||||
},
|
||||
'query_builder' => static function (EntityRepository $er) {
|
||||
$qb = $er->createQueryBuilder('uj');
|
||||
$qb->where('uj.active = TRUE');
|
||||
|
||||
return $qb;
|
||||
},
|
||||
])
|
||||
->add('mainLocation', EntityType::class, [
|
||||
'label' => 'Main location',
|
||||
@@ -94,7 +112,8 @@ class UserType extends AbstractType
|
||||
},
|
||||
]);
|
||||
|
||||
if ($options['is_creation']) {
|
||||
// @phpstan-ignore-next-line
|
||||
if ($options['is_creation'] && $this->parameterBag->get('chill_main.access_user_change_password')) {
|
||||
$builder->add('plainPassword', RepeatedType::class, [
|
||||
'mapped' => false,
|
||||
'type' => PasswordType::class,
|
||||
|
@@ -109,6 +109,7 @@ class WorkflowStepType extends AbstractType
|
||||
'multiple' => false,
|
||||
'expanded' => true,
|
||||
'choices' => $choices,
|
||||
'constraints' => [new NotNull()],
|
||||
'choice_label' => function (Transition $transition) use ($workflow) {
|
||||
$meta = $workflow->getMetadataStore()->getTransitionMetadata($transition);
|
||||
|
||||
@@ -208,24 +209,28 @@ class WorkflowStepType extends AbstractType
|
||||
$transition = $form['transition']->getData();
|
||||
$toFinal = true;
|
||||
|
||||
foreach ($transition->getTos() as $to) {
|
||||
$meta = $workflow->getMetadataStore()->getPlaceMetadata($to);
|
||||
|
||||
if (
|
||||
!array_key_exists('isFinal', $meta) || false === $meta['isFinal']
|
||||
) {
|
||||
$toFinal = false;
|
||||
}
|
||||
}
|
||||
|
||||
$destUsers = $form['future_dest_users']->getData();
|
||||
$destEmails = $form['future_dest_emails']->getData();
|
||||
|
||||
if (!$toFinal && [] === $destUsers && [] === $destEmails) {
|
||||
if (null === $transition) {
|
||||
$context
|
||||
->buildViolation('workflow.You must add at least one dest user or email')
|
||||
->atPath('future_dest_users')
|
||||
->addViolation();
|
||||
->buildViolation('workflow.You must select a next step, pick another decision if no next steps are available');
|
||||
} else {
|
||||
foreach ($transition->getTos() as $to) {
|
||||
$meta = $workflow->getMetadataStore()->getPlaceMetadata($to);
|
||||
|
||||
if (
|
||||
!array_key_exists('isFinal', $meta) || false === $meta['isFinal']
|
||||
) {
|
||||
$toFinal = false;
|
||||
}
|
||||
}
|
||||
$destUsers = $form['future_dest_users']->getData();
|
||||
$destEmails = $form['future_dest_emails']->getData();
|
||||
|
||||
if (!$toFinal && [] === $destUsers && [] === $destEmails) {
|
||||
$context
|
||||
->buildViolation('workflow.You must add at least one dest user or email')
|
||||
->atPath('future_dest_users')
|
||||
->addViolation();
|
||||
}
|
||||
}
|
||||
}
|
||||
),
|
||||
|
@@ -298,6 +298,10 @@ table.table-bordered {
|
||||
}
|
||||
}
|
||||
|
||||
.private-quote {
|
||||
border-left: 10px solid $pink;
|
||||
}
|
||||
|
||||
/// meta-data
|
||||
div.createdBy,
|
||||
div.updatedBy,
|
||||
|
@@ -121,7 +121,9 @@ export default {
|
||||
this.entity.selected.city = value;
|
||||
this.entity.selected.postcode.name = value.name;
|
||||
this.entity.selected.postcode.code = value.code;
|
||||
this.entity.selected.postcode.coordinates = value.center.coordinates;
|
||||
if (value.center) {
|
||||
this.entity.selected.postcode.coordinates = value.center.coordinates;
|
||||
}
|
||||
this.entity.selected.writeNew.postcode = false;
|
||||
this.$emit('getReferenceAddresses', value);
|
||||
this.focusOnAddress();
|
||||
|
@@ -15,26 +15,69 @@
|
||||
<span v-if="forceRedirect">{{ $t('wait_redirection') }}</span>
|
||||
</div>
|
||||
|
||||
<div v-if="showMessageWhenNoAddress" class="mt-5">
|
||||
<p class="chill-no-data-statement">
|
||||
{{ $t('not_yet_address') }}
|
||||
</p>
|
||||
<div v-if="(!this.context.edit && !this.flag.success && this.context.target.name !== 'household')" class="mt-5">
|
||||
<div class="no-address-yet">
|
||||
<i class="fa fa-map-marker" aria-hidden="true"></i>
|
||||
<p class="chill-no-data-statement">
|
||||
{{ $t('not_yet_address') }}
|
||||
</p>
|
||||
|
||||
<action-buttons
|
||||
:options="this.options"
|
||||
:defaultz="this.defaultz"
|
||||
class="add-address-btn">
|
||||
<template v-slot:action>
|
||||
<button @click.prevent="$emit('openEditPane')"
|
||||
class="btn" :class="getClassButton"
|
||||
type="button" name="button" :title="$t(getTextButton)">
|
||||
<span v-if="displayTextButton">{{ $t(getTextButton) }}</span>
|
||||
</button>
|
||||
</template>
|
||||
</action-buttons>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="this.context.edit" class="mb-3 row">
|
||||
<div class="col-sm-4"></div>
|
||||
<div class="address-container col-sm-8">
|
||||
<address-render-box :address="address" :isMultiline="false" :useDatePane="useDatePane"></address-render-box>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-if="this.context.target.name === 'household' || this.context.edit">
|
||||
<action-buttons
|
||||
:options="this.options"
|
||||
:defaultz="this.defaultz">
|
||||
<template v-slot:action>
|
||||
<button @click.prevent="$emit('openEditPane')"
|
||||
class="btn btn-sm" :class="getClassButton"
|
||||
type="button" name="button" :title="$t(getTextButton)">
|
||||
<span v-if="displayTextButton">{{ $t(getTextButton) }}</span>
|
||||
</button>
|
||||
</template>
|
||||
</action-buttons>
|
||||
</div>
|
||||
|
||||
<div v-if="!this.context.edit">
|
||||
<address-render-box :address="address" :isMultiline="false" :useDatePane="useDatePane"></address-render-box>
|
||||
</div>
|
||||
|
||||
<address-render-box :address="address" :useDatePane="useDatePane"></address-render-box>
|
||||
</div>
|
||||
|
||||
<action-buttons
|
||||
:options="this.options"
|
||||
:defaultz="this.defaultz">
|
||||
<template v-slot:action>
|
||||
<button @click.prevent="$emit('openEditPane')"
|
||||
class="btn" :class="getClassButton"
|
||||
type="button" name="button" :title="$t(getTextButton)">
|
||||
<span v-if="displayTextButton">{{ $t(getTextButton) }}</span>
|
||||
</button>
|
||||
</template>
|
||||
</action-buttons>
|
||||
<div v-if="onlyButton">
|
||||
<action-buttons
|
||||
:options="this.options"
|
||||
:defaultz="this.defaultz"
|
||||
class="add-address-btn">
|
||||
<template v-slot:action>
|
||||
<button @click.prevent="$emit('openEditPane')"
|
||||
class="btn" :class="getClassButton"
|
||||
type="button" name="button" :title="$t(getTextButton)">
|
||||
<span v-if="displayTextButton">{{ $t(getTextButton) }}</span>
|
||||
</button>
|
||||
</template>
|
||||
</action-buttons>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
@@ -58,6 +101,9 @@ export default {
|
||||
'useDatePane'
|
||||
],
|
||||
emits: ['openEditPane'],
|
||||
mounted() {
|
||||
console.log('context', this.context)
|
||||
},
|
||||
computed: {
|
||||
address() {
|
||||
return this.entity.address;
|
||||
@@ -91,13 +137,35 @@ export default {
|
||||
forceRedirect() {
|
||||
return (!(this.context.backUrl === null || typeof this.context.backUrl === 'undefined'));
|
||||
},
|
||||
showMessageWhenNoAddress() {
|
||||
let showMessageWhenNoAddress = this.options.showMessageWhenNoAddress === undefined ? this.defaultz.showMessageWhenNoAddress : this.options.showMessageWhenNoAddress;
|
||||
if (showMessageWhenNoAddress === true || showMessageWhenNoAddress === false) {
|
||||
return !this.context.edit && !this.address.id && showMessageWhenNoAddress;
|
||||
}
|
||||
return !this.context.edit && !this.address.id && this.options.stickyActions;
|
||||
}
|
||||
// showMessageWhenNoAddress() {
|
||||
// let showMessageWhenNoAddress = this.options.showMessageWhenNoAddress === undefined ? this.defaultz.showMessageWhenNoAddress : this.options.showMessageWhenNoAddress;
|
||||
// if (showMessageWhenNoAddress === true || showMessageWhenNoAddress === false) {
|
||||
// return !this.context.edit && !this.address.id && showMessageWhenNoAddress;
|
||||
// }
|
||||
// return !this.context.edit && !this.address.id && this.options.stickyActions;
|
||||
// }
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.address-container {
|
||||
display:flex;
|
||||
justify-content:flex-end;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.no-address-yet {
|
||||
text-align: center;
|
||||
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
|
||||
padding:1.5rem;
|
||||
margin-bottom:2rem;
|
||||
i {
|
||||
font-size:2rem;
|
||||
margin-bottom:2rem;
|
||||
}
|
||||
.add-address-btn {
|
||||
display: block
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
|
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
|
||||
|
||||
<div class="alert alert-light">{{ $t('my_tasks.description_warning') }}</div>
|
||||
<span v-if="noResultsAlert" class="chill-no-data-statement">{{ $t('no_data') }}</span>
|
||||
<tab-table v-else>
|
||||
@@ -11,7 +11,8 @@
|
||||
</template>
|
||||
<template v-slot:tbody>
|
||||
<tr v-for="(t, i) in tasks.alert.results" :key="`task-alert-${i}`">
|
||||
<td>{{ $d(t.warningDate.datetime, 'short') }}</td>
|
||||
<td v-if="null !== t.warningDate">{{ $d(t.warningDate.datetime, 'short') }}</td>
|
||||
<td v-else></td>
|
||||
<td>
|
||||
<span class="outdated">{{ $d(t.endDate.datetime, 'short') }}</span>
|
||||
</td>
|
||||
@@ -24,7 +25,7 @@
|
||||
</tr>
|
||||
</template>
|
||||
</tab-table>
|
||||
|
||||
|
||||
<div class="alert alert-light">{{ $t('my_tasks.description_alert') }}</div>
|
||||
<span v-if="noResultsWarning" class="chill-no-data-statement">{{ $t('no_data') }}</span>
|
||||
<tab-table v-else>
|
||||
@@ -49,7 +50,7 @@
|
||||
</tr>
|
||||
</template>
|
||||
</tab-table>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
@@ -9,7 +9,11 @@
|
||||
#}
|
||||
{{ opening_box|raw }}
|
||||
{%- if options['limit_lines'] is not null -%}
|
||||
{% set content = comment.comment|split('\n')|slice(0, options['limit_lines'])|join('\n') %}
|
||||
{% if comment.comment|split('\n')|length > options['limit_lines'] %}
|
||||
{% set content = comment.comment|split('\n')|slice(0, options['limit_lines'])|merge(['(more...)'|trans])|join('\n') %}
|
||||
{% else %}
|
||||
{% set content = comment.comment %}
|
||||
{% endif %}
|
||||
{%- else -%}
|
||||
{% set content = comment.comment %}
|
||||
{%- endif -%}
|
||||
|
@@ -198,6 +198,23 @@
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block private_comment_row %}
|
||||
{{ form_label(form) }}
|
||||
{{ form_row(form) }}
|
||||
{% endblock %}
|
||||
|
||||
{% block private_comment_widget %}
|
||||
{% for entry in form %}
|
||||
{{ form_widget(entry) }}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
|
||||
{% block comment_row %}
|
||||
{{ form_label(form) }}
|
||||
{{ form_row(form) }}
|
||||
{% endblock %}
|
||||
|
||||
{% block comment_widget %}
|
||||
{% for entry in form %}
|
||||
{{ form_widget(entry) }}
|
||||
|
@@ -54,6 +54,8 @@
|
||||
} %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{{ chill_pagination(paginator) }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
@@ -3,54 +3,56 @@
|
||||
{% block admin_content -%}
|
||||
{% embed '@ChillMain/CRUD/_edit_content.html.twig' %}
|
||||
{% block crud_content_after_form %}
|
||||
<h2>{{ 'Permissions granted'|trans }}</h2>
|
||||
{% if access_permissions_group_list %}
|
||||
<h2>{{ 'Permissions granted'|trans }}</h2>
|
||||
|
||||
{% if entity.groupcenters|length > 0 %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ 'Permission group'|trans }}</th>
|
||||
<th>{{ 'Center'|trans }}</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for groupcenter in entity.groupcenters %}
|
||||
{% if entity.groupcenters|length > 0 %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td>
|
||||
<span class="user_group permissionsgroup">
|
||||
{{ groupcenter.permissionsgroup.name }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="user_group center">
|
||||
{{ groupcenter.center.name }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{{ form_start(delete_groupcenter_form[groupcenter.id]) }}
|
||||
{{ form_row(delete_groupcenter_form[groupcenter.id].submit, { 'attr': { 'class': 'btn btn-chill-red' } } ) }}
|
||||
{{ form_rest(delete_groupcenter_form[groupcenter.id]) }}
|
||||
{{ form_end(delete_groupcenter_form[groupcenter.id]) }}
|
||||
</td>
|
||||
<th>{{ 'Permission group'|trans }}</th>
|
||||
<th>{{ 'Center'|trans }}</th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>{{ 'Any permissions granted to this user'|trans }}.</p>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for groupcenter in entity.groupcenters %}
|
||||
<tr>
|
||||
<td>
|
||||
<span class="user_group permissionsgroup">
|
||||
{{ groupcenter.permissionsgroup.name }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="user_group center">
|
||||
{{ groupcenter.center.name }}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
{{ form_start(delete_groupcenter_form[groupcenter.id]) }}
|
||||
{{ form_row(delete_groupcenter_form[groupcenter.id].submit, { 'attr': { 'class': 'btn btn-chill-red' } } ) }}
|
||||
{{ form_rest(delete_groupcenter_form[groupcenter.id]) }}
|
||||
{{ form_end(delete_groupcenter_form[groupcenter.id]) }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>{{ 'Any permissions granted to this user'|trans }}.</p>
|
||||
{% endif %}
|
||||
|
||||
<h3>{{ 'Grant new permissions'|trans }}</h3>
|
||||
|
||||
{{ form_start(add_groupcenter_form) }}
|
||||
{{ form_row(add_groupcenter_form.composed_groupcenter.center) }}
|
||||
{{ form_row(add_groupcenter_form.composed_groupcenter.permissionsgroup) }}
|
||||
{{ form_row(add_groupcenter_form.submit, { 'attr' : { 'class': 'btn btn-chill-green' } } ) }}
|
||||
|
||||
{{ form_end(add_groupcenter_form) }}
|
||||
{% endif %}
|
||||
|
||||
<h3>{{ 'Grant new permissions'|trans }}</h3>
|
||||
|
||||
{{ form_start(add_groupcenter_form) }}
|
||||
{{ form_row(add_groupcenter_form.composed_groupcenter.center) }}
|
||||
{{ form_row(add_groupcenter_form.composed_groupcenter.permissionsgroup) }}
|
||||
{{ form_row(add_groupcenter_form.submit, { 'attr' : { 'class': 'btn btn-chill-green' } } ) }}
|
||||
|
||||
{{ form_end(add_groupcenter_form) }}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block content_form_actions_save_and_show %}{% endblock %}
|
||||
{% endembed %}
|
||||
{% endblock %}
|
||||
|
@@ -11,6 +11,11 @@
|
||||
<div class="item-bloc">
|
||||
<div class="item-row">
|
||||
<div class="item-col">
|
||||
{% if entity.civility is not null %}
|
||||
{% if entity.civility.name|length > 0 %}
|
||||
{{ entity.civility.name|first }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ entity.label }}
|
||||
{% if entity.isEnabled %}
|
||||
<i class="fa fa-check chill-green"></i>
|
||||
@@ -45,9 +50,13 @@
|
||||
<li>
|
||||
<a class="btn btn-edit" href="{{ path('chill_crud_admin_user_edit', { 'id': entity.id }) }}"></a>
|
||||
</li>
|
||||
|
||||
{% if allow_change_password is same as(true) %}
|
||||
<li>
|
||||
<a class="btn btn-chill-red" href="{{ path('admin_user_edit_password', { 'id' : entity.id }) }}" title="{{ 'Edit password'|trans|e('html_attr') }}"><i class="fa fa-ellipsis-h"></i></a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
{% if is_granted('ROLE_ALLOWED_TO_SWITCH') %}
|
||||
<li>
|
||||
<a class="btn btn-chill-blue" href="{{ path('chill_main_homepage', {'_switch_user': entity.username }) }}" title="{{ "Impersonate"|trans|e('html_attr') }}"><i class="fa fa-user-secret"></i></a>
|
||||
|
@@ -115,5 +115,6 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{{ chill_pagination(paginator) }}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@@ -6,6 +6,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<title>{{ installation.name }} - {% block title %}{{ 'Homepage'|trans }}{% endblock %}</title>
|
||||
{% block head_custom %}{% endblock %}
|
||||
<link rel="shortcut icon" href="{{ asset('build/images/favicon.ico') }}" type="image/x-icon">
|
||||
|
||||
{{ encore_entry_link_tags('mod_bootstrap') }}
|
||||
|
@@ -13,6 +13,7 @@ namespace Chill\MainBundle\Routing\MenuBuilder;
|
||||
|
||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
||||
use Knp\Menu\MenuItem;
|
||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
|
||||
|
||||
class AdminUserMenuBuilder implements LocalMenuBuilderInterface
|
||||
@@ -22,9 +23,14 @@ class AdminUserMenuBuilder implements LocalMenuBuilderInterface
|
||||
*/
|
||||
protected $authorizationChecker;
|
||||
|
||||
public function __construct(AuthorizationCheckerInterface $authorizationChecker)
|
||||
{
|
||||
protected ParameterBagInterface $parameterBag;
|
||||
|
||||
public function __construct(
|
||||
AuthorizationCheckerInterface $authorizationChecker,
|
||||
ParameterBagInterface $parameterBag
|
||||
) {
|
||||
$this->authorizationChecker = $authorizationChecker;
|
||||
$this->parameterBag = $parameterBag;
|
||||
}
|
||||
|
||||
public function buildMenu($menuId, MenuItem $menu, array $parameters)
|
||||
@@ -51,9 +57,11 @@ class AdminUserMenuBuilder implements LocalMenuBuilderInterface
|
||||
'route' => 'admin_scope',
|
||||
])->setExtras(['order' => 1020]);
|
||||
|
||||
$menu->addChild('Permissions group list', [
|
||||
'route' => 'admin_permissionsgroup',
|
||||
])->setExtras(['order' => 1030]);
|
||||
if ($this->parameterBag->get('chill_main.access_permissions_group_list')) {
|
||||
$menu->addChild('Permissions group list', [
|
||||
'route' => 'admin_permissionsgroup',
|
||||
])->setExtras(['order' => 1030]);
|
||||
}
|
||||
|
||||
$menu->addChild('crud.admin_user.index.title', [
|
||||
'route' => 'chill_crud_admin_user_index',
|
||||
|
@@ -15,13 +15,19 @@ use Chill\MainBundle\Entity\User;
|
||||
use Chill\MainBundle\Notification\Counter\NotificationByUserCounter;
|
||||
use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
|
||||
use Chill\MainBundle\Workflow\Counter\WorkflowByUserCounter;
|
||||
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
|
||||
use Symfony\Component\HttpFoundation\RequestStack;
|
||||
use Symfony\Component\Security\Core\Security;
|
||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||
|
||||
class UserMenuBuilder implements LocalMenuBuilderInterface
|
||||
{
|
||||
protected ParameterBagInterface $parameterBag;
|
||||
|
||||
private NotificationByUserCounter $notificationByUserCounter;
|
||||
|
||||
private RequestStack $requestStack;
|
||||
|
||||
private Security $security;
|
||||
|
||||
private TranslatorInterface $translator;
|
||||
@@ -32,12 +38,16 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
|
||||
NotificationByUserCounter $notificationByUserCounter,
|
||||
WorkflowByUserCounter $workflowByUserCounter,
|
||||
Security $security,
|
||||
TranslatorInterface $translator
|
||||
TranslatorInterface $translator,
|
||||
ParameterBagInterface $parameterBag,
|
||||
RequestStack $requestStack
|
||||
) {
|
||||
$this->notificationByUserCounter = $notificationByUserCounter;
|
||||
$this->workflowByUserCounter = $workflowByUserCounter;
|
||||
$this->security = $security;
|
||||
$this->translator = $translator;
|
||||
$this->parameterBag = $parameterBag;
|
||||
$this->requestStack = $requestStack;
|
||||
}
|
||||
|
||||
public function buildMenu($menuId, \Knp\Menu\MenuItem $menu, array $parameters)
|
||||
@@ -54,7 +64,12 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
|
||||
$menu
|
||||
->addChild(
|
||||
$locationTextMenu,
|
||||
['route' => 'chill_main_user_currentlocation_edit']
|
||||
[
|
||||
'route' => 'chill_main_user_currentlocation_edit',
|
||||
'routeParameters' => [
|
||||
'returnPath' => $this->requestStack->getCurrentRequest()->getRequestUri(),
|
||||
],
|
||||
]
|
||||
)
|
||||
->setExtras([
|
||||
'order' => -9999999,
|
||||
@@ -85,14 +100,16 @@ class UserMenuBuilder implements LocalMenuBuilderInterface
|
||||
'order' => 700,
|
||||
]);
|
||||
|
||||
$menu
|
||||
->addChild(
|
||||
'Change password',
|
||||
['route' => 'change_my_password']
|
||||
)
|
||||
->setExtras([
|
||||
'order' => 99999999998,
|
||||
]);
|
||||
if ($this->parameterBag->get('chill_main.access_user_change_password')) {
|
||||
$menu
|
||||
->addChild(
|
||||
'Change password',
|
||||
['route' => 'change_my_password']
|
||||
)
|
||||
->setExtras([
|
||||
'order' => 99999999998,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
$menu
|
||||
|
@@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\MainBundle\Serializer\Normalizer;
|
||||
|
||||
use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable;
|
||||
use Symfony\Component\Security\Core\Security;
|
||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||
|
||||
class PrivateCommentEmbeddableNormalizer implements NormalizerInterface, DenormalizerInterface
|
||||
{
|
||||
private Security $security;
|
||||
|
||||
public function __construct(Security $security)
|
||||
{
|
||||
$this->security = $security;
|
||||
}
|
||||
|
||||
public function denormalize($data, string $type, ?string $format = null, array $context = []): PrivateCommentEmbeddable
|
||||
{
|
||||
$comment = new PrivateCommentEmbeddable();
|
||||
|
||||
if (null === $data) {
|
||||
return $comment;
|
||||
}
|
||||
|
||||
$comment->setCommentForUser($this->security->getUser(), $data);
|
||||
|
||||
return $comment;
|
||||
}
|
||||
|
||||
public function normalize($object, $format = null, array $context = []): string
|
||||
{
|
||||
return $object->getCommentForUser($this->security->getUser());
|
||||
}
|
||||
|
||||
public function supportsDenormalization($data, string $type, ?string $format = null): bool
|
||||
{
|
||||
return PrivateCommentEmbeddable::class === $type;
|
||||
}
|
||||
|
||||
public function supportsNormalization($data, ?string $format = null): bool
|
||||
{
|
||||
return $data instanceof PrivateCommentEmbeddable;
|
||||
}
|
||||
}
|
@@ -12,6 +12,7 @@ declare(strict_types=1);
|
||||
namespace Chill\MainBundle\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;
|
||||
@@ -41,9 +42,9 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware
|
||||
$this->userRender = $userRender;
|
||||
}
|
||||
|
||||
public function normalize($user, $format = null, array $context = [])
|
||||
public function normalize($object, $format = null, array $context = [])
|
||||
{
|
||||
/** @var User $user */
|
||||
/** @var User $object */
|
||||
$userJobContext = array_merge(
|
||||
$context,
|
||||
['docgen:expects' => UserJob::class, 'groups' => 'docgen:read']
|
||||
@@ -60,9 +61,14 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware
|
||||
$context,
|
||||
['docgen:expects' => Location::class, 'groups' => 'docgen:read']
|
||||
);
|
||||
$civilityContext = array_merge(
|
||||
$context,
|
||||
['docgen:expects' => Civility::class, 'groups' => 'docgen:read']
|
||||
);
|
||||
|
||||
if (null === $user && 'docgen' === $format) {
|
||||
if (null === $object && 'docgen' === $format) {
|
||||
return array_merge(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),
|
||||
@@ -73,19 +79,20 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware
|
||||
|
||||
$data = [
|
||||
'type' => 'user',
|
||||
'id' => $user->getId(),
|
||||
'username' => $user->getUsername(),
|
||||
'text' => $this->userRender->renderString($user, []),
|
||||
'label' => $user->getLabel(),
|
||||
'email' => (string) $user->getEmail(),
|
||||
'user_job' => $this->normalizer->normalize($user->getUserJob(), $format, $userJobContext),
|
||||
'main_center' => $this->normalizer->normalize($user->getMainCenter(), $format, $centerContext),
|
||||
'main_scope' => $this->normalizer->normalize($user->getMainScope(), $format, $scopeContext),
|
||||
'id' => $object->getId(),
|
||||
'username' => $object->getUsername(),
|
||||
'text' => $this->userRender->renderString($object, []),
|
||||
'label' => $object->getLabel(),
|
||||
'email' => (string) $object->getEmail(),
|
||||
'user_job' => $this->normalizer->normalize($object->getUserJob(), $format, $userJobContext),
|
||||
'main_center' => $this->normalizer->normalize($object->getMainCenter(), $format, $centerContext),
|
||||
'main_scope' => $this->normalizer->normalize($object->getMainScope(), $format, $scopeContext),
|
||||
];
|
||||
|
||||
if ('docgen' === $format) {
|
||||
$data['current_location'] = $this->normalizer->normalize($user->getCurrentLocation(), $format, $locationContext);
|
||||
$data['main_location'] = $this->normalizer->normalize($user->getMainLocation(), $format, $locationContext);
|
||||
$data['civility'] = $this->normalizer->normalize($object->getCivility(), $format, $civilityContext);
|
||||
$data['current_location'] = $this->normalizer->normalize($object->getCurrentLocation(), $format, $locationContext);
|
||||
$data['main_location'] = $this->normalizer->normalize($object->getMainLocation(), $format, $locationContext);
|
||||
}
|
||||
|
||||
return $data;
|
||||
|
@@ -143,3 +143,7 @@ services:
|
||||
Chill\MainBundle\Form\Type\LocationFormType: ~
|
||||
|
||||
Chill\MainBundle\Form\WorkflowStepType: ~
|
||||
|
||||
Chill\MainBundle\Form\DataMapper\PrivateCommentDataMapper:
|
||||
autowire: true
|
||||
autoconfigure: true
|
||||
|
@@ -10,4 +10,9 @@ services:
|
||||
Chill\MainBundle\Serializer\Normalizer\DoctrineExistingEntityNormalizer:
|
||||
tags:
|
||||
- { name: 'serializer.normalizer', priority: 8 }
|
||||
Chill\MainBundle\Serializer\Normalizer\PrivateCommentEmbeddableNormalizer:
|
||||
autowire: true
|
||||
autoconfigure: true
|
||||
tags:
|
||||
- { name: 'serializer.normalizer', priority: 64 }
|
||||
|
||||
|
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\Migrations\Main;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
final class Version20220513151853 extends AbstractMigration
|
||||
{
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
}
|
||||
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'set default on attributes';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
$this->addSql('update users set attributes = \'[]\'::json where attributes IS NULL');
|
||||
}
|
||||
}
|
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Chill\Migrations\Main;
|
||||
|
||||
use Doctrine\DBAL\Schema\Schema;
|
||||
use Doctrine\Migrations\AbstractMigration;
|
||||
|
||||
/**
|
||||
* Add civility to User.
|
||||
*/
|
||||
final class Version20220516085659 extends AbstractMigration
|
||||
{
|
||||
public function down(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE users DROP CONSTRAINT FK_1483A5E923D6A298');
|
||||
$this->addSql('DROP INDEX IDX_1483A5E923D6A298');
|
||||
$this->addSql('ALTER TABLE users DROP civility_id');
|
||||
}
|
||||
|
||||
public function getDescription(): string
|
||||
{
|
||||
return 'Add civility to User';
|
||||
}
|
||||
|
||||
public function up(Schema $schema): void
|
||||
{
|
||||
$this->addSql('ALTER TABLE users ADD civility_id INT DEFAULT NULL');
|
||||
$this->addSql('ALTER TABLE users ADD CONSTRAINT FK_1483A5E923D6A298 FOREIGN KEY (civility_id) REFERENCES chill_main_civility (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
|
||||
$this->addSql('CREATE INDEX IDX_1483A5E923D6A298 ON users (civility_id)');
|
||||
}
|
||||
}
|
@@ -62,9 +62,11 @@ Comment: Commentaire
|
||||
Pinned comment: Commentaire épinglé
|
||||
Any comment: Aucun commentaire
|
||||
Read more: Lire la suite
|
||||
(more...): (suite...)
|
||||
|
||||
# comment embeddable
|
||||
No comment associated: Aucun commentaire
|
||||
private comment: Notes privées
|
||||
|
||||
#pagination
|
||||
Previous: Précédent
|
||||
@@ -461,6 +463,7 @@ workflow:
|
||||
Previous transitionned: Anciens workflows
|
||||
Previous workflow transitionned help: Workflows où vous avez exécuté une action.
|
||||
For: Pour
|
||||
You must select a next step, pick another decision if no next steps are available: Il faut une prochaine étape. Choissisez une autre décision si nécessaire.
|
||||
|
||||
|
||||
Subscribe final: Recevoir une notification à l'étape finale
|
||||
|
@@ -1,9 +1,459 @@
|
||||
Search: Zoek
|
||||
'Search persons, ...': 'Zoek persoons, ...'
|
||||
Search a person: Zoek een persoon
|
||||
Login: Log in
|
||||
Logout: Log out
|
||||
"This program is free software: you can redistribute it and/or modify it under the terms of the <strong>GNU Affero General Public License</strong>": "Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou le modifier selon les termes de la licence <strong>GNU Affero GPL</strong>"
|
||||
User manual: Gebruikershandleiding
|
||||
Search: Zoeken
|
||||
"Search persons, ...": "Zoek personen, ..."
|
||||
Person name: Naam / voornaam persoon
|
||||
Login: Inloggen
|
||||
Logout: Uitloggen
|
||||
Bad credentials.: Een verkeerd wachtwoord of gebruikersnaam werd opgegeven.
|
||||
Invalid CSRF token.: Uw sessie is verlopen.
|
||||
Username: Gebruikersnaam
|
||||
Password: Wachtworrd
|
||||
Login to %installation_name%: Log in bij %installation_name%
|
||||
Welcome to %installation_name%: Welkom bij %installation_name%
|
||||
username: gebruikersnaam
|
||||
Password: Wachtwoord
|
||||
Welcome to %installation_name%: Welkom bij %installation_name%
|
||||
Login to %installation_name%: Inloggen op %installation_name%
|
||||
Enabled: Ingeschakeld
|
||||
enabled: ingeschakeld
|
||||
disabled: uitgeschakeld
|
||||
Disabled: Uitgeschakeld
|
||||
Id: Id
|
||||
Homepage: Hoofdpagina
|
||||
Welcome: Welkom
|
||||
Export Menu: Export
|
||||
Admin Menu: Admin menu
|
||||
Details: Details
|
||||
yes: ja
|
||||
no: nee
|
||||
valid: geldig
|
||||
Valid: Geldig
|
||||
Not valid: Ongeldig
|
||||
not valid: ongeldig
|
||||
Confirm: Bevestigen
|
||||
Cancel: Annuleren
|
||||
Save: Opslaan
|
||||
This form contains errors: Dit formulier bevat fouten
|
||||
Choose an user: Kies een gebruiker
|
||||
"You are going to leave a page with unsubmitted data. Are you sure you want to leave ?": "U verlaat een pagina waarvan de gegevens niet werden opgeslagen. Bent u zeker deze pagina te willen verlaten?"
|
||||
No value: Geen informatie
|
||||
Last updated by: Laatste update door
|
||||
on: "op "
|
||||
Last updated on: Laatste update op
|
||||
by_user: "door "
|
||||
|
||||
Edit: Bewerken
|
||||
Update: Updaten
|
||||
Back to the list: Terug naar overzicht
|
||||
|
||||
#interval
|
||||
Years: Jaren
|
||||
|
||||
# misc date
|
||||
Since %date%: Sinds %date%
|
||||
since %date%: sinds %date%
|
||||
Until %date%: Tot %date%
|
||||
until %date%: tot %date%
|
||||
Since: Sinds
|
||||
Until: Tot
|
||||
#elements used in software
|
||||
centers: centra
|
||||
Centers: Centra
|
||||
comment: opmerkingen
|
||||
Comment: Opmerkingen
|
||||
Pinned comment: Gepinde opmerking
|
||||
Any comment: Geen opmerkingen
|
||||
Read more: Meer lezen
|
||||
|
||||
# comment embeddable
|
||||
No comment associated: Geen opmerkingen
|
||||
|
||||
#pagination
|
||||
Previous: Vorige
|
||||
Next: Volgende
|
||||
|
||||
#addresses
|
||||
Street address1: Adres regel 1
|
||||
Street address2: Adres regel 2
|
||||
Postal code: Postcode
|
||||
Valid from: Geldig vanaf
|
||||
Choose a postal code: Kies een postcode
|
||||
address:
|
||||
address_homeless: Betreft dit een domicilie adres ?
|
||||
real address: Domicilie adres
|
||||
consider homeless: Dit adres is onvolledig
|
||||
address more:
|
||||
floor: verd.
|
||||
corridor: gang
|
||||
steps: trap
|
||||
flat: appart.
|
||||
buildingName: residentie
|
||||
extra: ""
|
||||
distribution: cedex
|
||||
Create a new address: Maak een nieuw adres aan
|
||||
Create an address: Maak een adres aan
|
||||
Update address: Bewerk het adres
|
||||
City or postal code: Stad of postcode
|
||||
|
||||
# contact
|
||||
Part of the phonenumber: Deel van het telefoonnummer
|
||||
|
||||
#serach
|
||||
Your search is empty. Please provide search terms.: De zoekopdracht is leeg. Gelieve een zoekterm op te geven.
|
||||
The domain %domain% is unknow. Please check your search.: Het zoekgebied "%domain%" is ongekend. Gelieve uw zoekopdracht te verifiëren.
|
||||
Invalid terms: Ongeldige zoekopdracht
|
||||
You should not have more than one domain.: Gelieve slechts één zoekgebied op te geven.
|
||||
#used for page title
|
||||
Search %pattern%: Zoek "%pattern%"
|
||||
Results %start%-%end% of %total%: Resultaten %start%-%end% van %total%
|
||||
See all results: Alle resultaten zien
|
||||
Advanced search: Geavanceerde zoekopdracht
|
||||
results: resultaten
|
||||
|
||||
# timeline
|
||||
Global timeline: Globale tijdslijn
|
||||
|
||||
#admin
|
||||
Create: Aanmaken
|
||||
show: bekijken
|
||||
Show: Bekijken
|
||||
edit: bewerken
|
||||
Main admin menu: Hoofdmenu admin
|
||||
Actions: Acties
|
||||
Users and permissions: Gebruikers en rechten
|
||||
Location and location type: Vestigingen en vestiging types
|
||||
|
||||
#permissions
|
||||
Permissions Menu: Beheer rechten
|
||||
Permissions management of your chill installation: Beheer rechten voor deze Chill installatie.
|
||||
|
||||
#location
|
||||
Location Menu: Vestigingen en vestiging types
|
||||
Management of location: Beheer vestigingen en vestiging types
|
||||
|
||||
#admin section
|
||||
"Administration interface": Admin paneel
|
||||
Welcome to the admin section !: >
|
||||
Welkom op het admin paneel !
|
||||
|
||||
#admin section for center's administration
|
||||
Create a new center: Maak een nieuw centrum aan
|
||||
Center list: Overzicht centra
|
||||
Center edit: Bewerk een centrum
|
||||
Center creation: Aanmaak centrum
|
||||
New center: Nieuw centrum
|
||||
Center: Centrum
|
||||
|
||||
#admin section for permissions group
|
||||
Permissions group list: Groepsrechten
|
||||
Create a new permissions group: Maak een nieuw groepsrecht aan
|
||||
Permission group "%name%": Groepsrecht "%name%"
|
||||
Grant those permissions: Rechten toekennen
|
||||
Which implies: Wat impliceert
|
||||
Permission group: Groepsrecht
|
||||
Permissionsgroup: Groepsrecht
|
||||
New permission group: Nieuw groepsrecht
|
||||
PermissionsGroup "%name%" edit: Bewerk groepsrecht '%name%'
|
||||
Role: Rol
|
||||
Choose amongst roles: Kies een rol
|
||||
Add permission: Rechten toevoegen
|
||||
This group does not provide any permission: Deze groep kent geen rechten toe.
|
||||
The role '%role%' has been removed: De rol "%role%" werd verwijdert uit dit groepsrecht.
|
||||
The role '%role%' on circle '%scope%' has been removed: De rol "%role%" binnen de cirkel "%scope%" werd verwijdert uit dit groepsrecht.
|
||||
|
||||
#admin section for users
|
||||
User edit: Gebruiker bewerken
|
||||
User'status: Gebruikersstatuut
|
||||
Disabled, the user is not allowed to login: Uitgeschakeld, de gebruiker krijgt geen toestemming om in te loggen.
|
||||
Enabled, the user is active: Ingeschakeld, de gebruiker kan zich inloggen.
|
||||
Edit password: Wachtwoord aanpassen
|
||||
Repeat the password: Wachtwoord herhalen
|
||||
Permissions granted: Rechten toegekend
|
||||
Any permissions granted to this user: Geen enkele rechten werden toegekend aan deze gebruiker
|
||||
Grant new permissions: Rechten toevoegen
|
||||
Add a new groupCenter: Rechten toevoegen
|
||||
The permissions have been successfully added to the user: De rechten werden toegekend aan de gebruiker
|
||||
The permissions where removed.: De rechten werden verwijdert voor dze gebruiker
|
||||
Center & groups: Centra en groepen
|
||||
User %username%: Gebruiker %username%
|
||||
Add a new user: Nieuwe gebruiker toevoegen
|
||||
The permissions have been added: De rechten werden toegevoegd
|
||||
Edit password for %username%: Wachtwoord voor %username% aanpassen
|
||||
Change password: Wachtwoord aanpassen
|
||||
Back to the user edition: Terugkeren naar bewerkingsformulier
|
||||
Password successfully updated!: Wachtwoord opgeslagen
|
||||
Flags: Vlaggen
|
||||
|
||||
# admin section for users jobs
|
||||
User jobs: Beroepen
|
||||
|
||||
# user page for current location
|
||||
Current location: Huidige vestiging
|
||||
Edit my current location: Mijn huidige vestiging bewerken
|
||||
Change current location: CMijn huidige vestiging vernanderen
|
||||
Set a location: Een vestiging instellen
|
||||
Current location successfully updated: Huidige vestiging werd opgeslagen
|
||||
Pick a location: Kies een vestiging.
|
||||
|
||||
#admin section for circles (old: scopes)
|
||||
List circles: Cirkels
|
||||
New circle: Nieuwe cirkel
|
||||
Circle: Cirkel
|
||||
Circle edit: Cirkel bewerken
|
||||
Circle creation: Cirkel aanmaken
|
||||
Create a new circle: Nieuwe cirkel aanmaken
|
||||
|
||||
#admin section for location
|
||||
Location: Vestigingen
|
||||
Location type list: Vestiging types
|
||||
Create a new location type: Nieuwe type vestiging aanmaken
|
||||
Available for users: Beschikbaar voor gebruikers
|
||||
Editable by users: Bewerkbaar door gebruikers
|
||||
Address required: Adres vereist?
|
||||
Contact data: Contactgegevens?
|
||||
optional: optioneel
|
||||
required: vereist
|
||||
never: nooit
|
||||
Create a new location: Nieuwe vestiging aanmaken
|
||||
Location list: Overzicht vestigingen
|
||||
Location type: Type vestiging
|
||||
Phonenumber1: Telefoonnummer 1
|
||||
Phonenumber2: Telefoonnummer 2
|
||||
Configure location and location type: Configureer vestigingen en types vestiging
|
||||
Default for: Standaard vestiging
|
||||
none: geen
|
||||
person: gebruiker
|
||||
thirdparty: externe partner
|
||||
|
||||
# circles / scopes
|
||||
Choose the circle: Kies een cirkel
|
||||
Scopes: Diensten
|
||||
|
||||
#export
|
||||
|
||||
# export creation step 0 : list of exports
|
||||
Exports list: Overzicht rapporten
|
||||
Create an export: Maak een rapport aan
|
||||
#export creation step 'center' : pick a center
|
||||
Pick centers: Kies centra
|
||||
Pick a center: Kies een centrum
|
||||
The export will contains only data from the picked centers.: het rapport zal enkel data bevatten voor het geselecteerde centrum.
|
||||
This will eventually restrict your possibilities in filtering the data.: De filterkeuzes zullen worden aangepast aan de rechten tot raadpleging van de geselecteerde centra.
|
||||
Go to export options: Ga naar de rapport opties
|
||||
Pick aggregated centers: Hergroepering centra
|
||||
# export creation step 'export' : choose aggregators, filtering and formatter
|
||||
Formatter: Formateren
|
||||
Choose the formatter: Kies het gewenste formaat voor dit rapport.
|
||||
Export parameters: Rapport parameters
|
||||
Filters: Filters
|
||||
Aggregators: Aggregaten
|
||||
Go to formatter options: Naar de formateeropties
|
||||
Choose a format: Kies een formaat
|
||||
#export creation step 'formatter' : choose formatter option
|
||||
Generate the report: Rapport genereren
|
||||
No options availables. Your report is fully configured.: Geen beschikbare opties. Dit rapport werd volledig geconfigureerd.
|
||||
Ungrouped exports: Overige expor
|
||||
|
||||
#export download
|
||||
Download export: Téléchargement du rapport
|
||||
Waiting for your report: En attente de votre rapport
|
||||
Download your report: Télécharger votre rapport
|
||||
Problem during download: Problème durant le téléchargement
|
||||
# sans valeur
|
||||
without data: sans valeur
|
||||
|
||||
#CSV List Formatter
|
||||
Add a number on first column: La première colonne est un numéro
|
||||
Number: Numéro
|
||||
# the label which appears in the UI
|
||||
CSV vertical list: Liste verticale au format CSV
|
||||
CSV horizontal list: Liste horizontale au format CSV
|
||||
Spreadsheet list formatter (.xlsx, .ods): Liste au format tableur (.xlsx, .ods)
|
||||
Order: Ordre
|
||||
Position: Position
|
||||
row: ligne
|
||||
column: colonne
|
||||
Comma separated values (CSV): Valeurs séparées par des virgules (CSV - tableur)
|
||||
|
||||
# spreadsheet formatter
|
||||
Choose the format: Choisir le format
|
||||
|
||||
# select2
|
||||
"select2.no_results": Aucun résultat
|
||||
"select2.error_loading": Erreur de chargement des résultats
|
||||
"select2.searching": Recherche en cours...
|
||||
|
||||
# change password
|
||||
Change my password: Modification du mot de passe
|
||||
Your actual password: Mot de passe actuel
|
||||
|
||||
# recover password
|
||||
Forgot your password ?: Mot de passe oublié ?
|
||||
Recover password: Remplacement du mot de passe
|
||||
Username or email: Nom d'utilisateur ou email
|
||||
Request recover: Demande de remplacement
|
||||
Check your email: Vérifiez votre courriel
|
||||
An email has been sent to your address. Click on the link inside this email to confirm that you are the owner of this account.: Un courriel a été envoyé à votre adresse. Cliquez sur le lien de cet email pour confirmer que vous êtes bien le propriétaire de ce compte.
|
||||
You requested to recover your password: Vous avez demandé à renouveler votre mot de passe.
|
||||
Click on the link below to recover your password: Cliquez sur le lien ci-dessous pour re-générer votre mot de passe
|
||||
Regards,: Cordialement,
|
||||
Your administrator: Votre administrateur
|
||||
Recover your password: Regénération du mot de passe
|
||||
New password set: Le nouveau mot de passe est enregistré
|
||||
Your password has been set.: Votre mot de passe a été changé.
|
||||
Log in with your new password: Connectez-vous avec votre nouveau mot de passe
|
||||
|
||||
# impersonate
|
||||
Exit impersonation: Retour Administrateur
|
||||
Impersonate: Incarner l'utilisateur
|
||||
Impersonate mode: Mode fantôme
|
||||
|
||||
crud:
|
||||
# general items
|
||||
new:
|
||||
button_action_form: Créer
|
||||
link_edit: Modifier
|
||||
save_and_close: Créer & fermer
|
||||
save_and_show: Créer & voir
|
||||
save_and_new: Créer & nouveau
|
||||
success: Les données ont été créées
|
||||
edit:
|
||||
button_action_form: Enregistrer
|
||||
back_to_view: Voir
|
||||
save_and_close: Enregistrer & fermer
|
||||
save_and_show: Enregistrer & voir
|
||||
success: Les données ont été modifiées
|
||||
delete:
|
||||
success: Les données ont été supprimées
|
||||
link_to_form: Supprimer
|
||||
default:
|
||||
success: Les données ont été enregistrées
|
||||
view:
|
||||
link_duplicate: Dupliquer
|
||||
admin_user:
|
||||
index:
|
||||
title: Utilisateurs
|
||||
add_new: Créer
|
||||
admin_user_job:
|
||||
index:
|
||||
title: Métiers
|
||||
add_new: Créer
|
||||
title_new: Nouveau métier
|
||||
title_edit: Modifier un métier
|
||||
main_location_type:
|
||||
title_new: Nouveau type de localisation
|
||||
title_edit: Modifier un type de localisation
|
||||
main_location:
|
||||
title_new: Nouvelle localisation
|
||||
title_edit: Modifier une localisation
|
||||
|
||||
No entities: Aucun élément
|
||||
|
||||
CHILL_FOO_SEE: Voir un élément
|
||||
CHILL_FOO_EDIT: Modifier un élément
|
||||
|
||||
#Show templates
|
||||
Date: Date
|
||||
By: Par
|
||||
For: Pour
|
||||
Created for: Créé pour
|
||||
Created by: Créé par
|
||||
Created on: Créé le
|
||||
|
||||
|
||||
# Workflows 💊
|
||||
Workflow: Workflow — chemin de décision
|
||||
Workflow n°%id%: 'Workflow (n°%id%)'
|
||||
workflow_: Workflow
|
||||
target: ' (cible)'
|
||||
Decision: Décision
|
||||
Join a comment: Laisser un commentaire
|
||||
Follow workflow: Suivre la décision
|
||||
Workflow history: Historique de la décision
|
||||
|
||||
workflow:
|
||||
Created by: Créé par
|
||||
My decision: Ma décision
|
||||
Next step: Prochaine étape
|
||||
dest for next steps: Utilisateurs qui valideront la prochaine étape
|
||||
Freeze: Geler
|
||||
Freezed: Gelé
|
||||
freezed document: Le document est gelé
|
||||
The associated element will be freezed: L'élément associé sera gelé et ne pourra plus être modifié après cette décision.
|
||||
Finalize: Étape finale
|
||||
The workflow will be finalized: Le suivi est clôturé lors de cette décision.
|
||||
No transitions: Aucune transition
|
||||
Comment added: Commentaire ajouté
|
||||
This workflow is finalized: Ce suivi est finalisé.
|
||||
You are not allowed to apply a transition on this workflow: Vous n'êtes pas autorisé à appliquer une décision pour ce suivi
|
||||
Only those users are allowed: Seuls ces utilisateurs sont autorisés
|
||||
My workflows: Mes workflows
|
||||
No workflow: Aucun workflow
|
||||
Evaluation (n°%eval%): "Évaluation (n°%eval%)"
|
||||
Document (n°%doc%): "Document (n°%doc%)"
|
||||
Work (n°%w%): "Action d'accompagnement (n°%w%)"
|
||||
subscribed: Workflows suivis
|
||||
dest: Workflows en attente d'action
|
||||
you subscribed to all steps: Vous recevrez une notification à chaque étape
|
||||
you subscribed to final step: Vous recevrez une notification à l'étape finale
|
||||
Current step: Étape actuelle
|
||||
Comment on last change: Commentaire à la transition précédente
|
||||
Users allowed to apply transition: Utilisateurs pouvant valider cette étape
|
||||
Workflow deleted with success: Le workflow a été supprimé
|
||||
Delete workflow ?: Supprimer le workflow ?
|
||||
Are you sure you want to delete this workflow ?: Êtes-vous sûr·e de vouloir supprimer ce workflow ?
|
||||
Delete workflow: Supprimer le workflow
|
||||
Steps is not waiting for transition. Maybe someone apply the transition before you ?: L'étape que vous cherchez a déjà été modifiée par un autre utilisateur. Peut-être quelqu'un a-t-il modifié cette étape avant vous ?
|
||||
You get access to this step: Vous avez acquis les droits pour appliquer une transition sur ce workflow.
|
||||
Those users are also granted to apply a transition by using an access key: Ces utilisateurs peuvent également valider cette étape, grâce à un lien d'accès
|
||||
dest by email: Liens d'autorisation par email
|
||||
dest by email help: Les adresses email mentionnées ici recevront un lien d'accès. Ce lien d'accès permettra à l'utilisateur de valider cette étape.
|
||||
Add an email: Ajouter une adresse email
|
||||
Remove an email: Enlever cette adresse email
|
||||
Any email: Aucune adresse email
|
||||
Previous dest without reaction: Workflows clotûrés après action d'un autre utilisateur
|
||||
Previous workflow without reaction help: Liste des workflows où vous avez été cité comme pouvant réagir à une étape, mais où un autre utilisateur a exécuté une action avant vous.
|
||||
Previous transitionned: Anciens workflows
|
||||
Previous workflow transitionned help: Workflows où vous avez exécuté une action.
|
||||
For: Pour
|
||||
|
||||
|
||||
Subscribe final: Recevoir une notification à l'étape finale
|
||||
Subscribe all steps: Recevoir une notification à chaque étape
|
||||
|
||||
notification:
|
||||
Notification: Notification
|
||||
Notifications: Notifications
|
||||
My own notifications: Mes notifications
|
||||
Notify: Envoyer une notification
|
||||
Send: Envoyer
|
||||
Edit notification: Modifier une notification
|
||||
Notification created: Notification envoyée
|
||||
Notification updated: La notification a été mise à jour
|
||||
Any notification received: Aucune notification reçue
|
||||
Any notification sent: Aucune notification envoyée
|
||||
Notifications received: Notifications reçues
|
||||
Notifications sent: Notifications envoyées
|
||||
comment_appended: Commentaire ajouté
|
||||
append_comment: Ajouter un commentaire
|
||||
comment_updated: Commentaire mis à jour
|
||||
comments_list: Fil de commentaires
|
||||
show notification from %sender%: Voir la notification de %sender%
|
||||
is_unread: Non-lue
|
||||
is_system: notification automatique
|
||||
list: Notifications
|
||||
Sent: Envoyé
|
||||
to: À
|
||||
sent_to: Destinataire(s)
|
||||
from: De
|
||||
received_from: Expéditeur
|
||||
you were notified by %sender%: Vous avez été notifié par %sender%
|
||||
you were notified by system: Vous avez été notifié automatiquement
|
||||
subject: Objet
|
||||
see_comments_thread: Voir le fil de commentaires associé
|
||||
object_prefix: "[CHILL] notification - "
|
||||
dest by email: Lien d'accès par email
|
||||
Any email: Aucun email
|
||||
Add an email: Ajouter un email
|
||||
dest by email help: Les adresses email mentionnées ici recevront un lien d'accès. Un compte utilisateur sera toujours nécessaire.
|
||||
Remove an email: Supprimer l'adresse email
|
||||
Email with access link: Adresse email ayant reçu un lien d'accès
|
||||
|
||||
|
Reference in New Issue
Block a user