correction affectation utilisateur, et ajout vue caendrier
This commit is contained in:
@@ -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 ======================================================================================================
|
||||
|
@@ -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,12 +104,16 @@ 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"));
|
||||
|
||||
@@ -80,6 +126,7 @@ class TimerController extends AbstractController
|
||||
// Sur validation
|
||||
if ($form->get('submit')->isClicked() && $form->isValid()) {
|
||||
$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;
|
||||
}
|
||||
|
||||
}
|
||||
|
186
src/schedule-2.0/templates/Timer/list.cal.html.twig
Normal file
186
src/schedule-2.0/templates/Timer/list.cal.html.twig
Normal file
@@ -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 %}
|
||||
<div id="fullcalendar" style="width:100%; margin-top:10px;"></div>
|
||||
|
||||
|
||||
{{ 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("<img src="+info.event.extendedProps.avatar+" class='eventAvatar'>");
|
||||
content.append("<span class='eventUser float-left small'>"+info.event.extendedProps.username+"</span>");
|
||||
var eventInfo=$(content).children('.eventUser');
|
||||
|
||||
// Ajout container
|
||||
content.append("<span class='eventInfo float-right'></span>");
|
||||
var eventInfo=$(content).children('.eventInfo');
|
||||
|
||||
// Ajouter le verrou si event non editable
|
||||
if(info.event.extendedProps.locked) {
|
||||
eventInfo.append("<i class='fa fa-lock float-right'></i>");
|
||||
}
|
||||
|
||||
// Ajout estimation
|
||||
eventInfo.append("<span class='eventEstimate float-right small'>"+info.event.extendedProps.estimate+"</span>");
|
||||
|
||||
// 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 %}
|
@@ -15,19 +15,20 @@ SUIVI HORAIRE
|
||||
</h1>
|
||||
<div id="timer" class="card">
|
||||
|
||||
<div class="card-header">
|
||||
Lancer un Timer :
|
||||
<select class="select2entity" id="timer-task" name="timer-task">
|
||||
<option> Tâche </option>
|
||||
{% for task in tasks %}
|
||||
<option value="{{task.id}}">{{task.displayname}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<input id="timer-desc" name="timer-desc" placeholder="Description" />
|
||||
<a href='#' title='Add' id='addtimer'>
|
||||
<i class='fas fa-plus-circle'></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="card-header">
|
||||
<a class="btn btn-success" style="float:right" href={{ path('app_timer_view') }}>Voir le calendrier</a>
|
||||
Lancer un Timer :
|
||||
<select class="select2entity" id="timer-task" name="timer-task">
|
||||
<option> Tâche </option>
|
||||
{% for task in tasks %}
|
||||
<option value="{{task.id}}">{{task.displayname}}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<input id="timer-desc" name="timer-desc" placeholder="Description" />
|
||||
<a href='#' title='Add' id='addtimer'>
|
||||
<i class='fas fa-plus-circle'></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
Reference in New Issue
Block a user