Merge branch '3.2.5' into 'dev'

Update schedule editor

See merge request TheGamecraft/c-cms!93
This commit is contained in:
Mathieu Lagace
2019-12-23 23:00:45 +00:00
9 changed files with 229 additions and 44 deletions

View File

@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\OCOM;
use Illuminate\Http\Request;
use function GuzzleHttp\json_encode;
use function GuzzleHttp\Psr7\str;
class OCOMController extends Controller
@@ -699,4 +700,30 @@ X20,\"Participer à des activités
{
//
}
public function jsonList()
{
$ocoms = \App\OCOM::all();
$name = [];
foreach ($ocoms as $ocom) {
array_push($name, $ocom->ocom);
}
return json_encode($name);
}
public function getName(string $ocom)
{
$foo = \App\OCOM::all()->where('ocom','=',$ocom)->first();
if($foo != null)
{
return $foo->objectif_competence;
}
else
{
return null;
}
}
}

View File

@@ -56,7 +56,7 @@ class ScheduleEditorController extends Controller
"end_time" => "20:30"
],
2 => [
"name" => "Periode 1",
"name" => "Periode 2",
"begin_time" => "20:30",
"end_time" => "21:20"
]

View File

@@ -3305,9 +3305,9 @@ fieldset:disabled a.btn {
}
.btn-secondary:hover {
color: #ffffff;
background-color: #5a6268;
border-color: #545b62;
color: #ffffff !important;
background-color: #5a6268 !important;
border-color: #545b62 !important;
}
.btn-secondary:focus,

View File

@@ -103,4 +103,14 @@ function initAutoComplete(htmlClass)
autocomplete(document.getElementById(this.id), users);
})
});
}
function initAutoCompleteOCOM(htmlClass)
{
$.get('/api/ocom/list?api_token='+api_token, function ( data ) {
var ocoms = JSON.parse(data);
$("."+htmlClass).each(function ( index ) {
autocomplete(document.getElementById(this.id), ocoms);
})
});
}

View File

@@ -1,3 +1,5 @@
var editorTemplate;
function initScheduleEditor(id, eventType)
{
$.ajax({
@@ -10,7 +12,8 @@ function initScheduleEditor(id, eventType)
loadCourse(pniveau,pperiode);
}
}
initAutoComplete("AutoComplete");
initAutoComplete("AutoCompleteUser");
initAutoCompleteOCOM('AutoCompleteOCOM');
},
error: function () {
showNotification('error','Impossible d\'initialiser l\'éditeur d\'horaire ...','top', 'center')
@@ -84,6 +87,7 @@ function loadEventType(date)
url: '/api/schedule/editor/template/'+id+'?api_token='+api_token,
success: function (data) {
var result = JSON.parse(data);
editorTemplate = result;
initScheduleEditor("scheduleEditor",id)
$.each(result, function (i, val) {
if(i == "is_mandatory" || i == "use_schedule" || i == "use_weekly_msg")
@@ -158,4 +162,80 @@ function loadEventType(date)
showNotification('error','Impossible de charger le type d\'évenement ...','top', 'center')
}
})
}
function updateCourseName(niveau, periode) {
setTimeout(function(){
let val = $('#ocom_n'+niveau+'_p'+periode).val();
if(val != "")
{
$.ajax({
type: 'GET',
url: '/api/ocom/'+val+'/name?api_token='+api_token,
success: function (data) {
if(data != null && data != "")
{
$('#name_n'+niveau+'_p'+periode).val(data);
}
},
error: function () {
showNotification('error','Erreur impossible de charger l\'objectif de rendement ...','top', 'center')
}
})
}
}, 100);
}
function selectCourseMode(mode, niveau, periode)
{
if(mode == "course")
{
$('#descContainer'+niveau+'-'+periode).addClass('d-none');
$('#isDoneContainer'+niveau+'-'+periode).removeClass('d-none');
$('#isDoneContainer'+niveau+'-'+periode).addClass('d-flex');
$('#OCOMContainer'+niveau+'-'+periode).removeClass('d-none');
$('#nameContainer'+niveau+'-'+periode).removeClass('d-none');
$('#modeSwitchC'+niveau+'-'+periode).addClass('active');
$('#modeSwitchO'+niveau+'-'+periode).removeClass('active');
}
else
{
$('#descContainer'+niveau+'-'+periode).removeClass('d-none');
$('#isDoneContainer'+niveau+'-'+periode).addClass('d-none');
$('#isDoneContainer'+niveau+'-'+periode).removeClass('d-flex');
$('#OCOMContainer'+niveau+'-'+periode).addClass('d-none');
$('#nameContainer'+niveau+'-'+periode).addClass('d-none');
$('#modeSwitchC'+niveau+'-'+periode).removeClass('active');
$('#modeSwitchO'+niveau+'-'+periode).addClass('active');
}
}
function selectCourseModePeriode(mode,periode)
{
$.each(editorTemplate['schedule_model']['niveaux'], function (i, val) {
selectCourseMode(mode,i+1,periode);
});
}
function selectCourseModeNiveau(mode,niveau)
{
$.each(editorTemplate['schedule_model']['periodes'], function (i, val) {
selectCourseMode(mode,niveau,i+1);
});
}
function updatePlantext(toggle,id)
{
if($('#'+toggle).is(":checked"))
{
$('#'+id).removeClass('text-warning');
$('#'+id).addClass('text-success');
$('#'+id).html('Plan de cours remis')
}
else
{
$('#'+id).addClass('text-warning');
$('#'+id).removeClass('text-success');
$('#'+id).html('Plan de cours non remis')
}
}

View File

@@ -1,36 +1,77 @@
<div class="row pt-2 pb-2 border-bottom border-right">
<div class="col-6 mb-1">
<div class="form-group label-floating">
<input type="text" placeholder="OCOM du cours" class="form-control" />
<span class="form-control-feedback">
<i class="material-icons">done</i>
</span>
<div class="row bg-light">
<div class="col-8 pr-0 m-auto d-flex">
<div class="pr-0 m-auto d-flex" id="isDoneContainer{{$niveau}}-{{$periode}}">
<div class="togglebutton">
<label class="m-auto">
<input type="checkbox" id="plan_n{{$niveau}}_p{{$periode}}" name="plan_n{{$niveau}}_p{{$periode}}" onchange="updatePlantext('plan_n{{$niveau}}_p{{$periode}}','planText_n{{$niveau}}_p{{$periode}}')">
<span class="toggle"></span>
</label>
</div>
<div class="text-warning p-1 justify-content-center" id="planText_n{{$niveau}}_p{{$periode}}">
Plan de cours non remis
</div>
</div>
</div>
<div class="col-6">
<div class="form-group label-floating">
<input type="text" placeholder="Nom du cours" class="form-control" />
<span class="form-control-feedback">
<div class="col-4 text-right">
<button type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="sr-only">Toggle Dropdown</span>
</button>
<div class="dropdown-menu">
<button id="modeSwitchC{{$niveau}}-{{$periode}}" class="btn-secondary dropdown-item active m-1" onclick="selectCourseMode('course',{{$niveau}},{{$periode}})">Mode "Cours" pour cette période</button>
<button id="modeSwitchO{{$niveau}}-{{$periode}}" class="btn-secondary dropdown-item m-1" onclick="selectCourseMode('other',{{$niveau}},{{$periode}})">Mode "Autre" pour cette période</button>
<div class="dropdown-divider"></div>
<button class="btn-secondary dropdown-item" href="#">Réinitialiser</button>
</div>
</div>
</div>
<div class="tab-content text-center">
<div class="tab-pane active" id="home">
<div class="row pt-2">
<div class="col-12 d-none" id="descContainer{{$niveau}}-{{$periode}}">
<div class="form-group">
<label for="exampleFormControlTextarea1">Description de la période</label>
<textarea class="form-control" id="exampleFormControlTextarea1" rows="2"></textarea>
</div>
</div>
<div class="col-6 mb-1" id="OCOMContainer{{$niveau}}-{{$periode}}">
<div class="form-group label-floating">
<div class="autocomplete">
<input type="text" placeholder="OCOM du cours" id="ocom_n{{$niveau}}_p{{$periode}}" class="form-control AutoCompleteOCOM" aria-describedby="nameHelp" autocomplete="off" required onblur="updateCourseName('{{$niveau}}','{{$periode}}')">
</div>
<span class="form-control-feedback">
<i class="material-icons">done</i>
</span>
</div>
</div>
<div class="col-6" id="nameContainer{{$niveau}}-{{$periode}}">
<div class="form-group label-floating">
<input type="text" placeholder="Nom du cours" id="name_n{{$niveau}}_p{{$periode}}" class="form-control" required />
<span class="form-control-feedback">
<i class="material-icons">clear</i>
</span>
</div>
</div>
<div class="col-6 mb-1">
<div class="form-group label-floating">
<input type="text" placeholder="Lieu du cours" class="form-control" />
<span class="form-control-feedback">
<i class="material-icons">done</i>
</span>
</div>
</div>
<div class="col-6">
<div class="form-group label-floating">
<div class="autocomplete">
<input type="text" placeholder="Nom de l'instructeur" id="instruc_n{{$niveau}}_p{{$periode}}" class="form-control AutoComplete" aria-describedby="nameHelp" autocomplete="off" required>
</div>
</div>
<span class="form-control-feedback">
<div class="col-6 mb-1">
<div class="form-group label-floating">
<input type="text" placeholder="Lieu du cours" class="form-control" required/>
<span class="form-control-feedback">
<i class="material-icons">done</i>
</span>
</div>
</div>
<div class="col-6">
<div class="form-group label-floating">
<div class="autocomplete">
<input type="text" placeholder="Nom de l'instructeur" id="instruc_n{{$niveau}}_p{{$periode}}" class="form-control AutoCompleteUser" aria-describedby="nameHelp" autocomplete="off" required>
</div>
<span class="form-control-feedback">
<i class="material-icons">done</i>
</span>
</div>
</div>
</div>
</div>
<div class="tab-pane" id="updates">
Test
</div>
</div>

View File

@@ -6,11 +6,24 @@
</div>
@foreach($eventType->schedule_model['niveaux'] as $niveau)
<div class="col border-right border-bottom bg-dark text-white">
<div class="form-group label-floating">
<input type="text" placeholder="Niveau" class="form-control text-white" value="{{$niveau['name']}}" />
<span class="form-control-feedback">
<div class="row">
<div class="col-9">
<div class="form-group label-floating">
<input type="text" placeholder="Niveau" class="form-control text-white" value="{{$niveau['name']}}" />
<span class="form-control-feedback">
<i class="material-icons">clear</i>
</span>
</div>
</div>
<div class="col-3 text-right">
<button type="button" class="btn btn-link btn-sm dropdown-toggle dropdown-toggle-split text-white" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="sr-only">Toggle Dropdown</span>
</button>
<div class="dropdown-menu">
<button id="modeSwitchPeriodeC{{$loop->index+1}}" class="btn-secondary dropdown-item m-1" onclick="selectCourseModeNiveau('course',{{$loop->index+1}})">Mode "Cours" pour toutes les périodes</button>
<button id="modeSwitchPeriodeO{{$loop->index+1}}" class="btn-secondary dropdown-item m-1" onclick="selectCourseModeNiveau('other',{{$loop->index+1}})">Mode "Autre" pour toutes les période</button>
</div>
</div>
</div>
</div>
@endforeach
@@ -23,11 +36,24 @@
@foreach($eventType->schedule_model['periodes'] as $periode)
<div class="row">
<div class="col-2 d-inline border-right border-bottom bg-light">
<div class="form-group label-floating">
<input type="text" placeholder="Période" class="form-control" value="{{$periode['name']}}" />
<span class="form-control-feedback">
<i class="material-icons">clear</i>
</span>
<div class="row">
<div class="col-9">
<div class="form-group label-floating">
<input type="text" placeholder="Période" class="form-control" value="{{$periode['name']}}" />
<span class="form-control-feedback">
<i class="material-icons">clear</i>
</span>
</div>
</div>
<div class="col-3 text-right">
<button type="button" class="btn btn-sm btn-secondary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="sr-only">Toggle Dropdown</span>
</button>
<div class="dropdown-menu">
<button id="modeSwitchPeriodeC{{$loop->index+1}}" class="btn-secondary dropdown-item m-1" onclick="selectCourseModePeriode('course',{{$loop->index+1}})">Mode "Cours" pour toute la période</button>
<button id="modeSwitchPeriodeO{{$loop->index+1}}" class="btn-secondary dropdown-item m-1" onclick="selectCourseModePeriode('other',{{$loop->index+1}})">Mode "Autre" pour toute la période</button>
</div>
</div>
</div>
<div class="row">
<div class="col-6">
@@ -45,7 +71,7 @@
</div>
</div>
@foreach($eventType->schedule_model['niveaux'] as $niveau)
<div id="container-{{$loop->index+1}}-{{$loop->parent->index+1}}" niveau="{{$loop->index+1}}" periode="{{$loop->parent->index+1}}" class="col scheduleEditor-course">
<div id="container-{{$loop->index+1}}-{{$loop->parent->index+1}}" niveau="{{$loop->index+1}}" periode="{{$loop->parent->index+1}}" class="col m-0 border-bottom border-right scheduleEditor-course">
@loaderDot
</div>
@endforeach

View File

@@ -58,7 +58,7 @@
</div>
</div>
</div>
<div class="card card-collapse" id="collmessagedelasemaine">
<div class="card card-collapse d-none" id="collmessagedelasemaine">
<div class="card-header" role="tab" id="headingTwo">
<h5 class="mb-0">
<a class="collapsed" data-toggle="collapse" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
@@ -86,7 +86,7 @@
</div>
</div>
</div>
<div class="card card-collapse" id="collschedule">
<div class="card card-collapse d-none" id="collschedule">
<div class="card-header" role="tab" id="headingThree">
<h5 class="mb-0">
<a class="collapsed" data-toggle="collapse" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
@@ -97,7 +97,7 @@
</div>
<div id="collapseThree" class="collapse" role="tabpanel" aria-labelledby="headingThree" data-parent="#accordion">
<div class="card-body" style="overflow: scroll">
<div id="scheduleEditor" class="m-3" style="width: 90vw">
<div id="scheduleEditor" class="m-3" style="width: 110vw">
@loaderDot
</div>
</div>

View File

@@ -42,7 +42,8 @@ Route::middleware('auth:api')->group(function () {
Route::get('/user/list', 'UserController@apiList')->middleware('perm:user_see');
/** OCOM Route */
Route::get('/ocom/list', 'UserController@apiList')->middleware('perm:user_see');
Route::get('/ocom/list', 'OCOMController@jsonList')->middleware('perm:schedule_see');
Route::get('/ocom/{id}/name','OCOMController@getName')->middleware('perm:schedule_see');
/** Inventory Route */
Route::post('/item/delete', 'ItemController@destroy')->middleware('perm:inventory_delete');