mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Resolve "Afficher les noms des usagers et l'entité concerné par l'entité notifiée dans la liste des notifications"
This commit is contained in:
parent
9e191f1b5b
commit
9a5fd67842
6
.changes/unreleased/Feature-20250123-122736.yaml
Normal file
6
.changes/unreleased/Feature-20250123-122736.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
kind: Feature
|
||||||
|
body: 'Notification list: display the concerned person''s badges in the list'
|
||||||
|
time: 2025-01-23T12:27:36.851039416+01:00
|
||||||
|
custom:
|
||||||
|
Issue: "319"
|
||||||
|
SchemaChange: No schema change
|
@ -15,10 +15,13 @@ use Chill\ActivityBundle\Entity\Activity;
|
|||||||
use Chill\ActivityBundle\Repository\ActivityRepository;
|
use Chill\ActivityBundle\Repository\ActivityRepository;
|
||||||
use Chill\MainBundle\Entity\Notification;
|
use Chill\MainBundle\Entity\Notification;
|
||||||
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
||||||
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
|
use Symfony\Component\Translation\TranslatableMessage;
|
||||||
|
use Symfony\Contracts\Translation\TranslatableInterface;
|
||||||
|
|
||||||
final readonly class ActivityNotificationHandler implements NotificationHandlerInterface
|
final readonly class ActivityNotificationHandler implements NotificationHandlerInterface
|
||||||
{
|
{
|
||||||
public function __construct(private ActivityRepository $activityRepository) {}
|
public function __construct(private ActivityRepository $activityRepository, private TranslatableStringHelperInterface $translatableStringHelper) {}
|
||||||
|
|
||||||
public function getTemplate(Notification $notification, array $options = []): string
|
public function getTemplate(Notification $notification, array $options = []): string
|
||||||
{
|
{
|
||||||
@ -37,4 +40,30 @@ final readonly class ActivityNotificationHandler implements NotificationHandlerI
|
|||||||
{
|
{
|
||||||
return Activity::class === $notification->getRelatedEntityClass();
|
return Activity::class === $notification->getRelatedEntityClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle(Notification $notification, array $options = []): TranslatableInterface
|
||||||
|
{
|
||||||
|
if (null === $activity = $this->getRelatedEntity($notification)) {
|
||||||
|
return new TranslatableMessage('activity.deleted');
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TranslatableMessage('activity.title', [
|
||||||
|
'date' => $activity->getDate(),
|
||||||
|
'type' => $this->translatableStringHelper->localize($activity->getActivityType()->getName()),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAssociatedPersons(Notification $notification, array $options = []): array
|
||||||
|
{
|
||||||
|
if (null === $activity = $this->getRelatedEntity($notification)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $activity->getPersonsAssociated();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRelatedEntity(Notification $notification): ?Activity
|
||||||
|
{
|
||||||
|
return $this->activityRepository->find($notification->getRelatedEntityId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,3 +14,5 @@ export:
|
|||||||
describe_action_with_subject: >-
|
describe_action_with_subject: >-
|
||||||
Filtré par personne ayant eu un échange entre le {date_from, date} et le {date_to, date}, et un de ces sujets choisis: {reasons}
|
Filtré par personne ayant eu un échange entre le {date_from, date} et le {date_to, date}, et un de ces sujets choisis: {reasons}
|
||||||
|
|
||||||
|
activity:
|
||||||
|
title: Échange du {date, date, long} - {type}
|
||||||
|
@ -101,6 +101,7 @@ activity:
|
|||||||
Insert a document: Insérer un document
|
Insert a document: Insérer un document
|
||||||
Remove a document: Supprimer le document
|
Remove a document: Supprimer le document
|
||||||
comment: Commentaire
|
comment: Commentaire
|
||||||
|
deleted: Échange supprimé
|
||||||
No documents: Aucun document
|
No documents: Aucun document
|
||||||
|
|
||||||
# activity filter in list page
|
# activity filter in list page
|
||||||
|
@ -69,7 +69,7 @@ final readonly class AccompanyingCourseDocumentWorkflowHandler implements Entity
|
|||||||
return $this->translator->trans('workflow.Document deleted');
|
return $this->translator->trans('workflow.Document deleted');
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->translator->trans('workflow.Document (n°%doc%)', ['%doc%' => $entityWorkflow->getRelatedEntityId()])
|
return $this->translator->trans('entity_display_title.Document (n°%doc%)', ['%doc%' => $entityWorkflow->getRelatedEntityId()])
|
||||||
.' - '.$doc->getTitle();
|
.' - '.$doc->getTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,3 +94,7 @@ CHILL_ACCOMPANYING_COURSE_DOCUMENT_DELETE: Supprimer un document
|
|||||||
CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE: Voir les documents
|
CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE: Voir les documents
|
||||||
CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE_DETAILS: Voir les détails d'un document
|
CHILL_ACCOMPANYING_COURSE_DOCUMENT_SEE_DETAILS: Voir les détails d'un document
|
||||||
CHILL_ACCOMPANYING_COURSE_DOCUMENT_UPDATE: Modifier un document
|
CHILL_ACCOMPANYING_COURSE_DOCUMENT_UPDATE: Modifier un document
|
||||||
|
|
||||||
|
entity_display_title:
|
||||||
|
Document (n°%doc%): "Document (n°%doc%)"
|
||||||
|
Doc for evaluation (n°%eval%): Document de l'évaluation n°%eval%
|
||||||
|
@ -0,0 +1,2 @@
|
|||||||
|
entity_display_title:
|
||||||
|
Doc for evaluation (n°%eval%): Evaluatiedocument (n°%eval%)
|
@ -309,6 +309,7 @@ class NotificationController extends AbstractController
|
|||||||
$templateData[] = [
|
$templateData[] = [
|
||||||
'template' => $this->notificationHandlerManager->getTemplate($notification),
|
'template' => $this->notificationHandlerManager->getTemplate($notification),
|
||||||
'template_data' => $this->notificationHandlerManager->getTemplateData($notification),
|
'template_data' => $this->notificationHandlerManager->getTemplateData($notification),
|
||||||
|
'handler' => $this->notificationHandlerManager->getHandler($notification),
|
||||||
'notification' => $notification,
|
'notification' => $notification,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ declare(strict_types=1);
|
|||||||
namespace Chill\MainBundle\Notification;
|
namespace Chill\MainBundle\Notification;
|
||||||
|
|
||||||
use Chill\MainBundle\Entity\Notification;
|
use Chill\MainBundle\Entity\Notification;
|
||||||
|
use Symfony\Contracts\Translation\TranslatableInterface;
|
||||||
|
|
||||||
interface NotificationHandlerInterface
|
interface NotificationHandlerInterface
|
||||||
{
|
{
|
||||||
@ -29,4 +30,13 @@ interface NotificationHandlerInterface
|
|||||||
* Return true if the handler supports the handling for this notification.
|
* Return true if the handler supports the handling for this notification.
|
||||||
*/
|
*/
|
||||||
public function supports(Notification $notification, array $options = []): bool;
|
public function supports(Notification $notification, array $options = []): bool;
|
||||||
|
|
||||||
|
public function getTitle(Notification $notification, array $options = []): TranslatableInterface;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* return list<Person>
|
||||||
|
*/
|
||||||
|
public function getAssociatedPersons(Notification $notification, array $options = []): array;
|
||||||
|
|
||||||
|
public function getRelatedEntity(Notification $notification): ?object;
|
||||||
}
|
}
|
||||||
|
@ -13,11 +13,10 @@ namespace Chill\MainBundle\Notification;
|
|||||||
|
|
||||||
use Chill\MainBundle\Entity\Notification;
|
use Chill\MainBundle\Entity\Notification;
|
||||||
use Chill\MainBundle\Notification\Exception\NotificationHandlerNotFound;
|
use Chill\MainBundle\Notification\Exception\NotificationHandlerNotFound;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
|
||||||
|
|
||||||
final readonly class NotificationHandlerManager
|
final readonly class NotificationHandlerManager
|
||||||
{
|
{
|
||||||
public function __construct(private iterable $handlers, private EntityManagerInterface $em) {}
|
public function __construct(private iterable $handlers) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throw NotificationHandlerNotFound if handler is not found
|
* @throw NotificationHandlerNotFound if handler is not found
|
||||||
|
@ -10,6 +10,19 @@ div.notification {
|
|||||||
margin-right: 0.3em;
|
margin-right: 0.3em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
h4.notification-subtitle {
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
}
|
||||||
|
ul.notification-related-entities {
|
||||||
|
margin: 0.5rem 0;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
& > li {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
div.read {
|
div.read {
|
||||||
h2.notification-title,
|
h2.notification-title,
|
||||||
h6.notification-title {
|
h6.notification-title {
|
||||||
@ -52,7 +65,7 @@ div.notification-show {
|
|||||||
li {
|
li {
|
||||||
span.item-key {
|
span.item-key {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 3em;
|
padding: 0.1em 0.3rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,44 @@
|
|||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
{% macro insert_onthefly(type, entity, parent = null) %}
|
||||||
|
{% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with {
|
||||||
|
action: 'show', displayBadge: true,
|
||||||
|
targetEntity: { name: type, id: entity.id },
|
||||||
|
buttonText: entity|chill_entity_render_string,
|
||||||
|
isDead: entity.deathdate is defined and entity.deathdate is not null,
|
||||||
|
parent: parent
|
||||||
|
} %}
|
||||||
|
{% endmacro %}
|
||||||
|
|
||||||
|
{% macro relatedEntity(c) %}
|
||||||
|
{% if c.data is defined %}
|
||||||
|
{% set notification = c.data.notification %}
|
||||||
|
{% set handler = c.data.handler %}
|
||||||
|
<div class="item-row">
|
||||||
|
<h4 class="notification-subtitle">
|
||||||
|
<span>{{ handler.getTitle(notification)|trans }}</span>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
{% set associateds = handler.getAssociatedPersons(notification) %}
|
||||||
|
{% if associateds|length > 0 %}
|
||||||
|
<div class="item-row">
|
||||||
|
<ul class="notification-related-entities">
|
||||||
|
{% for ap in associateds %}
|
||||||
|
<li>
|
||||||
|
{% if ap.person is defined %}
|
||||||
|
{{ _self.insert_onthefly('person', ap.person) }}
|
||||||
|
{% else %}
|
||||||
|
{{ _self.insert_onthefly('person', ap) }}
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
|
{% endmacro %}
|
||||||
{% macro header(c) %}
|
{% macro header(c) %}
|
||||||
<div class="item-row notification-header mt-2">
|
<div class="item-row notification-header mt-2">
|
||||||
<div class="item-col">
|
<div class="item-col">
|
||||||
@ -185,6 +223,7 @@
|
|||||||
>
|
>
|
||||||
{{ _self.title(_context) }}
|
{{ _self.title(_context) }}
|
||||||
</button>
|
</button>
|
||||||
|
{{ _self.relatedEntity(_context) }}
|
||||||
{{ _self.header(_context) }}
|
{{ _self.header(_context) }}
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@ -198,6 +237,7 @@
|
|||||||
{{ _self.actions(_context) }}
|
{{ _self.actions(_context) }}
|
||||||
{% else %}
|
{% else %}
|
||||||
{{ _self.title(_context) }}
|
{{ _self.title(_context) }}
|
||||||
|
{{ _self.relatedEntity(_context) }}
|
||||||
{{ _self.header(_context) }}
|
{{ _self.header(_context) }}
|
||||||
{{ _self.content(_context) }}
|
{{ _self.content(_context) }}
|
||||||
{{ _self.actions(_context) }}
|
{{ _self.actions(_context) }}
|
||||||
|
@ -23,7 +23,9 @@
|
|||||||
{% include '@ChillMain/Notification/_list_item.html.twig' with {
|
{% include '@ChillMain/Notification/_list_item.html.twig' with {
|
||||||
'data': {
|
'data': {
|
||||||
'template': handler.getTemplate(notification),
|
'template': handler.getTemplate(notification),
|
||||||
'template_data': handler.getTemplateData(notification)
|
'template_data': handler.getTemplateData(notification),
|
||||||
|
'handler': handler,
|
||||||
|
'notification': notification
|
||||||
},
|
},
|
||||||
'action_button': false,
|
'action_button': false,
|
||||||
'full_content': true,
|
'full_content': true,
|
||||||
|
@ -11,5 +11,5 @@
|
|||||||
}) %}
|
}) %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h2>{{ 'workflow.deleted_title'|trans }}</h2>
|
<h2>{{ 'workflow.deleted'|trans }}</h2>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -17,6 +17,8 @@ use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
|||||||
use Chill\MainBundle\Repository\Workflow\EntityWorkflowRepository;
|
use Chill\MainBundle\Repository\Workflow\EntityWorkflowRepository;
|
||||||
use Chill\MainBundle\Workflow\EntityWorkflowManager;
|
use Chill\MainBundle\Workflow\EntityWorkflowManager;
|
||||||
use Symfony\Component\Security\Core\Security;
|
use Symfony\Component\Security\Core\Security;
|
||||||
|
use Symfony\Component\Translation\TranslatableMessage;
|
||||||
|
use Symfony\Contracts\Translation\TranslatableInterface;
|
||||||
|
|
||||||
class WorkflowNotificationHandler implements NotificationHandlerInterface
|
class WorkflowNotificationHandler implements NotificationHandlerInterface
|
||||||
{
|
{
|
||||||
@ -29,7 +31,7 @@ class WorkflowNotificationHandler implements NotificationHandlerInterface
|
|||||||
|
|
||||||
public function getTemplateData(Notification $notification, array $options = []): array
|
public function getTemplateData(Notification $notification, array $options = []): array
|
||||||
{
|
{
|
||||||
$entityWorkflow = $this->entityWorkflowRepository->find($notification->getRelatedEntityId());
|
$entityWorkflow = $this->getRelatedEntity($notification);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'entity_workflow' => $entityWorkflow,
|
'entity_workflow' => $entityWorkflow,
|
||||||
@ -61,4 +63,29 @@ class WorkflowNotificationHandler implements NotificationHandlerInterface
|
|||||||
{
|
{
|
||||||
return EntityWorkflow::class === $notification->getRelatedEntityClass();
|
return EntityWorkflow::class === $notification->getRelatedEntityClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle(Notification $notification, array $options = []): TranslatableInterface
|
||||||
|
{
|
||||||
|
if (null === $entityWorkflow = $this->getRelatedEntity($notification)) {
|
||||||
|
return new TranslatableMessage('workflow.deleted');
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TranslatableMessage($this->entityWorkflowManager->getHandler($entityWorkflow)->getEntityTitle($entityWorkflow));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAssociatedPersons(Notification $notification, array $options = []): array
|
||||||
|
{
|
||||||
|
if (null === $entityWorkflow = $this->getRelatedEntity($notification)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$associatedPersons = $this->entityWorkflowManager->getHandler($entityWorkflow)->getEntityData($entityWorkflow)['persons'];
|
||||||
|
|
||||||
|
return is_array($associatedPersons) ? $associatedPersons : $associatedPersons->getValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRelatedEntity(Notification $notification): ?EntityWorkflow
|
||||||
|
{
|
||||||
|
return $this->entityWorkflowRepository->find($notification->getRelatedEntityId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -508,6 +508,7 @@ Follow workflow: Suivre la décision
|
|||||||
Workflow history: Historique de la décision
|
Workflow history: Historique de la décision
|
||||||
|
|
||||||
workflow:
|
workflow:
|
||||||
|
deleted: Workflow supprimé
|
||||||
Created by: Créé par
|
Created by: Créé par
|
||||||
My decision: Ma décision
|
My decision: Ma décision
|
||||||
Next step: Prochaine étape
|
Next step: Prochaine étape
|
||||||
@ -526,9 +527,6 @@ workflow:
|
|||||||
Only those users are allowed: Seuls ces utilisateurs sont autorisés
|
Only those users are allowed: Seuls ces utilisateurs sont autorisés
|
||||||
My workflows: Mes workflows
|
My workflows: Mes workflows
|
||||||
No workflow: Aucun workflow
|
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
|
subscribed: Workflows suivis
|
||||||
cc: Workflows dont je suis en copie
|
cc: Workflows dont je suis en copie
|
||||||
dest: Workflows en attente d'action
|
dest: Workflows en attente d'action
|
||||||
@ -575,7 +573,6 @@ workflow:
|
|||||||
transition_destinee_emails_help: Le lien sécurisé sera envoyé à chaque adresse indiquée
|
transition_destinee_emails_help: Le lien sécurisé sera envoyé à chaque adresse indiquée
|
||||||
sent_through_secured_link: Envoi par lien sécurisé
|
sent_through_secured_link: Envoi par lien sécurisé
|
||||||
public_views_by_ip: Visualisation par adresse IP
|
public_views_by_ip: Visualisation par adresse IP
|
||||||
deleted_title: Workflow supprimé
|
|
||||||
May not associate a document: Le workflow ne concerne pas un document
|
May not associate a document: Le workflow ne concerne pas un document
|
||||||
|
|
||||||
public_link:
|
public_link:
|
||||||
|
@ -395,9 +395,6 @@ workflow:
|
|||||||
Only those users are allowed: Seuls ces utilisateurs sont autorisés
|
Only those users are allowed: Seuls ces utilisateurs sont autorisés
|
||||||
My workflows: Mes workflows
|
My workflows: Mes workflows
|
||||||
No workflow: Aucun workflow
|
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
|
subscribed: Workflows suivis
|
||||||
dest: Workflows en attente d'action
|
dest: Workflows en attente d'action
|
||||||
cc: Workflows dont je suis en copie
|
cc: Workflows dont je suis en copie
|
||||||
|
@ -15,6 +15,8 @@ use Chill\MainBundle\Entity\Notification;
|
|||||||
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
use Chill\PersonBundle\Repository\AccompanyingPeriodRepository;
|
use Chill\PersonBundle\Repository\AccompanyingPeriodRepository;
|
||||||
|
use Symfony\Component\Translation\TranslatableMessage;
|
||||||
|
use Symfony\Contracts\Translation\TranslatableInterface;
|
||||||
|
|
||||||
final readonly class AccompanyingPeriodNotificationHandler implements NotificationHandlerInterface
|
final readonly class AccompanyingPeriodNotificationHandler implements NotificationHandlerInterface
|
||||||
{
|
{
|
||||||
@ -37,4 +39,27 @@ final readonly class AccompanyingPeriodNotificationHandler implements Notificati
|
|||||||
{
|
{
|
||||||
return AccompanyingPeriod::class === $notification->getRelatedEntityClass();
|
return AccompanyingPeriod::class === $notification->getRelatedEntityClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle(Notification $notification, array $options = []): TranslatableInterface
|
||||||
|
{
|
||||||
|
if (null === $period = $this->getRelatedEntity($notification)) {
|
||||||
|
return new TranslatableMessage('accompanying_period.deleted');
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TranslatableMessage('periods.title', ['id' => $period->getId()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAssociatedPersons(Notification $notification, array $options = []): array
|
||||||
|
{
|
||||||
|
if (null === $period = $this->getRelatedEntity($notification)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $period->getParticipations()->getValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRelatedEntity(Notification $notification): ?AccompanyingPeriod
|
||||||
|
{
|
||||||
|
return $this->accompanyingPeriodRepository->find($notification->getRelatedEntityId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,8 @@ use Chill\MainBundle\Entity\Notification;
|
|||||||
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocument;
|
||||||
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocumentRepository;
|
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkEvaluationDocumentRepository;
|
||||||
|
use Symfony\Component\Translation\TranslatableMessage;
|
||||||
|
use Symfony\Contracts\Translation\TranslatableInterface;
|
||||||
|
|
||||||
final readonly class AccompanyingPeriodWorkEvaluationDocumentNotificationHandler implements NotificationHandlerInterface
|
final readonly class AccompanyingPeriodWorkEvaluationDocumentNotificationHandler implements NotificationHandlerInterface
|
||||||
{
|
{
|
||||||
@ -38,4 +40,33 @@ final readonly class AccompanyingPeriodWorkEvaluationDocumentNotificationHandler
|
|||||||
{
|
{
|
||||||
return AccompanyingPeriodWorkEvaluationDocument::class === $notification->getRelatedEntityClass();
|
return AccompanyingPeriodWorkEvaluationDocument::class === $notification->getRelatedEntityClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle(Notification $notification, array $options = []): TranslatableInterface
|
||||||
|
{
|
||||||
|
if (null === $eval = $this->getRelatedEntity($notification)) {
|
||||||
|
return new TranslatableMessage('evaluation.deleted');
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TranslatableMessage(
|
||||||
|
'accompanying_course_evaluation_document.title',
|
||||||
|
[
|
||||||
|
'id' => $eval->getId(),
|
||||||
|
'doc_title' => $eval->getTitle(),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAssociatedPersons(Notification $notification, array $options = []): array
|
||||||
|
{
|
||||||
|
if (null === $eval = $this->getRelatedEntity($notification)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $eval->getAccompanyingPeriodWorkEvaluation()->getAccompanyingPeriodWork()->getPersons()->getValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRelatedEntity(Notification $notification): ?AccompanyingPeriodWorkEvaluationDocument
|
||||||
|
{
|
||||||
|
return $this->accompanyingPeriodWorkEvaluationDocumentRepository->find($notification->getRelatedEntityId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,12 +13,15 @@ namespace Chill\PersonBundle\Notification;
|
|||||||
|
|
||||||
use Chill\MainBundle\Entity\Notification;
|
use Chill\MainBundle\Entity\Notification;
|
||||||
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
use Chill\MainBundle\Notification\NotificationHandlerInterface;
|
||||||
|
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
|
||||||
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork;
|
||||||
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkRepository;
|
use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkRepository;
|
||||||
|
use Symfony\Component\Translation\TranslatableMessage;
|
||||||
|
use Symfony\Contracts\Translation\TranslatableInterface;
|
||||||
|
|
||||||
final readonly class AccompanyingPeriodWorkNotificationHandler implements NotificationHandlerInterface
|
final readonly class AccompanyingPeriodWorkNotificationHandler implements NotificationHandlerInterface
|
||||||
{
|
{
|
||||||
public function __construct(private AccompanyingPeriodWorkRepository $accompanyingPeriodWorkRepository) {}
|
public function __construct(private AccompanyingPeriodWorkRepository $accompanyingPeriodWorkRepository, private TranslatableStringHelperInterface $translatableStringHelper) {}
|
||||||
|
|
||||||
public function getTemplate(Notification $notification, array $options = []): string
|
public function getTemplate(Notification $notification, array $options = []): string
|
||||||
{
|
{
|
||||||
@ -37,4 +40,30 @@ final readonly class AccompanyingPeriodWorkNotificationHandler implements Notifi
|
|||||||
{
|
{
|
||||||
return AccompanyingPeriodWork::class === $notification->getRelatedEntityClass();
|
return AccompanyingPeriodWork::class === $notification->getRelatedEntityClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getTitle(Notification $notification, array $options = []): TranslatableInterface
|
||||||
|
{
|
||||||
|
if (null === $work = $this->getRelatedEntity($notification)) {
|
||||||
|
return new TranslatableMessage('accompanying_course_work.deleted');
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TranslatableMessage('accompanying_period_work.title', [
|
||||||
|
'id' => $work->getId(),
|
||||||
|
'action_title' => $this->translatableStringHelper->localize($work->getSocialAction()->getTitle()),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAssociatedPersons(Notification $notification, array $options = []): array
|
||||||
|
{
|
||||||
|
if (null === $work = $this->getRelatedEntity($notification)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $work->getPersons()->getValues();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRelatedEntity(Notification $notification): ?AccompanyingPeriodWork
|
||||||
|
{
|
||||||
|
return $this->accompanyingPeriodWorkRepository->find($notification->getRelatedEntityId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ export default {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss" scoped>
|
||||||
.filtered {
|
.filtered {
|
||||||
filter: grayscale(1) opacity(0.6);
|
filter: grayscale(1) opacity(0.6);
|
||||||
}
|
}
|
||||||
|
@ -372,7 +372,11 @@ export default {
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss" scoped>
|
||||||
|
@import "ChillMainAssets/module/bootstrap/shared";
|
||||||
|
@import "ChillPersonAssets/chill/scss/mixins";
|
||||||
|
@import "ChillMainAssets/chill/scss/chill_variables";
|
||||||
|
|
||||||
.lastname:before {
|
.lastname:before {
|
||||||
content: " ";
|
content: " ";
|
||||||
}
|
}
|
||||||
@ -384,6 +388,12 @@ div.flex-table {
|
|||||||
width: 33%;
|
width: 33%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@include media-breakpoint-down(sm) {
|
||||||
|
div.item-col:first-child {
|
||||||
|
width: unset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
div.item-col:last-child {
|
div.item-col:last-child {
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ class AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler implements EntityW
|
|||||||
}
|
}
|
||||||
|
|
||||||
return $this->translator->trans(
|
return $this->translator->trans(
|
||||||
'workflow.Doc for evaluation (n°%eval%)',
|
'entity_display_title.Doc for evaluation (n°%eval%)',
|
||||||
['%eval%' => $entityWorkflow->getRelatedEntityId()]
|
['%eval%' => $entityWorkflow->getRelatedEntityId()]
|
||||||
).' ('.$this->translatableStringHelper->localize($doc->getAccompanyingPeriodWorkEvaluation()
|
).' ('.$this->translatableStringHelper->localize($doc->getAccompanyingPeriodWorkEvaluation()
|
||||||
->getEvaluation()->getTitle()).') '.$doc->getTitle();
|
->getEvaluation()->getTitle()).') '.$doc->getTitle();
|
||||||
|
@ -56,7 +56,7 @@ readonly class AccompanyingPeriodWorkEvaluationWorkflowHandler implements Entity
|
|||||||
$evaluation = $this->getRelatedEntity($entityWorkflow);
|
$evaluation = $this->getRelatedEntity($entityWorkflow);
|
||||||
|
|
||||||
return $this->translator->trans(
|
return $this->translator->trans(
|
||||||
'workflow.Evaluation (n°%eval%)',
|
'entity_display_title.Evaluation (n°%eval%)',
|
||||||
['%eval%' => $entityWorkflow->getRelatedEntityId()]
|
['%eval%' => $entityWorkflow->getRelatedEntityId()]
|
||||||
).' - '.$this->translatableStringHelper->localize($evaluation->getEvaluation()->getTitle());
|
).' - '.$this->translatableStringHelper->localize($evaluation->getEvaluation()->getTitle());
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ readonly class AccompanyingPeriodWorkWorkflowHandler implements EntityWorkflowHa
|
|||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
$this->translator->trans('workflow.Work (n°%w%)', ['%w%' => $entityWorkflow->getRelatedEntityId()])
|
$this->translator->trans('entity_display_title.Work (n°%w%)', ['%w%' => $entityWorkflow->getRelatedEntityId()])
|
||||||
.' - '.$this->translatableStringHelper->localize($work->getSocialAction()->getTitle());
|
.' - '.$this->translatableStringHelper->localize($work->getSocialAction()->getTitle());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +118,7 @@ household_composition:
|
|||||||
}
|
}
|
||||||
|
|
||||||
periods:
|
periods:
|
||||||
|
title: Parcours d'accompagnement (n°{id})
|
||||||
show closed periods: >-
|
show closed periods: >-
|
||||||
{nb_items, plural,
|
{nb_items, plural,
|
||||||
=0 {Aucun parcours clôturé}
|
=0 {Aucun parcours clôturé}
|
||||||
@ -177,5 +178,9 @@ exports:
|
|||||||
}
|
}
|
||||||
|
|
||||||
accompanying_course_evaluation_document:
|
accompanying_course_evaluation_document:
|
||||||
|
title: Évaluation (n°{id}) - {doc_title}
|
||||||
duplicated_at: >-
|
duplicated_at: >-
|
||||||
Dupliqué le {at, date, long} à {at, time, short}
|
Dupliqué le {at, date, long} à {at, time, short}
|
||||||
|
|
||||||
|
accompanying_period_work:
|
||||||
|
title: Action d'accompagnement (n°{id}) - {action_title}
|
||||||
|
@ -732,6 +732,7 @@ origin:
|
|||||||
noActiveAfter: désactivé après
|
noActiveAfter: désactivé après
|
||||||
|
|
||||||
evaluation:
|
evaluation:
|
||||||
|
deleted: Évaluation supprimé
|
||||||
delay: Délai
|
delay: Délai
|
||||||
notificationDelay: Délai de notification
|
notificationDelay: Délai de notification
|
||||||
url: Lien internet
|
url: Lien internet
|
||||||
@ -788,6 +789,7 @@ person_admin:
|
|||||||
|
|
||||||
# specific to accompanying period
|
# specific to accompanying period
|
||||||
accompanying_period:
|
accompanying_period:
|
||||||
|
deleted: Parcours d'accompagnment supprimé
|
||||||
dates: Période
|
dates: Période
|
||||||
dates_from_%opening_date%: Ouvert depuis le %opening_date%
|
dates_from_%opening_date%: Ouvert depuis le %opening_date%
|
||||||
dates_from_%opening_date%_to_%closing_date%: Ouvert du %opening_date% au %closing_date%
|
dates_from_%opening_date%_to_%closing_date%: Ouvert du %opening_date% au %closing_date%
|
||||||
@ -876,6 +878,7 @@ Accompanying Course Action: Action d'accompagnement
|
|||||||
Are you sure you want to remove this work of the accompanying period %name% ?: Êtes-vous sûr de vouloir supprimer cette action du parcours d'accompagnement %name% ?
|
Are you sure you want to remove this work of the accompanying period %name% ?: Êtes-vous sûr de vouloir supprimer cette action du parcours d'accompagnement %name% ?
|
||||||
The accompanying period work has been successfully removed.: L'action d'accompagnement a été supprimée.
|
The accompanying period work has been successfully removed.: L'action d'accompagnement a été supprimée.
|
||||||
accompanying_course_work:
|
accompanying_course_work:
|
||||||
|
deleted: Action d'accompagnement supprimé
|
||||||
create: Créer une action
|
create: Créer une action
|
||||||
Create accompanying course work: Créer une action d'accompagnement
|
Create accompanying course work: Créer une action d'accompagnement
|
||||||
Edit accompanying course work: Modifier une action d'accompagnement
|
Edit accompanying course work: Modifier une action d'accompagnement
|
||||||
@ -962,7 +965,6 @@ Display draft periods created by me: Affiche les parcours en attente de confirma
|
|||||||
Number of periods: Nombre de parcours
|
Number of periods: Nombre de parcours
|
||||||
|
|
||||||
workflow:
|
workflow:
|
||||||
Doc for evaluation (n°%eval%): Document de l'évaluation n°%eval%
|
|
||||||
doc for evaluation deleted: Document supprimé dans une évaluation
|
doc for evaluation deleted: Document supprimé dans une évaluation
|
||||||
SocialAction deleted: Action sociale supprimée
|
SocialAction deleted: Action sociale supprimée
|
||||||
signature_list:
|
signature_list:
|
||||||
@ -1470,3 +1472,8 @@ generic_doc:
|
|||||||
filter:
|
filter:
|
||||||
keys:
|
keys:
|
||||||
accompanying_period_work_evaluation_document: Document des actions d'accompagnement
|
accompanying_period_work_evaluation_document: Document des actions d'accompagnement
|
||||||
|
|
||||||
|
entity_display_title:
|
||||||
|
Evaluation (n°%eval%): "Évaluation (n°%eval%)"
|
||||||
|
Work (n°%w%): "Action d'accompagnement (n°%w%)"
|
||||||
|
Accompanying Course (n°%w%): "Parcours d'accompagnement (n°%w%)"
|
||||||
|
@ -578,9 +578,6 @@ Linked evaluations: Gerelateerde evaluaties
|
|||||||
My accompanying periods: Mijn hulpverleningstrajecten
|
My accompanying periods: Mijn hulpverleningstrajecten
|
||||||
My accompanying periods in draft: Mijn hulpverleningstrajecten in ontwerp
|
My accompanying periods in draft: Mijn hulpverleningstrajecten in ontwerp
|
||||||
|
|
||||||
workflow:
|
|
||||||
Doc for evaluation (n°%eval%): Evaluatiedocument n°%eval%
|
|
||||||
|
|
||||||
period_by_user_list:
|
period_by_user_list:
|
||||||
Period by user: Hulpverleningstrajecten per gebruiker
|
Period by user: Hulpverleningstrajecten per gebruiker
|
||||||
Pick a user: Selecteer een gebruiker om zijn/haar hulpverleningstrajecten te zien
|
Pick a user: Selecteer een gebruiker om zijn/haar hulpverleningstrajecten te zien
|
||||||
|
Loading…
x
Reference in New Issue
Block a user