From fb51e44e45a8bf5395e58b49419416dee3308665 Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Wed, 11 Jan 2023 17:16:37 +0100 Subject: [PATCH] FEATURE [absence][in_progress] add absence property to user, create form, controller, template, migration and menu entry --- .../Controller/AbsenceController.php | 42 +++++++++++++++++++ src/Bundle/ChillMainBundle/Entity/User.php | 23 +++++++++- .../ChillMainBundle/Form/AbsenceType.php | 36 ++++++++++++++++ .../Resources/views/Menu/absence.html.twig | 10 +++++ .../Routing/MenuBuilder/UserMenuBuilder.php | 9 ++++ src/Bundle/ChillMainBundle/config/routes.yaml | 4 ++ .../migrations/Version20230111160610.php | 36 ++++++++++++++++ 7 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 src/Bundle/ChillMainBundle/Controller/AbsenceController.php create mode 100644 src/Bundle/ChillMainBundle/Form/AbsenceType.php create mode 100644 src/Bundle/ChillMainBundle/Resources/views/Menu/absence.html.twig create mode 100644 src/Bundle/ChillMainBundle/migrations/Version20230111160610.php diff --git a/src/Bundle/ChillMainBundle/Controller/AbsenceController.php b/src/Bundle/ChillMainBundle/Controller/AbsenceController.php new file mode 100644 index 000000000..97ca2979c --- /dev/null +++ b/src/Bundle/ChillMainBundle/Controller/AbsenceController.php @@ -0,0 +1,42 @@ +getUser(); + $form = $this->createForm(AbsenceType::class, $user); + $form->add('submit', SubmitType::class, ['label' => 'Create']); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $em = $this->getDoctrine()->getManager(); + $em->persist($user); + $em->flush(); + + return $this->redirect($this->generateUrl('chill_main_homepage')); + } + + return $this->render('@ChillMain/Menu/absence.html.twig', [ + 'user' => $user, + 'form' => $form->createView(), + ]); + } +} diff --git a/src/Bundle/ChillMainBundle/Entity/User.php b/src/Bundle/ChillMainBundle/Entity/User.php index 80a0b5b2a..10620dc0f 100644 --- a/src/Bundle/ChillMainBundle/Entity/User.php +++ b/src/Bundle/ChillMainBundle/Entity/User.php @@ -11,14 +11,15 @@ declare(strict_types=1); namespace Chill\MainBundle\Entity; +use DateTimeImmutable; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; use RuntimeException; use Symfony\Component\Security\Core\User\AdvancedUserInterface; use Symfony\Component\Serializer\Annotation as Serializer; -use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Symfony\Component\Validator\Context\ExecutionContextInterface; use function in_array; /** @@ -40,6 +41,11 @@ class User implements AdvancedUserInterface */ protected ?int $id = null; + /** + * @ORM\Column(type="datetime", nullable=true) + */ + private ?DateTimeImmutable $absenceStart = null; + /** * Array where SAML attributes's data are stored. * @@ -175,6 +181,11 @@ class User implements AdvancedUserInterface { } + public function getAbsenceStart(): ?DateTimeImmutable + { + return $this->absenceStart; + } + /** * Get attributes. * @@ -295,6 +306,11 @@ class User implements AdvancedUserInterface return $this->usernameCanonical; } + public function isAbsent(): bool + { + return null !== $this->getAbsenceStart() ? true : false; + } + /** * @return bool */ @@ -359,6 +375,11 @@ class User implements AdvancedUserInterface } } + public function setAbsenceStart(?DateTimeImmutable $absenceStart): void + { + $this->absenceStart = $absenceStart; + } + public function setAttributeByDomain(string $domain, string $key, $value): self { $this->attributes[$domain][$key] = $value; diff --git a/src/Bundle/ChillMainBundle/Form/AbsenceType.php b/src/Bundle/ChillMainBundle/Form/AbsenceType.php new file mode 100644 index 000000000..1f43093e5 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Form/AbsenceType.php @@ -0,0 +1,36 @@ +add('absenceStart', ChillDateTimeType::class, [ + 'required' => true, + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => User::class, + ]); + } +} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Menu/absence.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Menu/absence.html.twig new file mode 100644 index 000000000..37b4bdd2f --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/Menu/absence.html.twig @@ -0,0 +1,10 @@ +{% if user.absenceStart is not null %} + +

Votre absence est indiqué à partier de {{ user.absenceStart|format_datetime() }}

+ +{% endif %} + +{{ form_start(form) }} +{{ form_row(form.absenceStart) }} +{{ form_row(form.submit, { 'attr' : { 'class' : 'btn btn-chill-green' } } ) }} +{{ form_end(form) }} diff --git a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php index e0e8a782f..e91aa040b 100644 --- a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php +++ b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php @@ -78,6 +78,15 @@ class UserMenuBuilder implements LocalMenuBuilderInterface $nbNotifications = $this->notificationByUserCounter->countUnreadByUser($user); + //TODO add an icon? How exactly? For example a clock icon... + $menu + ->addChild($this->translator->trans('absence.Set absence date'), [ + 'route' => 'chill_absence_user', + ]) + ->setExtras([ + 'order' => -8888888, + ]); + $menu ->addChild( $this->translator->trans('notification.My notifications with counter', ['nb' => $nbNotifications]), diff --git a/src/Bundle/ChillMainBundle/config/routes.yaml b/src/Bundle/ChillMainBundle/config/routes.yaml index d25f2aaff..d1fde6f5c 100644 --- a/src/Bundle/ChillMainBundle/config/routes.yaml +++ b/src/Bundle/ChillMainBundle/config/routes.yaml @@ -94,3 +94,7 @@ login_check: logout: path: /logout + +chill_absence_user: + path: /{_locale}/absence + controller: Chill\MainBundle\Controller\AbsenceController::setAbsence diff --git a/src/Bundle/ChillMainBundle/migrations/Version20230111160610.php b/src/Bundle/ChillMainBundle/migrations/Version20230111160610.php new file mode 100644 index 000000000..1c5f74897 --- /dev/null +++ b/src/Bundle/ChillMainBundle/migrations/Version20230111160610.php @@ -0,0 +1,36 @@ +addSql('ALTER TABLE users DROP absenceStart'); + } + + public function getDescription(): string + { + return 'Add absence property to user'; + } + + public function up(Schema $schema): void + { + $this->addSql('ALTER TABLE users ADD absenceStart TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL'); + } +}