From 03456567069fbeefab9ceb3542e36f5d3f27b6f2 Mon Sep 17 00:00:00 2001 From: Matthieu Lamalle Date: Thu, 2 Jul 2020 10:24:18 +0200 Subject: [PATCH] correction affectation utilisateur, et ajout vue caendrier --- src/schedule-2.0/config/routes.yaml | 18 +- .../src/Controller/TimerController.php | 78 +++++++- .../templates/Timer/list.cal.html.twig | 186 ++++++++++++++++++ .../templates/Timer/list.html.twig | 27 +-- 4 files changed, 290 insertions(+), 19 deletions(-) create mode 100644 src/schedule-2.0/templates/Timer/list.cal.html.twig diff --git a/src/schedule-2.0/config/routes.yaml b/src/schedule-2.0/config/routes.yaml index d088699..9655c7c 100644 --- a/src/schedule-2.0/config/routes.yaml +++ b/src/schedule-2.0/config/routes.yaml @@ -349,23 +349,31 @@ app_validationholiday_activeholiday: #== Timer ==================================================================================================== app_timer: - path: /user/timer + path: /timer defaults: { _controller: App\Controller\TimerController:list } +app_timer_view: + path: /timer/event + defaults: { _controller: App\Controller\TimerController:view } + +app_timer_load: + path: /timer/event/load + defaults: { _controller: App\Controller\TimerController:load } + app_timer_submit: - path: /user/timer/submit + path: /timer/submit defaults: { _controller: App\Controller\TimerController:submit } app_timer_create: - path: /user/timer/create + path: /timer/create defaults: { _controller: App\Controller\TimerController:create } app_timer_update: - path: /user/timer/update/{id} + path: /timer/update/{id} defaults: { _controller: App\Controller\TimerController:update } app_timer_delete: - path: /user/timer/delete/{id} + path: /timer/delete/{id} defaults: { _controller: App\Controller\TimerController:delete } #== Customer ====================================================================================================== diff --git a/src/schedule-2.0/src/Controller/TimerController.php b/src/schedule-2.0/src/Controller/TimerController.php index effe14c..3ccc4b7 100644 --- a/src/schedule-2.0/src/Controller/TimerController.php +++ b/src/schedule-2.0/src/Controller/TimerController.php @@ -35,6 +35,48 @@ class TimerController extends AbstractController ]); } + public function view(Request $request) + { + $em = $this->getDoctrine()->getManager(); + + $iduser = $this->get("session")->get("iduser"); + $user = $em->getRepository("App:User")->find($iduser); + $tasks = $em->getRepository("App:Task")->findAll(); + $timers = $em->getRepository("App:Timer")->findBy(["user"=>$iduser]); + + return $this->render($this->render.'list.cal.html.twig',[ + "useheader" => true, + "usesidebar" => true, + "user" => $user, + "tasks" => $tasks, + "timers" => $timers, + ]); + } + + public function load(Request $request) + { + $em = $this->getDoctrine()->getManager(); + $tbtimers=[]; + + // Evenements + $iduser=$this->get("session")->get("iduser"); + if($iduser=="all") + $timers=$em->getRepository("App:Timer")->findAll(); + else { + $iduser=$this->get("session")->get("iduser"); + $user=$em->getRepository("App:User")->find($iduser); + $timers=$em->getRepository("App:Timer")->findBy(["user"=>$user]); + } + + foreach($timers as $timer) { + $tmp=$this->formatTimer($timer); + array_push($tbtimers,$tmp); + } + + // Retour + return new Response(json_encode($tbtimers)); + } + public function create(Request $request) { // Initialisation de l'enregistrement @@ -62,11 +104,15 @@ class TimerController extends AbstractController $output=["return"=>"OK"]; return new Response(json_encode($output)); } + public function submit(Request $request) { // Initialisation de l'enregistrement $em = $this->getDoctrine()->getManager(); $data = new Entity(); + + $iduser = $this->get("session")->get("iduser"); + $user = $em->getRepository("App:User")->find($iduser); // Création du formulaire $form = $this->createForm(Form::class,$data,array("mode"=>"submit")); @@ -79,7 +125,8 @@ class TimerController extends AbstractController // Sur validation if ($form->get('submit')->isClicked() && $form->isValid()) { - $data = $form->getData(); + $data = $form->getData(); + $data->setUser($user); $em->persist($data); $em->flush(); @@ -173,4 +220,33 @@ class TimerController extends AbstractController } } } + public function formatTimer($timer) { + + $tmp= [ + "id"=> $timer->getId(), + "title" => $timer->getTask()->getDisplayname(), + "start" => $timer->getStart()->format("Y-m-d H:i"), + "end" => $timer->getEnd()->format("Y-m-d H:i"), + "backgroundColor" => $timer->getTask()->getColor(), + "borderColor" => $timer->getTask()->getColor(), + "textColor" => "#ffffff", + "allDay" => false, + "editable" => true, + "durationEditable" => false, + "extendedProps" => [ + "fulldescription" => $timer->getTask()->getDisplayname()."\n\n".$timer->getDescription(), + "description" => $timer->getDescription(), + "userid" => $timer->getUser()->getId(), + "username" => $timer->getUser()->getUsername(), + "taskid" => $timer->getTask()->getId(), + "avatar" => "/".$this->getParameter("appAlias")."/uploads/avatar/".$timer->getUser()->getAvatar(), + "estimate" => $timer->getDuration()->format("H:i"), + "locked" => false, + "editable" => true, + "astreinte" => false + ] + ]; + return $tmp; + } + } diff --git a/src/schedule-2.0/templates/Timer/list.cal.html.twig b/src/schedule-2.0/templates/Timer/list.cal.html.twig new file mode 100644 index 0000000..ea7b27f --- /dev/null +++ b/src/schedule-2.0/templates/Timer/list.cal.html.twig @@ -0,0 +1,186 @@ +{% extends "base.html.twig" %} + +{% block head_style %} + {{ encore_entry_link_tags('app') }} + {{ encore_entry_link_tags('fullcalendar') }} +{% endblock head_style %} + +{% block localstyle %} + .fc-header-toolbar h2 { + text-transform: uppercase; + } + + .fc-day-grid-event { + padding:0px; + border-radius:0px; + border: none; + } + .fc-content { + height: 40px; + } + + .fc-title { + font-weight: bolder; + font-size: 12px; + } + + .eventAvatar { + width: 20px; + margin: 0px 5px 0px 0px; + float: left; + } + + .eventInfo{ + margin: -5px 5px 0px 0px; + clear: both; + } + + .eventUser{ + clear: both; + } + + .eventEstimate { + margin: -3px 10px; + } +{% endblock %} + +{% block body %} +
+ + + {{ encore_entry_script_tags('fullcalendar') }} +{% endblock %} + + + + +{% block localjavascript %} + +$(document).ready(function() { + $("#modalsubmit #user").select2({ + theme: 'bootstrap4', + language: "fr" + }); + + $("#modalsubmit #task").select2({ + placeholder: "Selectionnez un projet", + allowClear: true, + theme: 'bootstrap4', + language: "fr" + }); + + $("#modalupdate #user").select2({ + theme: 'bootstrap4', + language: "fr" + }); + + $("#modalupdate #task").select2({ + placeholder: "Selectionnez un projet", + theme: 'bootstrap4', + language: "fr" + }); +}); + +// Rendu d'un évenement +function eventRender(info) { + console.log(info.event.extendedProps); + // Récupération des divers élements du rendu event + var content=$(info.el).children('.fc-content'); + var title=$(content).children('.fc-title'); + + // Ajouter l'avatar + content.prepend(""); + content.append(""+info.event.extendedProps.username+""); + var eventInfo=$(content).children('.eventUser'); + + // Ajout container + content.append(""); + var eventInfo=$(content).children('.eventInfo'); + + // Ajouter le verrou si event non editable + if(info.event.extendedProps.locked) { + eventInfo.append(""); + } + + // Ajout estimation + eventInfo.append(""+info.event.extendedProps.estimate+""); + + // Description + content.attr("title",info.event.extendedProps.fulldescription); +} + +// Formulaire Création d'un évelement +var allDay; +function eventSelect(selectionInfo) { + var start=moment(selectionInfo.start); + var end=moment(selectionInfo.end); + var end=end.subtract(1, 'd'); + allDay=(start.format("DD/MM/YYYY") != end.format("DD/MM/YYYY")); + + // Controle + if(start.month()!=end.month()) { + alert("Une tâche ne peut être sur deux mois différents"); + return false; + } + + if(start.week()!=end.week()) { + alert("Une tâche ne peut être sur deux semaines différentes"); + return false; + } + + // Valeur par défaut + {% if (is_granted('ROLE_ADMIN') or is_granted('ROLE_VALIDATOR') or is_granted('ROLE_MASTER')) and app.session.get('iduser')!="all" %} + $('#usersubmit').val({{app.session.get('iduser')}}).trigger("change"); + {% else %} + $('#usersubmit').val({{app.user.id}}).trigger("change"); + {% endif %} + + // Si jour de fin un samedi ou un dimanche : on est forcement en astreinte + if(moment(end).day()==0||moment(end).day()==6) { + $("#modalsubmit #astreinte").prop("checked",true); + $("#modalsubmit #astreinte").attr("disabled",true); + allDay=true; + } + else { + $("#modalsubmit #astreinte").prop('checked', false); + $("#modalsubmit #astreinte").attr('disabled', false); + } + + $('#modalsubmit #amsubmit').prop("checked",true); + $('#modalsubmit #apsubmit').prop("checked",true); + $('#modalsubmit #amsubmit').attr("disabled",allDay); + $('#modalsubmit #apsubmit').attr("disabled",allDay); + + $('#modalsubmit #start').val(start.format("YYYY-MM-DD")); + $('#modalsubmit #end').val(end.format("YYYY-MM-DD")); + + $('#modalsubmit #description').val(""); + + $("#modalsubmit .alert").remove(); + + // Formulaire de création d'un évènement + $('#modalsubmit').modal(); +} + + + +// On change astreinte +$("#astreinte").change(function() { + console.log(allDay) + if(this.checked) { + $("#amsubmit").prop("disabled",true); + $("#apsubmit").prop("disabled",true); + + $('#modalsubmit #amsubmit').prop("checked",true); + $('#modalsubmit #apsubmit').prop("checked",true); + } + else { + $("#amsubmit").prop("disabled",allDay); + $("#apsubmit").prop("disabled",allDay); + + $('#modalsubmit #amsubmit').prop("checked",true); + $('#modalsubmit #apsubmit').prop("checked",true); + } +}); + +{% endblock %} \ No newline at end of file diff --git a/src/schedule-2.0/templates/Timer/list.html.twig b/src/schedule-2.0/templates/Timer/list.html.twig index 8c82319..5bc64de 100644 --- a/src/schedule-2.0/templates/Timer/list.html.twig +++ b/src/schedule-2.0/templates/Timer/list.html.twig @@ -15,19 +15,20 @@ SUIVI HORAIRE
-
- Lancer un Timer : - - - - - -
+
+ Voir le calendrier + Lancer un Timer : + + + + + +