Merge branch 'issue566_commentaire_fonctionnalites' into 'master'

Issue566 commentaire fonctionnalites

See merge request Chill-Projet/chill-bundles!416
This commit is contained in:
Julien Fastré 2022-04-28 15:33:06 +00:00
commit 86a7bb5880
6 changed files with 46 additions and 8 deletions

View File

@ -35,7 +35,8 @@ and this project adheres to
* [Accompanying period work evaluations] list documents associated to a work by creation date, and then by id, from the most recent to older * [Accompanying period work evaluations] list documents associated to a work by creation date, and then by id, from the most recent to older
* [Course comment] add validationConstraint NotNull and NotBlank on comment content, to avoid sql error * [Course comment] add validationConstraint NotNull and NotBlank on comment content, to avoid sql error
* [Notifications] delay the sending of notificaiton to kernel.terminate * [Notifications] delay the sending of notificaiton to kernel.terminate
* [Notifications / Period user change] fix the sending of notification when user changes * [Notifications / Period user change] fix the sending of notification when user changes
* [parcours]: Comments can be unpinned + edit/delete for all users that are allowed to edit parcours (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/566)
* [Activity form] invert 'incoming' and 'receiving' in Activity form * [Activity form] invert 'incoming' and 'receiving' in Activity form
* [Activity form] keep the same order for 'attendee' field in new and edit form * [Activity form] keep the same order for 'attendee' field in new and edit form
* [list with period] use "sameas" test operator to introduce requestor in list * [list with period] use "sameas" test operator to introduce requestor in list

View File

@ -186,6 +186,24 @@ class AccompanyingCourseCommentController extends AbstractController
]); ]);
} }
/**
* @Route("/{_locale}/parcours/comment/{id}/unpin", name="chill_person_accompanying_period_comment_unpin")
*/
public function unpinComment(AccompanyingPeriod\Comment $comment): Response
{
$this->denyAccessUnlessGranted(AccompanyingPeriodVoter::EDIT, $comment->getAccompanyingPeriod());
$comment->getAccompanyingPeriod()->setPinnedComment(null);
$this->getDoctrine()->getManager()->flush();
$this->addFlash('success', $this->translator->trans('accompanying_course.comment is unpinned'));
return $this->redirectToRoute('chill_person_accompanying_period_comment_list', [
'accompanying_period_id' => $comment->getAccompanyingPeriod()->getId(),
]);
}
private function createCommentForm(AccompanyingPeriod\Comment $comment, string $step): FormInterface private function createCommentForm(AccompanyingPeriod\Comment $comment, string $step): FormInterface
{ {
return $this->formFactory->createNamed($step, AccompanyingCourseCommentType::class, $comment); return $this->formFactory->createNamed($step, AccompanyingCourseCommentType::class, $comment);

View File

@ -1258,10 +1258,6 @@ class AccompanyingPeriod implements
*/ */
public function setPinnedComment(?Comment $comment = null): self public function setPinnedComment(?Comment $comment = null): self
{ {
if (null !== $this->pinnedComment) {
$this->removeComment($this->pinnedComment);
}
if (null !== $this->pinnedComment) { if (null !== $this->pinnedComment) {
$this->addComment($this->pinnedComment); $this->addComment($this->pinnedComment);
} }

View File

@ -8,6 +8,17 @@
{% macro recordAction(comment, isPinned) %} {% macro recordAction(comment, isPinned) %}
{% if isPinned is defined and isPinned == true %} {% if isPinned is defined and isPinned == true %}
<li>
<form method="post" action="{{ chill_path_forward_return_path('chill_person_accompanying_period_comment_unpin', {'id': comment.id}) }}">
<button class="btn btn-sm btn-misc" type="submit">
<span class="fa-stack">
<i class="fa fa-flag fa-stack-1x"></i>
<i class="fa fa-ban fa-stack-2x text-danger"></i>
</span>
{{ 'Unpin comment'|trans }}
</button>
</form>
</li>
{% else %} {% else %}
<li> <li>
<form method="post" action="{{ chill_path_forward_return_path('chill_person_accompanying_period_comment_pin', {'id': comment.id}) }}"> <form method="post" action="{{ chill_path_forward_return_path('chill_person_accompanying_period_comment_pin', {'id': comment.id}) }}">
@ -17,7 +28,7 @@
</form> </form>
</li> </li>
{% endif %} {% endif %}
{% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_COMMENT_EDIT', comment) %} {% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE', comment.accompanyingPeriod) %}
<li> <li>
<a class="btn btn-sm btn-edit" title="{{ 'Edit'|trans }}" href="{{ path('chill_person_accompanying_period_comment_list', { <a class="btn btn-sm btn-edit" title="{{ 'Edit'|trans }}" href="{{ path('chill_person_accompanying_period_comment_list', {
'_fragment': 'comment-' ~ comment.id, '_fragment': 'comment-' ~ comment.id,
@ -26,7 +37,7 @@
}) }}"></a> }) }}"></a>
</li> </li>
{% endif %} {% endif %}
{% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_COMMENT_DELETE', comment) %} {% if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE', comment.accompanyingPeriod) %}
<li> <li>
<a class="btn btn-sm btn-delete" title="{{ 'Delete'|trans }}" href="{{ path('chill_person_accompanying_period_comment_delete', {'id': comment.id}) }}"></a> <a class="btn btn-sm btn-delete" title="{{ 'Delete'|trans }}" href="{{ path('chill_person_accompanying_period_comment_delete', {'id': comment.id}) }}"></a>
</li> </li>

View File

@ -14,6 +14,7 @@ namespace Chill\PersonBundle\Security\Authorization;
use Chill\PersonBundle\Entity\AccompanyingPeriod\Comment; use Chill\PersonBundle\Entity\AccompanyingPeriod\Comment;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter; use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
use UnexpectedValueException; use UnexpectedValueException;
class AccompanyingPeriodCommentVoter extends Voter class AccompanyingPeriodCommentVoter extends Voter
@ -22,6 +23,13 @@ class AccompanyingPeriodCommentVoter extends Voter
public const EDIT = 'CHILL_PERSON_ACCOMPANYING_PERIOD_COMMENT_EDIT'; public const EDIT = 'CHILL_PERSON_ACCOMPANYING_PERIOD_COMMENT_EDIT';
private Security $security;
public function __construct(Security $security)
{
$this->security = $security;
}
protected function supports($attribute, $subject) protected function supports($attribute, $subject)
{ {
return $subject instanceof Comment; return $subject instanceof Comment;
@ -32,8 +40,10 @@ class AccompanyingPeriodCommentVoter extends Voter
/** @var Comment $subject */ /** @var Comment $subject */
switch ($attribute) { switch ($attribute) {
case self::EDIT: case self::EDIT:
return $this->security->isGranted(AccompanyingPeriodVoter::EDIT, $subject->getAccompanyingPeriod());
case self::DELETE: case self::DELETE:
return $subject->getCreator() === $token->getUser(); return $this->security->isGranted(AccompanyingPeriodVoter::EDIT, $subject->getAccompanyingPeriod());
default: default:
throw new UnexpectedValueException("This attribute {$attribute} is not supported"); throw new UnexpectedValueException("This attribute {$attribute} is not supported");

View File

@ -465,6 +465,7 @@ fix it: Compléter
accompanying_course: accompanying_course:
administrative_location: Localisation administrative administrative_location: Localisation administrative
comment is pinned: Le commentaire est épinglé comment is pinned: Le commentaire est épinglé
comment is unpinned: Le commentaire est désépinglé
show: Montrer show: Montrer
hide: Masquer hide: Masquer
closed periods: parcours clôturer closed periods: parcours clôturer
@ -474,6 +475,7 @@ Accompanying Course Comment: Commentaire
Accompanying Course Comment list: Commentaires du parcours Accompanying Course Comment list: Commentaires du parcours
pinned: épinglé pinned: épinglé
Pin comment: Épingler Pin comment: Épingler
Unpin comment: Désépingler
Post a new comment: Poster un nouveau commentaire Post a new comment: Poster un nouveau commentaire
Write a new comment: Écrire un nouveau commentaire Write a new comment: Écrire un nouveau commentaire
Edit a comment: Modifier le commentaire Edit a comment: Modifier le commentaire