diff --git a/.editorconfig b/.editorconfig index fe115d4c0..d51908caf 100644 --- a/.editorconfig +++ b/.editorconfig @@ -18,3 +18,10 @@ max_line_length = 80 [COMMIT_EDITMSG] max_line_length = 0 +<<<<<<< Updated upstream +======= + +[*.{js, vue, ts}] +indent_size = 2 +indent_style = space +>>>>>>> Stashed changes diff --git a/CHANGELOG.md b/CHANGELOG.md index 8432912a5..eed759261 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ and this project adheres to * [person] add maritalStatusComment to PersonDocGenNormalizer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/582) * Load relationships without gender in french fixtures * Add command to remove old draft accompanying periods +* [parcours]: If users assings him/herself as referrer and job is not null. Update parcours job (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/578) ### 2021-04-28 diff --git a/src/Bundle/ChillActivityBundle/Entity/Activity.php b/src/Bundle/ChillActivityBundle/Entity/Activity.php index 0c0632722..db0d5c7d1 100644 --- a/src/Bundle/ChillActivityBundle/Entity/Activity.php +++ b/src/Bundle/ChillActivityBundle/Entity/Activity.php @@ -15,6 +15,7 @@ use Chill\ActivityBundle\Validator\Constraints as ActivityValidator; use Chill\DocStoreBundle\Entity\StoredObject; use Chill\MainBundle\Entity\Center; use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; +use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable; use Chill\MainBundle\Entity\HasCenterInterface; use Chill\MainBundle\Entity\HasScopeInterface; use Chill\MainBundle\Entity\Location; @@ -134,6 +135,12 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac */ private ?Collection $persons = null; + /** + * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable", columnPrefix="privateComment_") + * @Groups({"docgen:read"}) + */ + private PrivateCommentEmbeddable $privateComment; + /** * @ORM\ManyToMany(targetEntity="Chill\ActivityBundle\Entity\ActivityReason") * @Groups({"docgen:read"}) @@ -193,6 +200,7 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac { $this->reasons = new ArrayCollection(); $this->comment = new CommentEmbeddable(); + $this->privateComment = new PrivateCommentEmbeddable(); $this->persons = new ArrayCollection(); $this->thirdParties = new ArrayCollection(); $this->documents = new ArrayCollection(); @@ -400,6 +408,11 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac return []; } + public function getPrivateComment(): PrivateCommentEmbeddable + { + return $this->privateComment; + } + public function getReasons(): Collection { return $this->reasons; @@ -586,6 +599,13 @@ class Activity implements AccompanyingPeriodLinkedWithSocialIssuesEntityInterfac return $this; } + public function setPrivateComment(PrivateCommentEmbeddable $privateComment): self + { + $this->privateComment = $privateComment; + + return $this; + } + public function setReasons(?ArrayCollection $reasons): self { $this->reasons = $reasons; diff --git a/src/Bundle/ChillActivityBundle/Entity/ActivityType.php b/src/Bundle/ChillActivityBundle/Entity/ActivityType.php index bdf75ed05..845b31ca2 100644 --- a/src/Bundle/ChillActivityBundle/Entity/ActivityType.php +++ b/src/Bundle/ChillActivityBundle/Entity/ActivityType.php @@ -167,6 +167,16 @@ class ActivityType */ private int $personVisible = self::FIELD_REQUIRED; + /** + * @ORM\Column(type="string", nullable=false, options={"default": ""}) + */ + private string $privateCommentLabel = ''; + + /** + * @ORM\Column(type="smallint", nullable=false, options={"default": 1}) + */ + private int $privateCommentVisible = self::FIELD_OPTIONAL; + /** * @ORM\Column(type="string", nullable=false, options={"default": ""}) */ @@ -416,6 +426,16 @@ class ActivityType return $this->personVisible; } + public function getPrivateCommentLabel(): string + { + return $this->privateCommentLabel; + } + + public function getPrivateCommentVisible(): int + { + return $this->privateCommentVisible; + } + public function getReasonsLabel(): string { return $this->reasonsLabel; @@ -688,6 +708,20 @@ class ActivityType return $this; } + public function setPrivateCommentLabel(string $privateCommentLabel): self + { + $this->privateCommentLabel = $privateCommentLabel; + + return $this; + } + + public function setPrivateCommentVisible(int $privateCommentVisible): self + { + $this->privateCommentVisible = $privateCommentVisible; + + return $this; + } + public function setReasonsLabel(string $reasonsLabel): self { $this->reasonsLabel = $reasonsLabel; diff --git a/src/Bundle/ChillActivityBundle/Form/ActivityType.php b/src/Bundle/ChillActivityBundle/Form/ActivityType.php index 6e75bde25..4c767cd54 100644 --- a/src/Bundle/ChillActivityBundle/Form/ActivityType.php +++ b/src/Bundle/ChillActivityBundle/Form/ActivityType.php @@ -20,6 +20,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Form\Type\ChillCollectionType; use Chill\MainBundle\Form\Type\ChillDateType; use Chill\MainBundle\Form\Type\CommentType; +use Chill\MainBundle\Form\Type\PrivateCommentType; use Chill\MainBundle\Form\Type\ScopePickerType; use Chill\MainBundle\Form\Type\UserPickerType; use Chill\MainBundle\Security\Authorization\AuthorizationHelper; @@ -251,6 +252,13 @@ class ActivityType extends AbstractType ]); } + if ($activityType->isVisible('privateComment')) { + $builder->add('privateComment', PrivateCommentType::class, [ + 'label' => '' === $activityType->getLabel('privateComment') ? 'private comment' : $activityType->getPrivateCommentLabel(), + 'required' => false, + ]); + } + if ($activityType->isVisible('persons')) { $builder->add('persons', HiddenType::class); $builder->get('persons') diff --git a/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php b/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php index 17d2bb914..4cdcb31f2 100644 --- a/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php +++ b/src/Bundle/ChillActivityBundle/Form/ActivityTypeType.php @@ -57,7 +57,7 @@ class ActivityTypeType extends AbstractType $fields = [ 'persons', 'user', 'date', 'location', 'persons', 'thirdParties', 'durationTime', 'travelTime', 'attendee', - 'reasons', 'sentReceived', 'documents', + 'reasons', 'comment', 'privateComment', 'sentReceived', 'documents', 'emergency', 'socialIssues', 'socialActions', 'users', ]; diff --git a/src/Bundle/ChillActivityBundle/Resources/views/Activity/edit.html.twig b/src/Bundle/ChillActivityBundle/Resources/views/Activity/edit.html.twig index 218dc37b0..8d9ee878c 100644 --- a/src/Bundle/ChillActivityBundle/Resources/views/Activity/edit.html.twig +++ b/src/Bundle/ChillActivityBundle/Resources/views/Activity/edit.html.twig @@ -83,6 +83,10 @@ {{ form_row(edit_form.comment) }} {% endif %} +{%- if edit_form.privateComment is defined -%} + {{ form_row(edit_form.privateComment) }} +{% endif %} + {%- if edit_form.attendee is defined -%} {{ form_row(edit_form.attendee) }} {% endif %} diff --git a/src/Bundle/ChillActivityBundle/Resources/views/Activity/new.html.twig b/src/Bundle/ChillActivityBundle/Resources/views/Activity/new.html.twig index 8e078702c..6f6e1fe53 100644 --- a/src/Bundle/ChillActivityBundle/Resources/views/Activity/new.html.twig +++ b/src/Bundle/ChillActivityBundle/Resources/views/Activity/new.html.twig @@ -81,10 +81,13 @@ {% endif %} {%- if form.comment is defined -%} - {# TODO .. public and private #} {{ form_row(form.comment) }} {% endif %} +{%- if form.privateComment is defined -%} + {{ form_row(form.privateComment) }} +{% endif %} + {%- if form.attendee is defined -%} {{ form_row(form.attendee) }} {% endif %} diff --git a/src/Bundle/ChillActivityBundle/Resources/views/Activity/show.html.twig b/src/Bundle/ChillActivityBundle/Resources/views/Activity/show.html.twig index ce4c22304..8b47f4de2 100644 --- a/src/Bundle/ChillActivityBundle/Resources/views/Activity/show.html.twig +++ b/src/Bundle/ChillActivityBundle/Resources/views/Activity/show.html.twig @@ -1,4 +1,5 @@ {%- set t = entity.type -%} +{% set userId = app.user.id %} {%- import "@ChillDocStore/Macro/macro.html.twig" as m -%}

{{ "Activity"|trans }}

@@ -146,6 +147,21 @@ {% endif %} + {% if t.privateCommentVisible and is_granted('CHILL_ACTIVITY_SEE_DETAILS', entity) and entity.privateComment.hasCommentForUser(app.user) %} + {% if t.privateCommentLabel is not empty %} +
{{ t.privateCommentLabel }}
+ {% else %} +
{{ 'Private comment'|trans }}
+ {% endif %} +
+
+
+ {{ entity.privateComment.comments[userId] }} +
+
+
+ {% endif %} + {% if t.documentsVisible and is_granted('CHILL_ACTIVITY_SEE_DETAILS', entity) %}
{{ 'Documents'|trans }}
diff --git a/src/Bundle/ChillActivityBundle/migrations/Version20220425133027.php b/src/Bundle/ChillActivityBundle/migrations/Version20220425133027.php new file mode 100644 index 000000000..4a829f18c --- /dev/null +++ b/src/Bundle/ChillActivityBundle/migrations/Version20220425133027.php @@ -0,0 +1,35 @@ +addSql('ALTER TABLE activitytype DROP privateCommentLabel'); + $this->addSql('ALTER TABLE activitytype DROP privateCommentVisible'); + } + + public function getDescription(): string + { + return 'add private comment option to activity types'; + } + + public function up(Schema $schema): void + { + $this->addSql('ALTER TABLE activitytype ADD privateCommentLabel VARCHAR(255) DEFAULT \'\' NOT NULL'); + $this->addSql('ALTER TABLE activitytype ADD privateCommentVisible SMALLINT DEFAULT 1 NOT NULL'); + } +} diff --git a/src/Bundle/ChillActivityBundle/migrations/Version20220527124438.php b/src/Bundle/ChillActivityBundle/migrations/Version20220527124438.php new file mode 100644 index 000000000..2661edf4b --- /dev/null +++ b/src/Bundle/ChillActivityBundle/migrations/Version20220527124438.php @@ -0,0 +1,33 @@ +addSql('ALTER TABLE chill_person_accompanying_period_work DROP privateComment_comments'); + } + + public function getDescription(): string + { + return 'add private comment to activity'; + } + + public function up(Schema $schema): void + { + $this->addSql('ALTER TABLE activity ADD privateComment_comments JSON DEFAULT \'{}\''); + } +} diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index 3ca4def7c..abfa0ea89 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -44,6 +44,7 @@ Received: Recevoir by: 'Par ' location: Lieu Reasons: Sujets +Private comment: Commentaire privé #forms @@ -175,6 +176,8 @@ Reasons visible: Visibilité du champ Sujet Reasons label: Libellé du champ Sujet Comment visible: Visibilité du champ Commentaire Comment label: Libellé du champ Commentaire +Private comment visible: Visibilité du champ Commentaire Privé +Private comment label: Libellé du champ Commentaire Privé Emergency visible: Visibilité du champ Urgent Emergency label: Libellé du champ Urgent Accompanying period visible: Visibilité du champ Période d'accompagnement diff --git a/src/Bundle/ChillCalendarBundle/Entity/Calendar.php b/src/Bundle/ChillCalendarBundle/Entity/Calendar.php index 11104cc6a..c40bddb44 100644 --- a/src/Bundle/ChillCalendarBundle/Entity/Calendar.php +++ b/src/Bundle/ChillCalendarBundle/Entity/Calendar.php @@ -14,6 +14,7 @@ namespace Chill\CalendarBundle\Entity; use Chill\ActivityBundle\Entity\Activity; use Chill\CalendarBundle\Repository\CalendarRepository; use Chill\MainBundle\Entity\Embeddable\CommentEmbeddable; +use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable; use Chill\MainBundle\Entity\Location; use Chill\MainBundle\Entity\User; use Chill\PersonBundle\Entity\AccompanyingPeriod; @@ -115,6 +116,12 @@ class Calendar */ private Collection $persons; + /** + * @ORM\Embedded(class=PrivateCommentEmbeddable::class, columnPrefix="privateComment_") + * @Serializer\Groups({"calendar:read"}) + */ + private PrivateCommentEmbeddable $privateComment; + /** * @ORM\ManyToMany( * targetEntity="Chill\ThirdPartyBundle\Entity\ThirdParty", @@ -151,6 +158,7 @@ class Calendar public function __construct() { $this->comment = new CommentEmbeddable(); + $this->privateComment = new PrivateCommentEmbeddable(); $this->persons = new ArrayCollection(); $this->professionals = new ArrayCollection(); $this->invites = new ArrayCollection(); @@ -278,6 +286,11 @@ class Calendar return []; } + public function getPrivateComment(): PrivateCommentEmbeddable + { + return $this->privateComment; + } + /** * @return Collection|ThirdParty[] */ @@ -407,6 +420,13 @@ class Calendar return $this; } + public function setPrivateComment(PrivateCommentEmbeddable $privateComment): self + { + $this->privateComment = $privateComment; + + return $this; + } + public function setSendSMS(?bool $sendSMS): self { $this->sendSMS = $sendSMS; diff --git a/src/Bundle/ChillCalendarBundle/Form/CalendarType.php b/src/Bundle/ChillCalendarBundle/Form/CalendarType.php index 05dc362b4..b1dccb5fd 100644 --- a/src/Bundle/ChillCalendarBundle/Form/CalendarType.php +++ b/src/Bundle/ChillCalendarBundle/Form/CalendarType.php @@ -18,6 +18,7 @@ use Chill\CalendarBundle\Entity\Invite; use Chill\MainBundle\Entity\Location; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Form\Type\CommentType; +use Chill\MainBundle\Form\Type\PrivateCommentType; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\PersonBundle\Entity\Person; use Chill\ThirdPartyBundle\Entity\ThirdParty; @@ -51,6 +52,10 @@ class CalendarType extends AbstractType ->add('comment', CommentType::class, [ 'required' => false, ]) + ->add('privateComment', PrivateCommentType::class, [ + 'required' => false, + 'label' => 'private comment', + ]) // ->add('cancelReason', EntityType::class, [ // 'required' => false, // 'class' => CancelReason::class, diff --git a/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/edit.html.twig b/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/edit.html.twig index d67202920..b96d12c06 100644 --- a/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/edit.html.twig +++ b/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/edit.html.twig @@ -47,6 +47,10 @@ {{ form_row(form.comment) }} {% endif %} +{%- if form.privateComment is defined -%} + {{ form_row(form.privateComment) }} +{% endif %} + {%- if form.sendSMS is defined -%} {{ form_row(form.sendSMS) }} {% endif %} diff --git a/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/new.html.twig b/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/new.html.twig index 255c2641b..41adb52cc 100644 --- a/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/new.html.twig +++ b/src/Bundle/ChillCalendarBundle/Resources/views/Calendar/new.html.twig @@ -43,6 +43,10 @@ {{ form_row(form.comment) }} {% endif %} +{%- if form.privateComment is defined -%} + {{ form_row(form.privateComment) }} +{% endif %} + {%- if form.sendSMS is defined -%} {{ form_row(form.sendSMS) }} {% endif %} @@ -50,22 +54,22 @@
{{ form_end(form) }} diff --git a/src/Bundle/ChillCalendarBundle/migrations/Version20220527124558.php b/src/Bundle/ChillCalendarBundle/migrations/Version20220527124558.php new file mode 100644 index 000000000..39c4cb7c3 --- /dev/null +++ b/src/Bundle/ChillCalendarBundle/migrations/Version20220527124558.php @@ -0,0 +1,33 @@ +addSql('ALTER TABLE chill_calendar.calendar DROP privateComment_comments'); + } + + public function getDescription(): string + { + return 'add private comment to calendar'; + } + + public function up(Schema $schema): void + { + $this->addSql('ALTER TABLE chill_calendar.calendar ADD privateComment_comments JSON DEFAULT NULL'); + } +} diff --git a/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml b/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml index aafa26622..da244fd13 100644 --- a/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillCalendarBundle/translations/messages.fr.yml @@ -26,6 +26,7 @@ The calendar item has been successfully removed.: Le rendez-vous a été supprim From the day: Du to the day: au Transform to activity: Transformer en échange + canceledBy: supprimé par Canceled by: supprimé par Calendar configuration: Gestion des rendez-vous @@ -36,4 +37,4 @@ crud: title: Liste des motifs d'annulation add_new: Ajouter un nouveau title_new: Nouveau motif d'annulation - title_edit: Modifier le motif d'annulation \ No newline at end of file + title_edit: Modifier le motif d'annulation diff --git a/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php b/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php index 41dc73154..3df9f261f 100644 --- a/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php +++ b/src/Bundle/ChillDocStoreBundle/Form/PersonDocumentType.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\DocStoreBundle\Form; use Chill\DocStoreBundle\Entity\Document; +use Chill\DocStoreBundle\Entity\DocumentCategory; use Chill\DocStoreBundle\Entity\PersonDocument; use Chill\MainBundle\Form\Type\ChillDateType; use Chill\MainBundle\Form\Type\ChillTextareaType; @@ -63,7 +64,7 @@ class PersonDocumentType extends AbstractType ->add('date', ChillDateType::class) ->add('category', EntityType::class, [ 'placeholder' => 'Choose a document category', - 'class' => 'ChillDocStoreBundle:DocumentCategory', + 'class' => DocumentCategory::class, 'query_builder' => static function (EntityRepository $er) { return $er->createQueryBuilder('c') ->where('c.documentClass = :docClass') diff --git a/src/Bundle/ChillMainBundle/Entity/Embeddable/PrivateCommentEmbeddable.php b/src/Bundle/ChillMainBundle/Entity/Embeddable/PrivateCommentEmbeddable.php new file mode 100644 index 000000000..09a35324e --- /dev/null +++ b/src/Bundle/ChillMainBundle/Entity/Embeddable/PrivateCommentEmbeddable.php @@ -0,0 +1,70 @@ + + */ + 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($content); + + return $this; + } + + public function setComments($comments) + { + $this->comments = $comments; + + return $this; + } +} diff --git a/src/Bundle/ChillMainBundle/Form/DataMapper/PrivateCommentDataMapper.php b/src/Bundle/ChillMainBundle/Form/DataMapper/PrivateCommentDataMapper.php new file mode 100644 index 000000000..2c03c59f1 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Form/DataMapper/PrivateCommentDataMapper.php @@ -0,0 +1,50 @@ +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()); + } +} diff --git a/src/Bundle/ChillMainBundle/Form/Type/PrivateCommentType.php b/src/Bundle/ChillMainBundle/Form/Type/PrivateCommentType.php new file mode 100644 index 000000000..d4c0d1611 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Form/Type/PrivateCommentType.php @@ -0,0 +1,62 @@ +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, + ]); + } +} diff --git a/src/Bundle/ChillMainBundle/Resources/public/chill/chillmain.scss b/src/Bundle/ChillMainBundle/Resources/public/chill/chillmain.scss index 99376088e..f8bd42442 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/chill/chillmain.scss +++ b/src/Bundle/ChillMainBundle/Resources/public/chill/chillmain.scss @@ -298,6 +298,10 @@ table.table-bordered { } } +.private-quote { + border-left: 10px solid $pink; +} + /// meta-data div.createdBy, div.updatedBy, diff --git a/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig index 1da384920..f45f91692 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Form/fields.html.twig @@ -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) }} diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/PrivateCommentEmbeddableNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/PrivateCommentEmbeddableNormalizer.php new file mode 100644 index 000000000..fc5853c17 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/PrivateCommentEmbeddableNormalizer.php @@ -0,0 +1,55 @@ +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; + } +} diff --git a/src/Bundle/ChillMainBundle/config/services/form.yaml b/src/Bundle/ChillMainBundle/config/services/form.yaml index f2dc7803a..407a1b6af 100644 --- a/src/Bundle/ChillMainBundle/config/services/form.yaml +++ b/src/Bundle/ChillMainBundle/config/services/form.yaml @@ -143,3 +143,7 @@ services: Chill\MainBundle\Form\Type\LocationFormType: ~ Chill\MainBundle\Form\WorkflowStepType: ~ + + Chill\MainBundle\Form\DataMapper\PrivateCommentDataMapper: + autowire: true + autoconfigure: true diff --git a/src/Bundle/ChillMainBundle/config/services/serializer.yaml b/src/Bundle/ChillMainBundle/config/services/serializer.yaml index 4d8aa9954..5ec936b6c 100644 --- a/src/Bundle/ChillMainBundle/config/services/serializer.yaml +++ b/src/Bundle/ChillMainBundle/config/services/serializer.yaml @@ -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 } diff --git a/src/Bundle/ChillMainBundle/translations/messages.fr.yml b/src/Bundle/ChillMainBundle/translations/messages.fr.yml index 34ca5d7c9..e25045131 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.fr.yml @@ -65,6 +65,7 @@ Read more: Lire la suite # comment embeddable No comment associated: Aucun commentaire +private comment: Notes privées #pagination Previous: Précédent diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php index 055507162..9c0eade3b 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php @@ -13,6 +13,7 @@ namespace Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\MainBundle\Doctrine\Model\TrackCreationInterface; use Chill\MainBundle\Doctrine\Model\TrackUpdateInterface; +use Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable; use Chill\MainBundle\Entity\User; use Chill\PersonBundle\AccompanyingPeriod\SocialIssueConsistency\AccompanyingPeriodLinkedWithSocialIssuesEntityInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod; @@ -143,6 +144,12 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues */ private Collection $persons; + /** + * @ORM\Embedded(class="Chill\MainBundle\Entity\Embeddable\PrivateCommentEmbeddable", columnPrefix="privateComment_") + * @Serializer\Groups({"read", "accompanying_period_work:edit"}) + */ + private PrivateCommentEmbeddable $privateComment; + /** * @ORM\ManyToMany(targetEntity=User::class) * @ORM\JoinTable(name="chill_person_accompanying_period_work_referrer") @@ -202,6 +209,7 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues public function __construct() { $this->goals = new ArrayCollection(); + $this->privateComment = new PrivateCommentEmbeddable(); $this->results = new ArrayCollection(); $this->thirdParties = new ArrayCollection(); $this->persons = new ArrayCollection(); @@ -328,6 +336,11 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues return $this->persons; } + public function getPrivateComment(): PrivateCommentEmbeddable + { + return $this->privateComment; + } + /** * @return Collection|User[] */ @@ -505,6 +518,13 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues return $this; } + public function setPrivateComment(PrivateCommentEmbeddable $privateComment): self + { + $this->privateComment->merge($privateComment); + + return $this; + } + public function setSocialAction(?SocialAction $socialAction): self { $this->socialAction = $socialAction; diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js index 57415565b..c5150b015 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js @@ -253,7 +253,6 @@ let initPromise = (root) => Promise.all([getScopesPromise(root), accompanyingCou state.accompanyingCourse.administrativeLocation = value; }, updateReferrer(state, value) { - //console.log('value', value); state.accompanyingCourse.user = value; }, updateJob(state, value) { @@ -775,9 +774,7 @@ let initPromise = (root) => Promise.all([getScopesPromise(root), accompanyingCou throw error; }) }, - updateReferrer({ commit }, payload) { - console.log('update referrer', payload); - console.log('payload !== null', payload !== null); + updateReferrer({ commit, state }, payload) { const url = `/api/1.0/person/accompanying-course/${id}.json`; let body = { type: "accompanying_period", user: null }; @@ -788,7 +785,10 @@ let initPromise = (root) => Promise.all([getScopesPromise(root), accompanyingCou return makeFetch('PATCH', url, body) .then((response) => { commit('updateReferrer', response.user); - commit('setFilteredReferrersSuggested'); + if (null !== payload.user_job && payload.user_job !== state.accompanyingCourse.job) { + this.dispatch('updateJob', payload.user_job); + } + // commit('setFilteredReferrersSuggested'); // this mutation doesn't exist? }) .catch((error) => { commit('catchError', error); @@ -799,6 +799,8 @@ let initPromise = (root) => Promise.all([getScopesPromise(root), accompanyingCou const url = `/api/1.0/person/accompanying-course/${id}.json`; let body = { type: "accompanying_period", job: null }; + console.log('update job', payload); + if (payload !== null) { body = { type: "accompanying_period", job: { id: payload.id, type: payload.type } }; } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue index bab64018a..fb8796de5 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourseWorkEdit/App.vue @@ -24,6 +24,15 @@ +
+ + +
+
+

{{ $t('goals_title') }}

@@ -141,12 +151,12 @@
  • -
    - - -
    +
    + + +
@@ -274,18 +284,18 @@
-