April 9 update

This commit is contained in:
George Frederick "Buzz" Beurling
2020-04-09 17:20:03 -04:00
parent 94509caf3c
commit 50abb9d909
57 changed files with 2635 additions and 854 deletions

View File

@@ -42,4 +42,80 @@ class Course extends Model
{
return $this->name == "" && $this->ocom == "";
}
public function lessonPlan()
{
return $this->hasOne('App\LessonPlan');
}
public static function allFuture()
{
$courses = Course::all();
foreach ($courses as $key => $course)
{
if (date('c',strtotime($course->event->date_begin)) <= date('c'))
{
$courses->forget($key);
}
}
return $courses;
}
public static function allThisYear()
{
$courses = Course::all();
foreach ($courses as $key => $course)
{
if (date('c',strtotime($course->event->date_begin)) <= date('c',strtotime(\App\Config::getData('instruction_year_begin'))))
{
$courses->forget($key);
}
if (date('c',strtotime($course->event->date_begin)) >= date('c',strtotime(\App\Config::getData('instruction_year_end'))))
{
$courses->forget($key);
}
}
return $courses;
}
public static function allForUser($user_id)
{
$courses = Course::all();
foreach ($courses as $key => $course)
{
if ($course->user_id != $user_id)
{
$courses->forget($key);
}
}
return $courses;
}
public static function allForAuthUser()
{
return self::allForUser(\Auth::user()->id);
}
public static function allFutureForUser($user_id)
{
$courses = Course::all();
foreach ($courses as $key => $course)
{
if (date('c',strtotime($course->event->date_begin)) <= date('c'))
{
$courses->forget($key);
}
if ($course->user_id != $user_id)
{
$courses->forget($key);
}
}
return $courses;
}
public static function allFutureForAuthUser()
{
return self::allFutureForUser(\Auth::user()->id);
}
}

View File

@@ -60,6 +60,23 @@ class Event extends Model
return $events;
}
public static function allThisYear()
{
$events = Event::all();
foreach ($events as $key => $event)
{
if (date('c',strtotime($event->date_begin)) <= date('c',strtotime(\App\Config::getData('instruction_year_begin'))))
{
$events->forget($key);
}
if (date('c',strtotime($event->date_begin)) >= date('c',strtotime(\App\Config::getData('instruction_year_end'))))
{
$events->forget($key);
}
}
return $events;
}
public static function checkForError()
{
$events = Event::all();

View File

@@ -327,4 +327,63 @@ class GoogleDriveFile extends Model
$contents = collect(Storage::cloud()->listContents('/', true));
return json_encode($contents->where('type', '=', 'dir'));
}
public static function getSidebarFile()
{
$user = \Auth::user();
$sidebarArray = [];
$dirList = \App\GoogleDriveFile::all();
if ($dirList->where('path','=','.Privé/.Cadet')->first()->canAuthUser())
{
$sidebarArray['Cadet'] = [
'route' => 'admin.files.cadet',
'icon' => 'fas fa-folder-open',
'perm' => null,
'child' => null
];
}
if ($dirList->where('path','=','.Privé/.Staff')->first()->canAuthUser())
{
$sidebarArray['Staff'] = [
'route' => 'admin.files.staff',
'icon' => 'fas fa-folder-open',
'perm' => null,
'child' => null
];
}
if ($dirList->where('path','=','.Privé/.ETAMAS')->first()->canAuthUser())
{
$sidebarArray['ETAMAS'] = [
'route' => 'admin.files.etamas',
'icon' => 'fas fa-folder-open',
'perm' => null,
'child' => null
];
}
if ($dirList->where('path','=','.Privé/.Officier')->first()->canAuthUser())
{
$sidebarArray['Officier'] = [
'route' => 'admin.files.officier',
'icon' => 'fas fa-folder-open',
'perm' => null,
'child' => null
];
}
$sidebarArray['Publique'] = [
'route' => 'admin.files.publique',
'icon' => 'fas fa-folder-open',
'perm' => null,
'child' => null
];
if (\Auth::user()->p('drive_see') == 1)
{
$sidebarArray['Google Drive'] = [
'route' => 'admin.drive',
'icon' => 'fab fa-google-drive',
'perm' => null,
'child' => null
];
}
return $sidebarArray;
}
}

View File

@@ -26,7 +26,7 @@ class AdminController extends Controller
{
clog('navigate','success','consulte le tableau de bord');
return view('admin.dashboard',['futureEvent' => \App\Event::future()->take(3),'userClasse' => \Auth::User()->getClasse()->forPage(1,6)]);
return view('admin.dashboard',['futureEvent' => \App\Event::future()->take(3),'userClasse' => \Auth::user()->futureCourses()->forPage(1,6)]);
}
public function update()
@@ -42,4 +42,9 @@ class AdminController extends Controller
return view('admin.status.index',['alerts' => $alerts]);
}
public function instruction()
{
}
}

View File

@@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Course;
use App\GoogleDriveFile;
use Illuminate\Http\Request;
class CourseController extends Controller
@@ -14,7 +15,17 @@ class CourseController extends Controller
*/
public function index()
{
//
$mode = 'future';
if (\request('all'))
{
$courses = Course::all();
$mode = 'all';
}
else
{
$courses = Course::allFuture();
}
return view('admin.course.index',['courses' => $courses,'mode' => $mode]);
}
/**
@@ -41,18 +52,25 @@ class CourseController extends Controller
/**
* Display the specified resource.
*
* @param \App\Course $course
* @return \Illuminate\Http\Response
* @param $id
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function show(Course $course)
public function show($id)
{
//
$course = Course::find($id);
$user = \App\User::find($course->user_id);
$name = $course->user_id;
if ($user != null)
{
$name = $user->fullname();
}
return view('admin.course.show',['course' => $course,'username' => $name,'lessonPlanDir' => \App\GoogleDriveFile::findByPath('.Systeme/.Fichier/.PlanDeCours')->id]);
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Course $course
* @param Course $course
* @return \Illuminate\Http\Response
*/
public function edit(Course $course)
@@ -64,7 +82,7 @@ class CourseController extends Controller
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Course $course
* @param Course $course
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Course $course)
@@ -72,14 +90,105 @@ class CourseController extends Controller
//
}
public function updateCommentOfficer(Request $request, $id)
{
$course = Course::findOrFail($id);
$course->comment_officer = $request->comment_officer;
$course->save();
return redirect()->back()->with('success','Modification enregisté avec succès');
}
public function updateComment(Request $request, $id)
{
$course = Course::findOrFail($id);
$course->comment = $request->comment;
$course->save();
return redirect()->back()->with('success','Modification enregisté avec succès');
}
public function updateCommentOfficerPlan(Request $request, $id)
{
$course = Course::findOrFail($id);
$course->lessonPlan->comment = $request->comment_officer;
$course->lessonPlan->save();
return redirect()->back()->with('success','Modification enregisté avec succès');
}
public function updateCommentPlan(Request $request, $id)
{
$course = Course::findOrFail($id);
$course->lessonPlan->desc = $request->comment;
$course->lessonPlan->save();
return redirect()->back()->with('success','Modification enregisté avec succès');
}
public function updateLessonPlan(Request $request, $id)
{
$course = Course::findOrFail($id);
$name = $course->ocom.'_'.$course->instructor().'_'.$course->event->date_begin.'_'.'v'.date('c').'.'.\request()->file('file')->getClientOriginalExtension();
$name = urlencode($name);
$dirID = \App\GoogleDriveFile::findByPath('.Systeme/.Fichier/.PlanDeCours')->id;
if ($course->lessonPlan != null)
{
$lessonPlan = $course->lessonPlan;
$contents = collect(\Storage::cloud()->listContents($dirID, false));
$file = $contents
->where('type', '=', 'file')
->where('filename', '=', pathinfo($course->lessonPlan->file, PATHINFO_FILENAME))
->where('extension', '=', pathinfo($course->lessonPlan->file, PATHINFO_EXTENSION))
->first(); // there can be duplicate file names!
\Storage::cloud()->delete($file['path']);
}
else
{
$lessonPlan = new \App\LessonPlan();
}
\Storage::cloud()->putFileAs($dirID,\request()->file('file'),$name);
$metadata = \Storage::cloud()->getMetadata($dirID.'/'.$name);
$lessonPlan->user_id = \Auth::user()->id;
$lessonPlan->file = $metadata['name'];
$lessonPlan->course_id = $course->id;
$lessonPlan->desc = "";
$lessonPlan->comment = "";
$lessonPlan->save();
return redirect()->back();
}
/**
* Remove the specified resource from storage.
*
* @param \App\Course $course
* @param Course $course
* @return \Illuminate\Http\Response
*/
public function destroy(Course $course)
{
//
}
public function validatePlan($id)
{
$course = Course::findOrFail($id);
if ($course->lessonPlan)
{
if ($course->lessonPlan->approved)
{
$course->lessonPlan->approved = false;
}
else
{
$course->lessonPlan->approved = true;
}
$course->lessonPlan->save();
return strval($course->lessonPlan->approved);
}
return abort(500);
}
}

View File

@@ -44,9 +44,10 @@ class EventTypeController extends Controller
* @param \App\EventType $eventType
* @return \Illuminate\Http\Response
*/
public function show(EventType $eventType)
public function show($id)
{
//
$event_type = EventType::findOrFail($id);
return view('admin.event_type.show',['event_type' => $event_type]);
}
/**

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
use App\GoogleDriveFile;
use Illuminate\Http\Request;
class FilesController extends Controller
@@ -84,6 +85,38 @@ class FilesController extends Controller
public function guide()
{
return view('admin.files.guide');
$dirID = \App\GoogleDriveFile::findByPath('.Privé/.Staff/.Guide');
$dir = collect(\Storage::cloud()->listContents($dirID->id,false))->sortBy('name');
return view('admin.files.guide',['dir' => $dir]);
}
public function instruction()
{
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Staff/.Instruction')->first()->id, 'mode' => 'folder']);
}
public function cadet()
{
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Cadet')->first()->id, 'mode' => 'folder']);
}
public function staff()
{
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Staff')->first()->id, 'mode' => 'folder']);
}
public function etamas()
{
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.ETAMAS')->first()->id, 'mode' => 'folder']);
}
public function officier()
{
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Privé/.Officier')->first()->id, 'mode' => 'folder']);
}
public function publique()
{
return view('admin.files.Google Drive.index',['folder' => \App\GoogleDriveFile::where('path','=','.Publique')->first()->id, 'mode' => 'folder']);
}
}

View File

@@ -22,6 +22,11 @@ class GoogleDriveController extends Controller
return view('admin.files.Google Drive.index',['folder' => $folder]);
}
public function indexFolder($folder = '')
{
return view('admin.files.Google Drive.index',['folder' => $folder,'mode' => 'folder']);
}
/**
* Show the form for creating a new file.
*
@@ -172,6 +177,14 @@ class GoogleDriveController extends Controller
->where('type', '=', 'file')
->where('filename', '=', pathinfo($filename, PATHINFO_FILENAME))
->first(); // there can be duplicate file names!
if ($file == null)
{
$filename = \request('f');
$file = $contents
->where('type', '=', 'file')
->where('filename', '=', pathinfo($filename, PATHINFO_FILENAME))
->first(); // there can be duplicate file names!
}
$rawData = Storage::cloud()->get($file['path']);
$filename = urlencode($filename);
@@ -335,76 +348,71 @@ class GoogleDriveController extends Controller
public function getFileStructure()
{
return collect([
'🔒.Privé' => [
'.Systeme' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Privé/🔒.Cadet' => [
'.Systeme/.Fichier' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Privé/🔒.ETAMAS' => [
'.Systeme/.Fichier/.PlanDeCours' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Privé/🔒.Officier' => [
'.Privé' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Privé/🔒.Staff' => [
'.Privé/.Cadet' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Privé/🔒.Staff/🔒.Guide' => [
'.Privé/.ETAMAS' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Publique' => [
'.Privé/.Officier' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'.Privé/.Staff' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'.Privé/.Staff/.Guide' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'.Privé/.Staff/.Instruction' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'.Publique' => [
'rank' => [1 => 'rwp',0 => 'r'],
'job' => [],
'user' => []
],
'🔒.Publique/🔒.Fichier' => [
'.Publique/.Fichier' => [
'rank' => [1 => 'rwp',0 => 'r'],
'job' => [],
'user' => []
],
'🔒.Publique/🔒.Image' => [
'.Publique/.Image' => [
'rank' => [1 => 'rwp',0 => 'r'],
'job' => [],
'user' => []
],
'🔒.Système' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Système/🔒.Fichier' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Système/🔒.Image' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Système/🔒.Image/🔒.Nouvelle' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
'🔒.Système/🔒.Image/🔒.Profil' => [
'rank' => [1 => 'rwp'],
'job' => [],
'user' => []
],
]);
}
@@ -412,7 +420,7 @@ class GoogleDriveController extends Controller
{
$contents = collect(\Storage::cloud()->listContents($d, false));
$dir = $contents->where('type', '=', 'dir');
$dir = $dir->where('filename','=','🔒');
$dir = $dir->where('filename','=','');
return $dir;
}
@@ -481,6 +489,142 @@ class GoogleDriveController extends Controller
return view('admin.files.Google Drive.permission.edit',['folder' => $dir,'subject' => $foo,'perm' => $perm,'s' => $subject]);
}
public function addPermissionModal($folder,$subject)
{
$dir = GoogleDriveFile::find($folder);
$list = null;
if ($subject == 'rank')
{
$list = \App\Rank::all();
}
elseif ($subject == 'job')
{
$list = \App\Job::all();
}
else
{
$list = \App\User::all();
}
return view('admin.files.Google Drive.permission.add',['folder' => $dir,'list' => $list,'s' => $subject]);
}
public function patchPermission(Request $request,$folder,$subject,$id)
{
$f = GoogleDriveFile::find($folder);
$permstring = '';
if (isset($request->read))
{
if ($request->read == 'on')
{
$permstring = $permstring.'r';
}
}
if (isset($request->write))
{
if ($request->write == 'on')
{
$permstring = $permstring.'w';
}
}
if (isset($request->perm))
{
if ($request->perm == 'on')
{
$permstring = $permstring.'p';
}
}
if ($subject == 'rank')
{
$temp = $f->rank_permission;
$temp[$id] = $permstring;
$f->rank_permission = $temp;
}
if ($subject == 'job')
{
$temp = $f->job_permission;
$temp[$id] = $permstring;
$f->job_permission = $temp;
}
if ($subject == 'user')
{
$temp = $f->user_permission;
$temp[$id] = $permstring;
$f->user_permission = $temp;
}
$f->save();
return redirect()->back()->with('success','Modification enregistré avec succès');
}
public function addPermission(Request $request,$folder,$subject)
{
$f = GoogleDriveFile::find($folder);
$permstring = '';
if (isset($request->read))
{
if ($request->read == 'on')
{
$permstring = $permstring.'r';
}
}
if (isset($request->write))
{
if ($request->write == 'on')
{
$permstring = $permstring.'w';
}
}
if (isset($request->perm))
{
if ($request->perm == 'on')
{
$permstring = $permstring.'p';
}
}
if ($subject == 'rank')
{
$temp = $f->rank_permission;
$temp[$request->id] = $permstring;
$f->rank_permission = $temp;
}
if ($subject == 'job')
{
$temp = $f->job_permission;
$temp[$request->id] = $permstring;
$f->job_permission = $temp;
}
if ($subject == 'user')
{
$temp = $f->user_permission;
$temp[$request->id] = $permstring;
$f->user_permission = $temp;
}
$f->save();
return redirect()->back()->with('success','Modification enregistré avec succès');
}
public function deletePermission($folder,$subject,$id)
{
$f = GoogleDriveFile::find($folder);
if ($subject == 'rank')
{
$temp = $f->rank_permission;
unset($temp[$id]);
$f->rank_permission = $temp;
}
if ($subject == 'job')
{
$temp = $f->job_permission;
unset($temp[$id]);
$f->job_permission = $temp;
}
if ($subject == 'user')
{
$temp = $f->user_permission;
unset($temp[$id]);
$f->user_permission = $temp;
}
$f->save();
return redirect()->back()->with('success','Modification enregistré avec succès');
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace App\Http\Controllers;
use App\LessonPlan;
use Illuminate\Http\Request;
class LessonPlanController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param \App\LessonPlan $lessonPlan
* @return \Illuminate\Http\Response
*/
public function show(LessonPlan $lessonPlan)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\LessonPlan $lessonPlan
* @return \Illuminate\Http\Response
*/
public function edit(LessonPlan $lessonPlan)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\LessonPlan $lessonPlan
* @return \Illuminate\Http\Response
*/
public function update(Request $request, LessonPlan $lessonPlan)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param \App\LessonPlan $lessonPlan
* @return \Illuminate\Http\Response
*/
public function destroy(LessonPlan $lessonPlan)
{
//
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProfilController extends Controller
{
public function courses()
{
$mode = 'future';
if (\request('all'))
{
$courses = \App\Course::allForAuthUser();
$mode = 'all';
}
else
{
$courses = \App\Course::allFutureForAuthUser();
}
return view('admin.user.profil.courses',['courses' => $courses,'mode' => $mode]);
}
}

View File

@@ -11,49 +11,21 @@ class ScheduleController extends Controller
{
public function index()
{
return view('admin.configs.schedule',['configs' => \App\Config::all()]);
return view('admin.configs.schedule',['configs' => \App\Config::all(),'events_type' => \App\EventType::all()]);
}
public function update()
public function update(Request $request)
{
$configs = ['admin_periode_nb'];
$instruction_year_begin = \App\Config::find('instruction_year_begin');
$instruction_year_end = \App\Config::find('instruction_year_end');
foreach ($configs as $config) {
$c = \App\Config::all()->where('name',$config)->first();
$c->data = [request($config)];
$c->save();
}
$instruction_year_begin->data = [date('Y-m-d',strtotime($request->instruction_year_begin))];
$instruction_year_end->data = [date('Y-m-d',strtotime($request->instruction_year_end))];
$new_admin_periode_begin = [];
$new_admin_periode_end = [];
for ($i=1; $i <= request('admin_periode_nb'); $i++) {
if(request('admin_periode_begin_'.$i))
{
$new_admin_periode_begin[$i] = request('admin_periode_begin_'.$i);
}
else
{
$new_admin_periode_begin[$i] = "00:00";
}
if(request('admin_periode_end_'.$i))
{
$new_admin_periode_end[$i] = request('admin_periode_end_'.$i);
}
else
{
$new_admin_periode_end[$i] = "00:00";
}
}
$instruction_year_begin->save();
$instruction_year_end->save();
$temp = \App\Config::all()->where('name','admin_periode_begin')->first();
$temp->data = $new_admin_periode_begin;
$temp->save();
$temp = \App\Config::all()->where('name','admin_periode_end')->first();
$temp->data = $new_admin_periode_end;
$temp->save();
return redirect('/admin/config/schedule')->with('success','Modification sauvegarder avec succès !');
return redirect('/admin/config/instruction')->with('success','Modification sauvegarder avec succès !');
}
public function apiIndex()

View File

@@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class StatsController extends Controller
{
public function instruction()
{
$instructorUTTD = collect();
$coursesTY = \App\Course::allThisYear();
$nbCoursePlanDoneTY = 0;
$nbCoursePlanDoneAndCheckTY = 0;
foreach ($coursesTY as $course)
{
if ($course->lessonPlan)
{
if ($course->lessonPlan->approved)
{
$nbCoursePlanDoneAndCheckTY++;
}
else
{
$nbCoursePlanDoneTY++;
}
}
}
$coursesUTTD = $coursesTY;
$nbCoursePlanDoneUTDP = 0;
$nbCoursePlanDoneAndCheckUTDP = 0;
foreach ($coursesUTTD as $key => $course)
{
if (date('c',strtotime($course->event->date_begin)) >= date('c'))
{
$coursesUTTD->forget($key);
}
else
{
$instructorUTTD->push($course->instructor());
if ($course->lessonPlan)
{
if ($course->lessonPlan->approved)
{
$nbCoursePlanDoneAndCheckUTDP++;
}
else
{
$nbCoursePlanDoneUTDP++;
}
}
}
}
$instructorUTTD = $instructorUTTD->unique();
$eventTY = \App\Event::allThisYear();
$eventUTTD = $eventTY;
foreach ($eventUTTD as $key => $event)
{
if (date('c',strtotime($event->date_begin)) >= date('c'))
{
$eventUTTD->forget($key);
}
}
return view('admin.stats.instruction',[
'nbCourseThisYear' => count($coursesTY),
'nbInstructorUpToThisDay' => count($instructorUTTD),
'nbEventThisYear' => count($eventTY),
'nbEventUpToThisDay' => count($eventUTTD),
'nbCourseUpToThisDay' => count($coursesUTTD),
'nbCoursePlanDoneUTDP' => $nbCoursePlanDoneUTDP,
'nbCoursePlanDoneTY' => $nbCoursePlanDoneTY,
'nbCoursePlanDoneAndCheckUTDP' => $nbCoursePlanDoneAndCheckUTDP,
'nbCoursePlanDoneAndCheckTY' => $nbCoursePlanDoneAndCheckTY,
'nbCourseInDB' => count(\App\OCOM::all()),
]);
}
}

View File

@@ -262,4 +262,14 @@ class UserController extends Controller
return json_encode($name);
}
public function showCourses($id)
{
return view('admin.user.courses',['courses' => User::find($id)->courses]);
}
public function showCourse($id,$course_id)
{
return view('admin.user.course',['courses' => User::find($id)->courses]);
}
}

View File

@@ -63,5 +63,6 @@ class Kernel extends HttpKernel
'admin' => \App\Http\Middleware\AccesAdmin::class,
'perm' => \App\Http\Middleware\CheckPerm::class,
'fileperm' => \App\Http\Middleware\CheckFilePerm::class,
'courseperm' => \App\Http\Middleware\CheckCoursePerm::class,
];
}

View File

@@ -0,0 +1,43 @@
<?php
namespace App\Http\Middleware;
use Closure;
class CheckCoursePerm
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next,$perm = 'see')
{
$course = \App\Course::findOrFail($request->id);
if (\Auth::user()->id == $course->user_id)
{
if ($perm == 'see' || $perm == 'edit')
{
return $next($request);
}
}
if (\Auth::user()->p('course_'.$perm.'_all') == 1)
{
return $next($request);
}
if (\Auth::user()->p('course_'.$perm) == 1)
{
return $next($request);
}
if ($perm == 'validate_plan')
{
abort(401);
}
clog('navigate','danger','L\'utilisateur n\'est pas autorisé à effectuer cette action',\Auth::user()->id);
return redirect('/admin')->with('error','Vous n\'êtes pas autorisé à effectuer cette action');
}
}

13
app/LessonPlan.php Normal file
View File

@@ -0,0 +1,13 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class LessonPlan extends Model
{
public function course()
{
return $this->belongsTo('App\Course');
}
}

View File

@@ -38,36 +38,6 @@ class Permission extends Model
'valeur' => 0
]
],
'message' => [
'msg_see' => [
'ckey' => 'msg_see',
'communName' => 'Voir les messages',
'desc' => 'L\'utilisateur peut-il consulter les messages de la semaine',
'icon' => 'fa-eye',
'valeur' => 0
],
'msg_add' => [
'ckey' => 'msg_add',
'communName' => 'Ajouter un message',
'desc' => 'L\'utilisateur peut-il ajouter un message de la semaine',
'icon' => 'fa-eye',
'valeur' => 0
],
'msg_edit' => [
'ckey' => 'msg_edit',
'communName' => 'Modifier un message',
'desc' => 'L\'utilisateur peut-il modifier les messages de la semaine',
'icon' => 'fa-eye',
'valeur' => 0
],
'msg_delete' => [
'ckey' => 'msg_delete',
'communName' => 'Supprimer un message',
'desc' => 'L\'utilisateur peut-il supprimer un message de la semaine',
'icon' => 'fa-eye',
'valeur' => 0
]
],
'inventory' => [
'inventory_see' => [
'ckey' => 'inventory_see',
@@ -98,36 +68,6 @@ class Permission extends Model
'valeur' => 0
],
],
'booking' => [
'booking_see' => [
'ckey' => 'booking_see',
'communName' => 'Voir les réservations',
'desc' => 'L\'utilisateur peut-il consulter la liste des réservations',
'icon' => 'fa-eye',
'valeur' => 0
],
'booking_add' => [
'ckey' => 'booking_add',
'communName' => 'Ajouter une réservation',
'desc' => 'L\'utilisateur peut-il ajouter une réservation',
'icon' => 'fa-eye',
'valeur' => 0
],
'booking_edit' => [
'ckey' => 'booking_edit',
'communName' => 'Modifier une réservation',
'desc' => 'L\'utilisateur peut-il modifier une réservation',
'icon' => 'fa-eye',
'valeur' => 0
],
'booking_delete' => [
'ckey' => 'booking_delete',
'communName' => 'Supprimer une réservation',
'desc' => 'L\'utilisateur peut-il supprimer une réservation',
'icon' => 'fa-eye',
'valeur' => 0
]
],
'user' => [
'user_see' => [
'ckey' => 'user_see',
@@ -183,7 +123,72 @@ class Permission extends Model
'valeur' => 0
]
],
'schedule' => [
'Instruction' => [
'instruction_guide_see' => [
'ckey' => 'instruction_guide_see',
'communName' => 'Voir les guides pédagogiques et normes de qualifications',
'desc' => 'L\'utilisateur peut-il consulter les guides pédagogiques et normes de qualifications',
'icon' => 'fa-eye',
'valeur' => 0
],
'instruction_db_ocom_see' => [
'ckey' => 'instruction_db_ocom_see',
'communName' => 'Voir la base de donnée de cours',
'desc' => 'L\'utilisateur peut-il consulter la base de donnée des cours',
'icon' => 'fa-eye',
'valeur' => 0
],
'instruction_db_ocom_add' => [
'ckey' => 'instruction_db_ocom_add',
'communName' => 'Ajouter à la base de donnée de cours',
'desc' => 'L\'utilisateur peut-il ajouter à la base de donnée des cours',
'icon' => 'fa-eye',
'valeur' => 0
],
'instruction_db_ocom_edit' => [
'ckey' => 'instruction_db_ocom_edit',
'communName' => 'Modifier la base de donnée de cours',
'desc' => 'L\'utilisateur peut-il modifier la base de donnée des cours',
'icon' => 'fa-eye',
'valeur' => 0
],
'instruction_db_ocom_delete' => [
'ckey' => 'instruction_db_ocom_delete',
'communName' => 'Supprimer de la base de donnée de cours',
'desc' => 'L\'utilisateur peut-il supprimer de la base de donnée des cours',
'icon' => 'fa-eye',
'valeur' => 0
],
'course_see_all' => [
'ckey' => 'course_see_all',
'communName' => 'Voir les cours de tous les utilisateurs',
'desc' => 'L\'utilisateur peut-il voir les cours de tous les utilisateurs',
'icon' => 'fa-eye',
'valeur' => 0
],
'course_comment_officer' => [
'ckey' => 'course_comment_officer',
'communName' => 'Ajouter un commentaire sur n\'importe quel cours',
'desc' => 'L\'utilisateur peut-il ajouter un commentaire sur n\'importe quel cours',
'icon' => 'fa-eye',
'valeur' => 0
],
'course_validate_plan' => [
'ckey' => 'course_validate_plan',
'communName' => 'Valider n\'importe quel plan de cours',
'desc' => 'L\'utilisateur peut-il valider n\'importe quel plan de cours',
'icon' => 'fa-eye',
'valeur' => 0
],
'course_comment_plan_officer' => [
'ckey' => 'course_comment_plan_officer',
'communName' => 'Ajouter un commentaire sur n\'importe quel plan de cours',
'desc' => 'L\'utilisateur peut-il ajouter un commentaire sur n\'importe quel plan de cours',
'icon' => 'fa-eye',
'valeur' => 0
],
],
'Horaire' => [
'schedule_see' => [
'ckey' => 'schedule_see',
'communName' => 'Voir l\'horaire',
@@ -274,146 +279,20 @@ class Permission extends Model
],
],
'file' => [
'file_see_public' => [
'ckey' => 'file_see_public',
'file_see' => [
'ckey' => 'file_see',
'communName' => 'Voir les fichiers publiques',
'desc' => 'L\'utilisateur peut-il consulter les fichiers publiques',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_add_public' => [
'ckey' => 'file_add_public',
'communName' => 'Ajouter un fichier publiques',
'desc' => 'L\'utilisateur peut-il ajouter un fichier disponible publiques',
'drive_see' => [
'ckey' => 'drive_see',
'communName' => 'Voir l\'explorateur de fichier',
'desc' => 'L\'utilisateur peut-il consulter l\'explorateur de fichier',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_edit_public' => [
'ckey' => 'file_edit_public',
'communName' => 'Modifier un fichier publiques',
'desc' => 'L\'utilisateur peut-il modifier un fichier publiques',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_delete_public' => [
'ckey' => 'file_delete_public',
'communName' => 'Supprimer un fichier publiques',
'desc' => 'L\'utilisateur peut-il supprimer un fichier publiques',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_see_cadet' => [
'ckey' => 'file_see_cadet',
'communName' => 'Voir les fichiers des cadets',
'desc' => 'L\'utilisateur peut-il consulter les fichiers des cadets',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_add_cadet' => [
'ckey' => 'file_add_cadet',
'communName' => 'Ajouter un fichier disponible aux cadets',
'desc' => 'L\'utilisateur peut-il ajouter un fichier disponible aux cadets',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_edit_cadet' => [
'ckey' => 'file_edit_cadet',
'communName' => 'Modifier un fichier des cadets',
'desc' => 'L\'utilisateur peut-il modifier un fichier des cadets',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_delete_cadet' => [
'ckey' => 'file_delete',
'communName' => 'Supprimer un fichier des cadets',
'desc' => 'L\'utilisateur peut-il supprimer un fichier des cadets',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_see_staff' => [
'ckey' => 'file_see_staff',
'communName' => 'Voir les fichiers des staffs',
'desc' => 'L\'utilisateur peut-il consulter les fichiers des staffs',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_add_staff' => [
'ckey' => 'file_add_staff',
'communName' => 'Ajouter un fichier disponible aux staffs',
'desc' => 'L\'utilisateur peut-il ajouter un fichier disponible aux staffs\'',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_edit_staff' => [
'ckey' => 'file_edit_staff',
'communName' => 'Modifier un fichier des staffs',
'desc' => 'L\'utilisateur peut-il modifier un fichier des staffs',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_delete_staff' => [
'ckey' => 'file_delete_staff',
'communName' => 'Supprimer un fichier des staffs',
'desc' => 'L\'utilisateur peut-il supprimer un fichier des staffs',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_see_etamas' => [
'ckey' => 'file_see_etamas',
'communName' => 'Voir les fichiers de l\'ETAMAS',
'desc' => 'L\'utilisateur peut-il consulter les fichiers de l\'ETAMAS',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_add_etamas' => [
'ckey' => 'file_add_etamas',
'communName' => 'Ajouter un fichier disponible a l\'ETAMAS',
'desc' => 'L\'utilisateur peut-il ajouter un fichier disponible a l\'ETAMAS',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_edit_etamas' => [
'ckey' => 'file_edit_etamas',
'communName' => 'Modifier un fichier de l\'ETAMAS',
'desc' => 'L\'utilisateur peut-il modifier un fichier de l\'ETAMAS',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_delete_etmas' => [
'ckey' => 'file_delete_staff',
'communName' => 'Supprimer un fichier de l\'ETAMAS',
'desc' => 'L\'utilisateur peut-il supprimer un fichier de l\'ETAMAS',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_see_officier' => [
'ckey' => 'file_see_officier',
'communName' => 'Voir les fichiers des officiers',
'desc' => 'L\'utilisateur peut-il consulter les fichiers des officiers',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_add_officier' => [
'ckey' => 'file_add_officier',
'communName' => 'Ajouter un fichier disponible aux officiers',
'desc' => 'L\'utilisateur peut-il ajouter un fichier disponible aux officiers',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_edit_officier' => [
'ckey' => 'file_edit_officier',
'communName' => 'Modifier un fichier des officiers',
'desc' => 'L\'utilisateur peut-il modifier un fichier des officiers',
'icon' => 'fa-eye',
'valeur' => 0
],
'file_delete_officier' => [
'ckey' => 'file_delete_staff',
'communName' => 'Supprimer un fichier des officiers',
'desc' => 'L\'utilisateur peut-il supprimer un fichier des officiers',
'icon' => 'fa-eye',
'valeur' => 0
]
]
];

View File

@@ -77,18 +77,7 @@ class User extends Authenticatable
public function futureCourses()
{
$filterCourse = collect();
foreach (\Auth::user()->courses as $course)
{
if($course->event)
{
if(date('U',strtotime($course->event->date_begin)) >= date('U'))
{
$filterCourse->push($course);
}
}
}
return $filterCourse;
return \App\Course::allFutureForUser($this->id);
}
public function routeNotificationForNexmo($notification)

View File

@@ -21,6 +21,7 @@ class CreateCoursesTable extends Migration
$table->integer('level');
$table->string('location');
$table->text('comment');
$table->text('comment_officer');
$table->integer('event_id');
$table->string('user_id');
$table->timestamps();

View File

@@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLessonPlansTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('lesson_plans', function (Blueprint $table) {
$table->bigIncrements('id');
$table->integer('user_id');
$table->string('file');
$table->integer('course_id')->nullable();
$table->text('desc')->nullable();
$table->text('comment')->nullable();
$table->boolean('approved')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('lesson_plans');
}
}

1
public/css/Chart.min.css vendored Normal file
View File

@@ -0,0 +1 @@
@keyframes chartjs-render-animation{from{opacity:.99}to{opacity:1}}.chartjs-render-monitor{animation:chartjs-render-animation 1ms}.chartjs-size-monitor,.chartjs-size-monitor-expand,.chartjs-size-monitor-shrink{position:absolute;direction:ltr;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1}.chartjs-size-monitor-expand>div{position:absolute;width:1000000px;height:1000000px;left:0;top:0}.chartjs-size-monitor-shrink>div{position:absolute;width:200%;height:200%;left:0;top:0}

View File

@@ -1836,4 +1836,8 @@ h2 {
.no-hover:hover {
background-color: initial;
}
tfoot > tr {
width: 100%;
}

BIN
public/images/sidebar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

12
public/js/app.js vendored
View File

@@ -1,4 +1,16 @@
extendSidebar();
function navigate(url)
{
window.location.href = window.location+'/'+url;
}
function extendSidebar()
{
let foo = $('.nav-item.active');
if (foo.attr('parent'))
{
$('#'+foo.attr('parent')).collapse('show');
$('#link-'+foo.attr('parent')).addClass('active');
}
}

7
public/js/plugins/Chart.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

45
public/js/plugins/course.js vendored Normal file
View File

@@ -0,0 +1,45 @@
$('.richeditor').trumbowyg({
lang: 'fr',
btns: [
['viewHTML'],
['emoji'],
['undo', 'redo'], // Only supported in Blink browsers
['strong', 'em', 'del'],
['superscript', 'subscript'],
['fontfamily'],
['fontsize'],
['foreColor', 'backColor'],
['link'],
['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'],
['unorderedList', 'orderedList'],
['horizontalRule'],
['removeformat'],
['fullscreen']
]
});
function switchPlanStatus(id)
{
$.ajax({
type: 'POST',
url: '/api/course/'+id+'/plan/validate?api_token='+api_token,
success: function (data) {
if (data == '1')
{
showNotification('success','Le plan de cours est maintenant vérifié','top', 'center');
$("[name='isPlanCheck']").prop( "checked", true );
}
else
{
showNotification('warning','Le plan de cours n\'est maintenant plus vérifié','top', 'center');
$("[name='isPlanCheck']").prop( "checked", false );
}
},
error: function () {
showNotification('error','Erreur impossible de changer le status du plan de cours','top', 'center');
$("[name='isPlanCheck']").prop( "checked", false );
}
})
}

View File

@@ -4,8 +4,13 @@ var currentFolder = '';
var folderGoBack = [];
var permissionModalHtml = null;
var progressBar = 0;
function init(folder)
var originalFolder;
var mode = '';
function init(folder,pmode = '')
{
mode = pmode;
console.log(mode);
originalFolder = folder;
loadFolder(folder);
loadHistory();
}
@@ -28,7 +33,17 @@ function loadHistory() {
updateProgressBar(progressBar+10);
if(!currentFolder == '' || !currentFolder == 'root')
{
btnBack.removeAttr('disabled');
if (mode == 'folder')
{
if (currentFolder != originalFolder)
{
btnBack.removeAttr('disabled');
}
}
else
{
btnBack.removeAttr('disabled');
}
}
updateProgressBar(progressBar+5);
},
@@ -50,11 +65,13 @@ function loadFolder(folder) {
type: 'GET',
url: '/api/drive/folders/'+folder+'?api_token=' + api_token,
success: function (template) {
// Load Explorer Content
updateProgressBar(progressBar+30);
$(".drive-explorer").html(template);
currentFolder = folder;
window.history.pushState("object or string", "Page Title", "/admin/drive/"+folder);
if (mode != 'folder')
{
window.history.pushState("object or string", "Page Title", "/admin/drive/"+folder);
}
updateProgressBar(progressBar+5);
hideLoader();
@@ -68,7 +85,21 @@ function loadFolder(folder) {
}
else
{
$('#backbtn').removeAttr('disabled');
if (mode == 'folder')
{
if (currentFolder != originalFolder)
{
$('#backbtn').removeAttr('disabled');
}
else
{
$('#backbtn').prop('disabled','true');
}
}
else
{
$('#backbtn').removeAttr('disabled');
}
}
}
updateProgressBar(progressBar+10);
@@ -151,13 +182,16 @@ function editPermission(folder,subject,id)
$('#permissionModal').on('hidden.bs.modal', function (e) {
$('#permissionModalHtml').html(permissionModalHtml);
});
let csrf = $('input[name="_token"]').val();
$.ajax({
type: 'GET',
url: '/api/drive/'+folder+'/permission/'+subject+'/'+id+'?api_token=' + api_token,
success: function (modal) {
permissionModalHtml = $('#permissionModalHtml').html();
$('#permissionModalHtml').html(modal);
$('#csrf').val(csrf);
$('#permissionModal').modal('show');
},
error: function () {
@@ -166,6 +200,51 @@ function editPermission(folder,subject,id)
});
}
function addPermission(folder,subject)
{
$('#permissionModal').on('hidden.bs.modal', function (e) {
$('#permissionModalHtml').html(permissionModalHtml);
});
let csrf = $('input[name="_token"]').val();
$.ajax({
type: 'GET',
url: '/api/drive/'+folder+'/addpermission/'+subject+'/?api_token=' + api_token,
success: function (modal) {
permissionModalHtml = $('#permissionModalHtml').html();
$('#permissionModalHtml').html(modal);
$('#csrf').val(csrf);
$('#permissionModal').modal('show');
},
error: function () {
showNotification('error', 'Impossible de charger le dossier '+folder, 'top', 'center')
}
});
}
function deletePermission(folder,subject,id)
{
$('#permissionModal').on('hidden.bs.modal', function (e) {
$('#permissionModalHtml').html(permissionModalHtml);
});
swal({
title: 'Êtes vous certain de vouloir supprimer les permissions ?',
text: "Vous ne pourrez pas annuler cette action",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Oui',
cancelButtonText: 'Non'
}).then((result) => {
if (result.value) {
window.location.href = '/admin/drive/'+folder+'/deletepermission/'+subject+'/'+id;
}
})
}
function updateProgressBar(value)
{
progressBar = value;
@@ -180,3 +259,17 @@ function updateProgressBar(value)
$('.progress').fadeIn(650);
}
}
function updateHeader(perm)
{
if (perm == 1)
{
$('#createDropdown').removeClass('d-none');
$('#uploadDropdown').removeClass('d-none');
}
else
{
$('#createDropdown').addClass('d-none');
$('#uploadDropdown').addClass('d-none');
}
}

View File

@@ -1836,4 +1836,8 @@ h2 {
.no-hover:hover {
background-color: initial;
}
tfoot > tr {
width: 100%;
}

View File

@@ -14,14 +14,14 @@
<div class="col-md-12">
<div class="form-group">
<label>Nom</label>
<input class="form-control" type="text" name="name" value="{{$rank->name}}">
<input class="form-control" type="text" name="name" value="{{$rank->name}}" required>
<small class="form-text text-muted">Nom du grade</small>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<label>Description</label>
<textarea id="desc" name="desc">{!! $rank->desc !!}</textarea>
<textarea id="desc" name="desc" required>{!! $rank->desc !!}</textarea>
<small class="form-text text-muted">Description du grade</small>
</div>
</div>
@@ -33,35 +33,31 @@
</p>
<div id="accordion" role="tablist">
@foreach(\App\Permission::allToArray() as $key => $cat)
<div class="card card-collapse">
<div class="card-header" role="tab" id="headingOne">
<h5 class="mb-0">
<a class="text-capitalize" data-toggle="collapse" href="#coll-{{$key}}" @if ($loop->first) aria-expanded="true" @endif aria-controls="collapseOne">
{{$key}}
<i class="material-icons">keyboard_arrow_down</i>
</a>
</h5>
</div>
<div id="coll-{{$key}}" class="collapse @if ($loop->first) show @endif" role="tabpanel" aria-labelledby="headingOne" data-parent="#accordion">
<div class="card-body">
<div class="row">
@foreach($cat as $r)
<div class="col text-center">
<input class="d-none" type="text" id="{{$r['ckey']}}" name="{{$r['ckey']}}" value="{{$rank->p($r['ckey'])}}">
<h5>{{$r['communName']}}</h5>
<div class="btn-group">
<button type="button" id="{{$r['ckey']}}-close" class="btn btn-just-icon @if($rank->p($r['ckey']) != -1) btn-outline-danger @else btn-danger @endif" onclick="switchPermissionSwitch('{{$r['ckey']}}','close')"><i class="fas fa-times"></i></button>
<!--<button type="button" id="{{$r['ckey']}}-slash" class="btn btn-just-icon @if($rank->p($r['ckey']) == 0) btn-warning @else btn-outline-warning @endif" onclick="switchPermissionSwitch('{{$r['ckey']}}','slash')"><i class="fa fa-slash"></i></button>-->
<button type="button" id="{{$r['ckey']}}-plus" class="btn btn-just-icon @if($rank->p($r['ckey']) != 1) btn-outline-success @else btn-success @endif" onclick="switchPermissionSwitch('{{$r['ckey']}}','plus')"><i class="fa fa-plus"></i></button>
</div>
<p>
<small>{{$r['desc']}}</small>
</p>
</div>
@endforeach
<div class="mb-4">
<h3 class="text-capitalize">{{$key}}</h3>
<div class="row">
@foreach($cat as $r)
<div class="col-10">
<input class="d-none" type="text" id="{{$r['ckey']}}"
name="{{$r['ckey']}}" value="{{$rank->p($r['ckey'])}}">
<p>{{$r['communName']}}<br>
<small>{{$r['desc']}}</small>
</p>
</div>
</div>
<div class="col-2">
<div class="btn-group">
<button type="button" id="{{$r['ckey']}}-close"
class="btn btn-just-icon @if($rank->p($r['ckey']) != -1) btn-outline-danger @else btn-danger @endif"
onclick="switchPermissionSwitch('{{$r['ckey']}}','close')">
<i class="fas fa-times"></i></button>
<button type="button" id="{{$r['ckey']}}-plus"
class="btn btn-just-icon @if($rank->p($r['ckey']) != 1) btn-outline-success @else btn-success @endif"
onclick="switchPermissionSwitch('{{$r['ckey']}}','plus')">
<i class="fa fa-plus"></i></button>
</div>
</div>
<hr>
@endforeach
</div>
</div>
@endforeach

View File

@@ -1,100 +1,150 @@
@extends('layouts.admin.main')
@section('content')
<div class="col-md-12">
<div class="card">
<div class="card-header">
Configuration Horaire d'instruction
</div>
<div class="card-body">
<form method="POST" action="/admin/config/schedule/edit">
@csrf
<h5 class="mb-4">Configuration des périodes</h5>
<div class="row form-group">
<div class="col-md-6">
<label for="">Nombre de période</label>
<input type="number"
class="form-control" name="admin_periode_nb" id="admin_periode_nb" aria-describedby="helpId" placeholder="" value="{{\App\Config::getData('admin_periode_nb')}}">
<small id="helpId" class="form-text text-muted">Nombre de période dans une soirée d'instruction régulière</small>
</div>
</div>
<div class="accordion" id="config-periode">
@for ($i = 1; $i <= \App\Config::getData('admin_periode_nb'); $i++)
<div class="card">
<div class="card-header" id="config-periode">
<h2 class="mb-0">
<button class="btn btn-link" type="button" data-toggle="collapse" data-target="#p{{$i}}" aria-controls="collapseOne">
Configuration période {{$i}}
</button>
</h2>
<div class="col-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Configuration de l'année d'instruction</h4>
</div>
<div class="card-body">
<div class="content">
<form method="post">
@method('PATCH')
@csrf
<div class="row">
<div class="col-12">
<h5>Configuration de l'année d'instruction</h5>
</div>
<div id="p{{$i}}" class="collapse" aria-labelledby="config-periode" data-parent="#config-periode">
<div class="card-body">
<div class="row form-group">
<div class="col-md-3">
<label for="">Heure de début</label>
<input type="time" class="form-control" name="admin_periode_begin_{{$i}}" id="admin_periode_begin_{{$i}}" value="{{\App\Config::all()->where('name','admin_periode_begin')->first()->data[$i]}}">
<small id="helpId" class="form-text text-muted">Heure de début de la période dans une soirée d'instruction régulière</small>
<div class="col-md-6">
<div class="form-group">
<label class="label-control">Date de début de l'année d'instruction</label>
<input name="instruction_year_begin" type="text" class="form-control datetimepicker"/>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label class="label-control">Date de fin de l'année d'instruction</label>
<input name="instruction_year_end" type="text" class="form-control datetimepicker" />
</div>
</div>
<div class="col-12">
</div>
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Type d'évènement</h4>
</div>
<div class="card-body">
<div class="content">
<div class="row">
@foreach($events_type as $event_type)
<div class="col-md-6 col-lg-4">
<div class="card">
<div class="card-header">
<h4 class="card-title">{{$event_type->name}} <span class="float-right"><i class="{{$event_type->calendar_icon}} fa-2x" style="color: {{$event_type->calendar_color}}"></i></span> </h4>
</div>
<div class="card-body">
<p>De <b>{{$event_type->begin_time}}</b> à <b>{{$event_type->end_time}}</b> - <b>{{$event_type->location}}</b></p>
<div class="d-flex m-2">
@if($event_type->is_mandatory)
<i class="fas fa-check-circle fa-2x text-success"></i>
<p class="my-auto ml-3">Obligatoire</p>
@else
<i class="fas fa-times-circle fa-2x text-danger"></i>
<p class="my-auto ml-3">N'est pas obligatoire</p>
@endif
</div>
<div class="col-md-3">
<label for="">Heure de fin</label>
<input type="time" class="form-control" name="admin_periode_end_{{$i}}" id="admin_periode_end_{{$i}}" value="{{\App\Config::all()->where('name','admin_periode_end')->first()->data[$i]}}">
<small id="helpId" class="form-text text-muted">Heure de fin de la période dans une soirée d'instruction régulière</small>
<div class="d-flex m-2">
@if($event_type->use_weekly_msg)
<i class="fas fa-check-circle fa-2x text-success"></i>
<p class="my-auto ml-3">Utilise les messages de la semaine</p>
@else
<i class="fas fa-times-circle fa-2x text-danger"></i>
<p class="my-auto ml-3">N'utilise pas les messages de la semaine</p>
@endif
</div>
<div class="d-flex m-2">
@if($event_type->use_schedule)
<i class="fas fa-check-circle fa-2x text-success"></i>
<p class="my-auto ml-3">Utilise un horaire</p>
@else
<i class="fas fa-times-circle fa-2x text-danger"></i>
<p class="my-auto ml-3">N'utilise pas un horaire</p>
@endif
</div>
<div>
{!! $event_type->admin_desc !!}
</div>
<div class="row">
<div class="col-md-8">
<a href="/admin/config/instruction/event_type/{{$event_type->id}}" class="btn btn-primary">
Modifier
</a>
</div>
<div class="col-md-4 text-right">
@if($event_type->id != 1)
<button class="btn btn-danger btn-just-icon">
<i class="fas fa-trash-alt"></i>
</button>
@else
<button class="btn btn-danger btn-just-icon" disabled>
<i class="fas fa-trash-alt"></i>
</button>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
@endfor
<div class="row">
<div class="col-md-12 p-2">
<button type="submit" class="btn btn-primary">Sauvegarder</button>
@endforeach
</div>
</div>
</form>
</div>
</div>
</div>
@endsection
@section('breadcrumb')
<div class="breadcrumbs">
<div class="col-sm-4">
<div class="page-header float-left">
<div class="page-title">
<h1>Configuration Horaire d'instruction</h1>
</div>
</div>
</div>
<div class="col-sm-8">
<div class="page-header float-right">
<div class="page-title">
<ol class="breadcrumb text-right">
<li class="active">Configuration/Horaire d'instruction</li>
</ol>
</div>
</div>
</div>
</div>
@endsection
@section('custom_scripts')
<script>
function saveChange(pPerm) {
(function($) {
var myswitch = document.getElementById(pPerm);
$.post('/api/config/general/save?api_token='+api_token, { value: myswitch.checked,perm: pPerm } , function(data) {
swal({
title: 'Modification enregistré !',
type: 'success',
}).then((result) => {
if (result.value) {
location.reload();
}
})
});
})(jQuery);
}
</script>
@endsection
<script>
let begin = moment('{{\App\Config::getData('instruction_year_begin')}}');
let end = moment('{{\App\Config::getData('instruction_year_end')}}');
$('input[name="instruction_year_begin"]').datetimepicker({
icons: {
time: "fa fa-clock-o",
date: "fa fa-calendar",
up: "fa fa-chevron-up",
down: "fa fa-chevron-down",
previous: 'fa fa-chevron-left',
next: 'fa fa-chevron-right',
today: 'fa fa-screenshot',
clear: 'fa fa-trash',
close: 'fa fa-remove'
},
date: new Date(begin)
});
$('input[name="instruction_year_end"]').datetimepicker({
icons: {
time: "fa fa-clock-o",
date: "fa fa-calendar",
up: "fa fa-chevron-up",
down: "fa fa-chevron-down",
previous: 'fa fa-chevron-left',
next: 'fa fa-chevron-right',
today: 'fa fa-screenshot',
clear: 'fa fa-trash',
close: 'fa fa-remove'
},
date: new Date(end)
});
</script>
@endsection

View File

@@ -0,0 +1,135 @@
@extends('layouts.admin.main')
@section('content')
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Liste des cours</h4>
</div>
<div class="card-body">
<div class="content">
<div class="row">
<div class="col-12 mb-4">
<p>Liste des cours dans l'horaire</p>
<div class="row">
<div class="col-sm-6">
<a href="/admin/course"
class="btn btn-block @if($mode == 'future')btn-primary active @else btn-outline-primary @endif">Cours
future</a>
</div>
<div class="col-sm-6">
<a href="/admin/course?all=true"
class="btn btn-block @if($mode == 'all')btn-primary active @else btn-outline-primary @endif">Tous
les cours</a>
</div>
</div>
</div>
<div class="col-sm-6">
<label class="mb-0">Filtrer les niveaux</label>
<select id="slevel" class="form-control mt-0">
<option value="" selected>Ne pas filtrer</option>
</select>
</div>
<div class="col-sm-6">
<label class="mb-0">Filtrer les périodes</label>
<select id="speriode" class="form-control">
<option value="" selected>Ne pas filtrer</option>
</select>
</div>
</div>
<table class="table table-striped table-no-bordered table-hover dataTable dtr-inline" id="table"
style="width:100%">
<thead>
<tr>
<th>OCOM</th>
<th>Nom</th>
<th>Instructeur</th>
<th>Date</th>
<th class="text-center">Niveau</th>
<th class="text-center">Période</th>
<th style="width: 8rem">Plan de cours</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach($courses as $course)
<tr class="cursor">
<td>{{$course->ocom}}</td>
<td>{{$course->name}}</td>
<td>{{$course->instructor()}}</td>
<td>{{$course->event->date_begin}}</td>
<td class="text-center">{{$course->level}}</td>
<td class="text-center">{{$course->periode}}</td>
<th class="text-center">
@if($course->lessonPlan)
@if($course->lessonPlan->approved == 1)
<i class="fas fa-check-circle text-success fa-2x" data-toggle="tooltip"
data-placement="top" title="Plan de cours remis et vérifié"></i>
@else
<i class="fas fa-exclamation-circle text-warning fa-2x"
data-toggle="tooltip" data-placement="top"
title="Plan de cours remis mais non vérifié"></i>
@endif
@else
<i class="fas fa-times-circle text-danger fa-2x" data-toggle="tooltip"
data-placement="top" title="Plan de cours non remis"></i>
@endif
</th>
<td>
<a href="/admin/course/{{$course->id}}"
class="btn btn-primary btn-fab btn-fab-mini btn-round">
<i class="material-icons">add</i>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection
@section('breadcrumb')
<a class="navbar-brand">Base de données des cours</a>
@endsection
@section('custom_scripts')
<script>
$('.tooltip').tooltip('enable')
$(document).ready(function () {
$('#table').DataTable({
"lengthMenu": [[25, 50, -1], [25, 50, "All"]],
"ordering" : true,
"order": [[3, "asc"]],
initComplete: function () {
this.api().columns().every(function () {
if (this[0] == 4 || this[0] == 5) {
var select = '';
if (this[0] == 4) {
select = $('#slevel');
} else if(this[0] == 5) {
select = $('#speriode');
}
var column = this;
select.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
column
.search(val ? '^' + val + '$' : '', true, false)
.draw();
});
column.data().unique().sort().each(function (d, j) {
select.append('<option value="' + d + '">' + d + '</option>')
});
}
});
}
});
});
</script>
@endsection

View File

@@ -0,0 +1,315 @@
@extends('layouts.admin.main')
@section('content')
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">{{$course->name}} ({{$course->event->date_begin}})</h4>
</div>
<div class="card-body">
<div class="content">
<div class="row">
<div class="col-md-4">
<label>Nom</label>
<p>{{$course->name}}</p>
</div>
<div class="col-md-3">
<label>Instructeur</label>
<p>{{$username}}</p>
</div>
<div class="col-md-1">
<label>OCOM</label>
<p>{{$course->ocom}}</p>
</div>
<div class="col-md-2">
<label>Date</label>
<p>{{$course->event->date_begin}}</p>
</div>
<div class="col-md-1 col-sm-6 text-center">
<label>Période</label>
<p>{{$course->periode}}</p>
</div>
<div class="col-sm-1 col-xs-6 text-center">
<label>Niveau</label>
<p>{{$course->level}}</p>
</div>
</div>
<div class="row">
<div class="col-md-6">
<label>Commentaire de l'instructeur</label>
<hr class="m-0">
@if($course->comment == null)
<p class="text-center">Aucun commentaire</p>
@else
<div>{!! $course->comment !!}</div>
@endif
</div>
<div class="col-md-6">
<label>Commentaire de l'officier</label>
<hr class="m-0">
@if($course->comment_officer == null)
<p class="text-center">Aucun commentaire</p>
@else
<div>{!! $course->comment_officer !!}</div>
@endif
</div>
<div class="col-6">
<button class="btn btn-outline-primary btn-block mt-4 @if(\Auth::user()->id != $course->user_id) d-none @endif" data-toggle="modal" data-target="#editComment" @if(\Auth::user()->id != $course->user_id) disabled @endif>Modifier le commentaire</button>
</div>
<div class="col-6">
@if(\Auth::user()->p('course_comment_officer') == 1)
<button class="btn btn-outline-primary btn-block mt-4" data-toggle="modal" data-target="#editCommentOfficer">Modifier le commentaire</button>
@endif
</div>
</div>
<div class="row">
<div class="col-12 mt-5">
<label>Plan de cours</label>
@if($course->lessonPlan == null)
<div class="alert alert-warning" role="alert">
Aucun plan de cours remis
</div>
@else
<div class="row">
<div class="col-md-6">
<label>Fichier</label>
<p>{{$course->lessonPlan->file}}</p>
</div>
<div class="col-md-2">
<label>Remise original</label>
<p>{{$course->lessonPlan->created_at}}</p>
</div>
<div class="col-md-2">
<label>Dernière modification</label>
<p>{{$course->lessonPlan->updated_at}}</p>
</div>
<div class="col-md-1 text-center">
<label>Vérifié</label>
@if(\Auth::user()->p('course_validate_plan') == 1)
<div class="togglebutton">
<label>
<input type="checkbox" name="isPlanCheck" onchange="switchPlanStatus({{$course->id}})" @if($course->lessonPlan->approved == 1) checked @endif >
<span class="toggle"></span>
</label>
</div>
@else
@if($course->lessonPlan->approved == 1)
<p><i class="fas fa-check-circle fa-2x text-success"></i></p>
@else
<p><i class="fas fa-times-circle fa-2x text-danger"></i></p>
@endif
@endif
</div>
<div class="col-md-1 text-center">
<label>Télécharger</label>
<p>
<a target="_blank" href="/file/get?d={{urlencode($lessonPlanDir)}}&f={{urlencode($course->lessonPlan->file)}}" class="btn btn-primary btn-fab btn-fab-mini btn-round m-0">
<i class="material-icons">cloud_download</i>
</a>
</p>
</div>
<div class="col-12">
<div id="accordion1" role="tablist">
<div class="card card-collapse">
<div class="card-header pt-0" role="tab" id="headingOne">
<h5 class="mb-0">
<a data-toggle="collapse" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
Commentaire
<i class="material-icons">keyboard_arrow_down</i>
</a>
</h5>
</div>
<div id="collapseTwo" class="collapse" role="tabpanel" aria-labelledby="headingOne" data-parent="#accordion1">
<div class="card-body px-2">
<div class="row">
<div class="col-md-6">
<label>Commentaire de l'instructeur</label>
@if($course->lessonPlan->desc == null)
<p class="text-center">Aucun commentaire</p>
@else
<div>{!! $course->lessonPlan->desc !!}</div>
@endif
</div>
<div class="col-md-6">
<label>Commentaire de l'officier</label>
@if($course->lessonPlan->comment == null)
<p class="text-center">Aucun commentaire</p>
@else
<div>{!! $course->lessonPlan->comment !!}</div>
@endif
</div>
<div class="col-6">
<button class="btn btn-outline-primary btn-block mt-4 @if(\Auth::user()->id != $course->user_id) d-none @endif" data-toggle="modal" data-target="#editCommentPlan">Modifier le commentaire</button>
</div>
<div class="col-6">
@if(\Auth::user()->p('course_comment_plan_officer') == 1)
<button class="btn btn-outline-primary btn-block mt-4" data-toggle="modal" data-target="#editCommentOfficerPlan">Modifier le commentaire</button>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endif
<button class="btn btn-outline-primary btn-block mt-4 @if(\Auth::user()->id != $course->user_id) d-none @endif" data-toggle="modal" data-target="#editLessonPlan">Remettre un plan de cours</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal fade" id="editComment" tabindex="-1" role="dialog" aria-labelledby="editCommentLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<form action="/admin/course/{{$course->id}}/comment" method="post">
@csrf
@method('patch')
<div class="modal-header">
<h5 class="modal-title" id="editCommentLabel">Modifier les commentaires de l'instructeur</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<textarea name="comment" class="form-control richeditor" name="admin_desc" id="admin_desc" rows="6" required>
{!! $course->comment !!}
</textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="editCommentOfficer" tabindex="-1" role="dialog" aria-labelledby="editCommentOfficerLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<form action="/admin/course/{{$course->id}}/commentOfficer" method="post">
@csrf
@method('patch')
<div class="modal-header">
<h5 class="modal-title" id="editCommentOfficerLabel">Modifier les commentaires de l'officier</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<textarea name="comment_officer" class="form-control richeditor" name="admin_desc" id="admin_desc" rows="6" required>
{!! $course->comment_officer !!}
</textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="editCommentPlan" tabindex="-1" role="dialog" aria-labelledby="editCommentLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<form action="/admin/course/{{$course->id}}/plan/comment" method="post">
@csrf
@method('patch')
<div class="modal-header">
<h5 class="modal-title" id="editCommentLabel">Modifier les commentaires de l'instructeur pour le plan de cours</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<textarea name="comment" class="form-control richeditor" name="admin_desc" id="admin_desc" rows="6" required>
@if($course->lessonPlan)
{!! $course->lessonPlan->desc !!}
@endif
</textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="editCommentOfficerPlan" tabindex="-1" role="dialog" aria-labelledby="editCommentOfficerLabel" aria-hidden="true">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<form action="/admin/course/{{$course->id}}/plan/commentOfficer" method="post">
@csrf
@method('patch')
<div class="modal-header">
<h5 class="modal-title" id="editCommentOfficerLabel">Modifier les commentaires de l'officier pour le plan de cours</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="form-group">
<textarea name="comment_officer" class="form-control richeditor" name="admin_desc" id="admin_desc" rows="6" required>
@if($course->lessonPlan)
{!! $course->lessonPlan->comment !!}
@endif
</textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="editLessonPlan" tabindex="-1" role="dialog" aria-labelledby="editLessonPlanLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form action="/admin/course/{{$course->id}}/lessonPlan" method="post" enctype="multipart/form-data">
@csrf
<div class="modal-header">
<h5 class="modal-title" id="editLessonPlanLabel">Remettre un plan de cours</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="form-group bmd-form-group is-filled">
<label class="label-control bmd-label-static">Choisir le plan de cours</label>
<div class="fileinput fileinput-new input-group" data-provides="fileinput" style="display: flex !important;">
<div class="form-control" data-trigger="fileinput">
<span class="fileinput-filename"></span>
</div>
<span class="input-group-append"><span class="input-group-text fileinput-exists cursor" data-dismiss="fileinput">Remove</span><span class="input-group-text btn-file"><span class="fileinput-new cursor">Select file</span><span class="fileinput-exists cursor">Change</span><input type="file" name="file" required></span></span>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Remettre</button>
</div>
</form>
</div>
</div>
</div>
@endsection
@section('custom_scripts')
<script src="/js/plugins/course.js"></script>
@endsection

View File

@@ -6,7 +6,7 @@
<div class="col-md-12 p-0">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title"> Cours à venir</h4>
<h4 class="card-title"> Mes cours à venir</h4>
</div>
<div class="card-body">
<div class="row">
@@ -15,14 +15,31 @@
<h4 class="m-4">Aucun cours à venir</h4>
</div>
@else
@foreach (\Auth::user()->futureCourses() as $course)
@foreach ($userClasse as $course)
@if($course->event != null)
<div class="col-sm-6">
<div class="card">
<div class="card my-3">
<div class="card-body">
<h4><strong>{{$course->ocom}} - {{$course->name}}</strong></h4>
<p class="float-left">{{date('Y-m-d',strtotime($course->event->date_begin))}}</p>
<p class="float-right">Période {{$course->periode}}, Niveau {{$course->level}}</p>
<h4>
<strong>{{$course->ocom}} - {{$course->name}}</strong>
@if($course->lessonPlan)
@if($course->lessonPlan->approved == 1)
<span class="float-right"><i class="fas fa-check-circle text-success" data-toggle="tooltip" data-placement="top" title="Plan de cours remis et vérifié"></i></span>
@else
<span class="float-right"><i class="fas fa-exclamation-circle text-warning" data-toggle="tooltip" data-placement="top" title="Plan de cours remis mais non vérifié"></i></span>
@endif
@else
<span class="float-right"><i class="fas fa-times-circle text-danger" data-toggle="tooltip" data-placement="top" title="Plan de cours non remis"></i></span>
@endif
</h4>
<div class="row">
<p class="col-6 text-left mb-1">{{date('Y-m-d',strtotime($course->event->date_begin))}}</p>
<p class="col-6 text-right mb-1">Période {{$course->periode}}, Niveau {{$course->level}}</p>
<div class="col-12 text-right">
<hr class="my-1">
<a href="/admin/course/{{$course->id}}" class="my-1">Détail</a>
</div>
</div>
</div>
</div>
</div>
@@ -30,6 +47,7 @@
@endforeach
@endif
</div>
<a href="/admin/profil/courses" type="button" class="btn btn-primary btn-lg btn-block">Afficher tous mes cours</a>
</div>
</div>
</div>
@@ -85,6 +103,7 @@
</div>
<hr>
<div class="card-text text-sm-center">
<a class="btn btn-block btn-secondary" href="/admin/profil/courses">Mes cours</a>
<a class="btn btn-block btn-secondary" href="/admin/profil">Profil</a>
</div>
</div>

View File

@@ -0,0 +1,55 @@
@extends('layouts.admin.main')
@section('content')
<div class="col-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">{{$event_type->name}}</h4>
</div>
<div class="card-body">
<div class="content">
<form method="post">
@method('PATCH')
@csrf
<div class="row">
<div class="col-md-3">
<div class="form-group">
<label class="label-control">Nom</label>
<input type="text" class="form-control" value="{{$event_type->name}}"/>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label class="label-control">Emplacement</label>
<input type="text" class="form-control" value="{{$event_type->name}}"/>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label class="label-control">Date de début de l'année d'instruction</label>
<input name="begin_time" type="time" class="form-control" value="{{$event_type->begin_time}}"/>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label class="label-control">Date de fin de l'année d'instruction</label>
<input name="end_time" type="time" class="form-control" value="{{$event_type->end_time}}"/>
</div>
</div>
<div class="col-md-12 text-right">
<button type="submit" class="btn btn-primary">Sauvegarder</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
@section('custom_scripts')
<script>
let begin = moment('{{$event_type->begin_time}}');
let end = moment('{{$event_type->end_time}}');
</script>
@endsection

View File

@@ -108,4 +108,7 @@
@endif
</tbody>
</table>
<small class="float-right mr-4">Dernière mise à jour {{date('r')}}</small>
<small class="float-right mr-4">Dernière mise à jour {{date('r')}}</small>
<script>
updateHeader('{{$permission['p']}}');
</script>

View File

@@ -11,7 +11,7 @@
<button id="refreshbtn" type="button" onclick="refreshFolder()" class="border-0 bg-transparent ml-3 hover-spin cursor active-spin no-outline" style="margin-bottom: -10px;margin-top: -2px;font-size: 1.1rem"><i class="fas fa-sync-alt"></i></button>
</div>
<div class="col-md-4 col-sm d-flex justify-content-end offset-md-7 mt-2 mt-sm-0">
<div class="dropdown mr-md-2">
<div class="dropdown mr-md-2 d-none" id="createDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-plus"></i> Nouveau
</button>
@@ -19,13 +19,12 @@
<a class="dropdown-item" data-toggle="modal" data-target="#createFolderModal"><i class="fas fa-folder mr-3"></i> Dossier</a>
</div>
</div>
<div class="dropdown">
<div class="dropdown d-none" id="uploadDropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="fas fa-upload"></i> Téléverser
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" data-toggle="modal" data-target="#uploadFileModal"><i class="fas fa-file mr-3"></i> Fichier</a>
<a class="dropdown-item" href="#"><i class="fas fa-folder mr-3"></i> Dossier</a>
</div>
</div>
</div>
@@ -141,6 +140,10 @@
<script src="/js/plugins/jquery.contextMenu.min.js"></script>
<script src="/js/plugins/drive-explorer.js"></script>
<script>
@if(isset($mode))
init("{{$folder}}","{{$mode}}");
@else
init("{{$folder}}");
@endif
</script>
@endsection

View File

@@ -9,7 +9,7 @@
</div>
<div class="card-body">
<h5>Permission des grades</h5>
<table class="table table-striped w-100">
<table class="table table-striped table-responsive w-100">
<thead class="table-dark">
<tr class="text-center">
<td class="text-left" style="width: 25%">Grade</td>
@@ -17,9 +17,9 @@
<td>Écriture</td>
<td>Gestion</td>
<td style="width: 6rem;">
<a href="/admin/ocom/edit" class="btn btn-primary btn-fab btn-fab-mini btn-round m-0">
<button class="btn btn-primary btn-fab btn-fab-mini btn-round m-0" onclick="addPermission('{{$dir->id}}','rank')">
<i class="material-icons">add</i>
</a>
</button>
</td>
</tr>
</thead>
@@ -101,7 +101,7 @@
<button class="btn btn-primary btn-fab btn-fab-mini btn-round" onclick="editPermission('{{$dir->id}}','rank','{{$key}}')">
<i class="material-icons">edit</i>
</button>
<button class="btn btn-danger btn-fab btn-fab-mini btn-round">
<button class="btn btn-danger btn-fab btn-fab-mini btn-round" onclick="deletePermission('{{$dir->id}}','rank','{{$key}}')">
<i class="material-icons">delete</i>
</button>
</td>
@@ -111,7 +111,7 @@
</tbody>
</table>
<h5 class="mt-5">Permission des postes</h5>
<table class="table table-striped w-100">
<table class="table table-striped table-responsive w-100">
<thead class="table-dark">
<tr class="text-center">
<td class="text-left" style="width: 25%">Poste</td>
@@ -119,9 +119,9 @@
<td>Écriture</td>
<td>Gestion</td>
<td style="width: 6rem;">
<a href="/admin/ocom/edit" class="btn btn-primary btn-fab btn-fab-mini btn-round m-0">
<button class="btn btn-primary btn-fab btn-fab-mini btn-round m-0" onclick="addPermission('{{$dir->id}}','job')">
<i class="material-icons">add</i>
</a>
</button>
</td>
</tr>
</thead>
@@ -163,7 +163,7 @@
<button class="btn btn-primary btn-fab btn-fab-mini btn-round" onclick="editPermission('{{$dir->id}}','job','{{$key}}')">
<i class="material-icons">edit</i>
</button>
<button class="btn btn-danger btn-fab btn-fab-mini btn-round">
<button class="btn btn-danger btn-fab btn-fab-mini btn-round" onclick="deletePermission('{{$dir->id}}','job','{{$key}}')">
<i class="material-icons">delete</i>
</button>
</td>
@@ -172,7 +172,7 @@
</tbody>
</table>
<h5 class="mt-5">Permission des utilisateurs</h5>
<table class="table table-striped w-100">
<table class="table table-striped table-responsive w-100">
<thead class="table-dark">
<tr class="text-center">
<td class="text-left" style="width: 25%">Utilisateurs</td>
@@ -180,9 +180,9 @@
<td>Écriture</td>
<td>Gestion</td>
<td style="width: 6rem;">
<a href="/admin/ocom/edit" class="btn btn-primary btn-fab btn-fab-mini btn-round m-0">
<button class="btn btn-primary btn-fab btn-fab-mini btn-round m-0" onclick="addPermission('{{$dir->id}}','user')">
<i class="material-icons">add</i>
</a>
</button>
</td>
</tr>
</thead>
@@ -224,7 +224,7 @@
<button class="btn btn-primary btn-fab btn-fab-mini btn-round" onclick="editPermission('{{$dir->id}}','user','{{$key}}')">
<i class="material-icons">edit</i>
</button>
<button class="btn btn-danger btn-fab btn-fab-mini btn-round">
<button class="btn btn-danger btn-fab btn-fab-mini btn-round" onclick="deletePermission('{{$dir->id}}','user','{{$key}}')">
<i class="material-icons">delete</i>
</button>
</td>
@@ -235,6 +235,7 @@
</div>
</div>
</div>
@csrf
<button type="button" class="btn btn-primary" data-toggle="modal" data-target=".bd-example-modal-lg">Large modal</button>
<div id="permissionModal" class="modal fade bd-example-modal-lg" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
@@ -258,10 +259,6 @@
</div>
@endsection
@section('breadcrumb')
Fichier / Google Drive
@endsection
@section('custom_scripts')
<script src="/js/plugins/jquery.ui.position.min.js"></script>
<script src="/js/plugins/jquery.contextMenu.min.js"></script>

View File

@@ -0,0 +1,81 @@
<div class="modal-header">
<h5 class="modal-title">Modification des permissions</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<form action="/admin/drive/{{$folder->id}}/addpermission/{{$s}}" method="post">
<input id="csrf" type="hidden" name="_token" value="">
@method('patch')
<div class="modal-body">
<div class="row">
<div class="col-md-3">
@if($s == 'rank')
<select class="selectpicker" name="id" data-style="btn btn-primary btn-round" title="Grade" required>
@foreach($list as $l)
<option value="{{$l->id}}">{{$l->name}}</option>
@endforeach
</select>
@elseif($s == 'job')
<select class="selectpicker" name="id" data-style="btn btn-primary btn-round" title="Poste" required>
@foreach($list as $l)
<option value="{{$l->id}}">{{$l->name}}</option>
@endforeach
</select>
@else
<select class="selectpicker" name="id" data-style="btn btn-primary btn-round" title="Utilisateur" required>
@foreach($list as $l)
<option value="{{$l->id}}">{{$l->fullname()}}</option>
@endforeach
</select>
@endif
</div>
<div class="col-md-3">
<div class="togglebutton row">
<div class="col-3">
<label>
<input name="read" type="checkbox">
<span class="toggle"></span>
</label>
</div>
<div class="col">
<label>Peux consulter les fichiers a l'intérieur du dossier</label>
</div>
</div>
</div>
<div class="col-md-3">
<div class="togglebutton row">
<div class="col-3">
<label>
<input name="write" type="checkbox">
<span class="toggle"></span>
</label>
</div>
<div class="col">
<label>Peux modifier les fichiers a l'intérieur du dossier</label>
</div>
</div>
</div>
<div class="col-md-3">
<div class="togglebutton row">
<div class="col-3">
<label>
<input name="perm" type="checkbox">
<span class="toggle"></span>
</label>
</div>
<div class="col">
<label>Peux gérer le dossier</label>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary">Sauvegarder</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
</div>
<script>
$('select').selectpicker();
</script>
</form>

View File

@@ -5,7 +5,7 @@
</button>
</div>
<form action="/admin/drive/{{$folder->id}}/permission/{{$s}}/{{$subject->id}}" method="post">
@csrf
<input id="csrf" type="hidden" name="_token" value="">
@method('patch')
<div class="modal-body">
<div class="row">
@@ -26,7 +26,7 @@
<div class="togglebutton row">
<div class="col-3">
<label>
<input type="checkbox" @if(strpos($perm,'r') !== false) checked @endif>
<input name="read" type="checkbox" @if(strpos($perm,'r') !== false) checked @endif>
<span class="toggle"></span>
</label>
</div>
@@ -39,7 +39,7 @@
<div class="togglebutton row">
<div class="col-3">
<label>
<input type="checkbox" @if(strpos($perm,'w') !== false) checked @endif>
<input name="write" type="checkbox" @if(strpos($perm,'w') !== false) checked @endif>
<span class="toggle"></span>
</label>
</div>
@@ -52,7 +52,7 @@
<div class="togglebutton row">
<div class="col-3">
<label>
<input type="checkbox" @if(strpos($perm,'p') !== false) checked @endif>
<input name="perm" type="checkbox" @if(strpos($perm,'p') !== false) checked @endif>
<span class="toggle"></span>
</label>
</div>

View File

@@ -0,0 +1,53 @@
@extends('layouts.admin.main')
@section('content')
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Plan de cours vierge et documentation <a href="#"><i class="fa fa-question-circle" aria-hidden="true"></i></a></h4>
</div>
<div class="card-body">
<div class="content table-responsive table-full-width">
<table class="table">
<thead>
<tr>
<th style="width:50%;">
Nom
</th>
<th class="text-center">
Dernière modification
</th>
<th class="text-right"></th>
</tr>
</thead>
<tbody>
@foreach($dir as $d)
<tr>
<td>
{{$d['name']}}
</td>
<td class="text-center">
{{strftime('%e %b %Y',$d['timestamp'])}}
</td>
<td class="text-right">
<a class="btn btn-primary btn-fab btn-fab-mini btn-round" target="_blank" href="/file/get?f={{urlencode($d['name'])}}&d={{$d['dirname']}}">
<i class="material-icons">cloud_download</i>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection
@section('custom_scripts')
<script>
$(document).ready(function() {
$('.table').DataTable();
} );
</script>
@endsection

View File

@@ -3,61 +3,39 @@
@section('content')
<div class="col-md-12">
<div class="card">
<div class="card-header">
<strong class="card-title">Fichiers <a href="#"><i class="fa fa-question-circle" aria-hidden="true"></i>
</a></strong>
<div class="card-header card-header-primary">
<h4 class="card-title">Guides pédagogiques et Norme de qualification <a href="#"><i class="fa fa-question-circle" aria-hidden="true"></i></a></h4>
</div>
<div class="card-body">
<div class="content table-responsive table-full-width">
<p>Les fichiers si dessous sont disponible autant dans l'espace administration que dans l'espace cadet cadre.
<table class="table">
<thead>
<tr><th style="width:85%;">Nom</th>
<th></th>
</tr></thead>
<tr>
<th style="width:50%;">
Nom
</th>
<th class="text-center">
Dernière modification
</th>
<th class="text-right"></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Niveau 1</strong><hr></td>
</tr>
<tr>
<td>Guide Pédagogique</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GP_Niv_1')}}">Télécharger</a></td>
</tr>
<tr>
<td>Guide de Qualification</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GQ_Niv_1')}}">Télécharger</a></td>
</tr>
<tr>
<td><strong>Niveau 2</strong><hr></td>
</tr>
<tr>
<td>Guide Pédagogique</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GP_Niv_2')}}">Télécharger</a></td>
</tr>
<tr>
<td>Guide de Qualification</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GQ_Niv_2')}}">Télécharger</a></td>
</tr>
<tr>
<td><strong>Niveau 3</strong><hr></td>
</tr>
<tr>
<td>Guide Pédagogique</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GP_Niv_3')}}">Télécharger</a></td> </tr>
<tr>
<td>Guide de Qualification</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GQ_Niv_3')}}">Télécharger</a></td>
</tr>
<tr>
<td><strong>Niveau 4</strong><hr></td>
</tr>
<tr>
<td>Guide Pédagogique</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GP_Niv_4')}}">Télécharger</a></td> </tr>
<tr>
<td>Guide de Qualification</td>
<td><a class="btn btn-primary" href="{{ \App\Config::getData('file_GQ_Niv_4')}}">Télécharger</a></td>
</tr>
@foreach($dir as $d)
<tr>
<td>
{{$d['name']}}
</td>
<td class="text-center">
{{strftime('%e %b %Y',$d['timestamp'])}}
</td>
<td class="text-right">
<a class="btn btn-primary btn-fab btn-fab-mini btn-round" target="_blank" href="/file/get?f={{urlencode($d['name'])}}&d={{$d['dirname']}}">
<i class="material-icons">cloud_download</i>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@@ -66,10 +44,10 @@
</div>
@endsection
@section('breadcrumb')
Fichier / Guide Pédagogique
@endsection
@section('custom_scripts')
<script>
$(document).ready(function() {
$('.table').DataTable();
} );
</script>
@endsection

View File

@@ -58,6 +58,7 @@
<th>Date</th>
<th>Instructeur</th>
<th>Niveau</th>
<th style="width: 8rem">Plan de cours</th>
</tr>
</thead>
<tbody>
@@ -67,6 +68,23 @@
<td>{{$course->event->date_begin}}</td>
<td>{{$course->instructor()}}</td>
<td>{{$course->level}}</td>
<td class="text-center">
@if($course->lessonPlan)
<a href="/file/get?d={{urlencode(\App\GoogleDriveFile::findByPath('.Systeme/.Fichier/.PlanDeCours')->id)}}&f={{urlencode($course->lessonPlan->file)}}">
@if($course->lessonPlan->approved == 1)
<i class="fas fa-check-circle text-success fa-2x" data-toggle="tooltip"
data-placement="top" title="Plan de cours remis et vérifié"></i>
@else
<i class="fas fa-exclamation-circle text-warning fa-2x"
data-toggle="tooltip" data-placement="top"
title="Plan de cours remis mais non vérifié"></i>
@endif
</a>
@else
<i class="fas fa-times-circle text-danger fa-2x" data-toggle="tooltip"
data-placement="top" title="Plan de cours non remis"></i>
@endif
</td>
</tr>
@endforeach
</tbody>
@@ -90,7 +108,6 @@
$('.tooltip').tooltip('enable')
$(document).ready(function() {
$('#table').DataTable({
"lengthMenu": [[25, 50, -1], [25, 50, "All"]],
"ordering" : true,
"order": [[1, "asc"]]
});

View File

@@ -0,0 +1,34 @@
<div class="col-md-6">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Plan de cours remis</h4>
<p class="category">Combiens de plan de cours on été remis au courant de cette année d'instruction</p>
</div>
<div class="card-body">
<div class="content">
<div class="row text-center">
<div class="chart-container" style="position: relative; width:100%">
<canvas id="chartLessonPlan"></canvas>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
var chartLessonPlan = $('#chartLessonPlan');
var pieChartLessonPlan = new Chart(chartLessonPlan, {
type: 'pie',
data: {
datasets: [{
data: [{{$nbCourseUpToThisDay - ($nbCoursePlanDoneUTDP+$nbCoursePlanDoneAndCheckUTDP)}}, {{$nbCoursePlanDoneUTDP}}, {{$nbCoursePlanDoneAndCheckUTDP}}],
backgroundColor: ['#f44336','#ff9800','#4caf50'],
hoverBackgroundColor: ['#f66055','#ffad33','#5fb962']
}],
// These labels appear in the legend and in the tooltips when hovering different arcs
labels: ['Non-Remis', 'Remis non validé','Remis et validé']
},
options: {}
});
</script>

View File

@@ -0,0 +1,127 @@
@extends('layouts.admin.main')
@section('content')
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Statistique de l'instruction</h4>
</div>
<div class="card-body">
<div class="content">
<div class="row">
<div class="col-12">
<p>
<b>{{$nbCourseUpToThisDay}}</b> cours on été donnée cette année d'instruction par <b>{{$nbInstructorUpToThisDay}}</b> instructeurs différent au cours de <b>{{$nbEventUpToThisDay}}</b> activitées
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Plan de cours remis</h4>
<p class="category">Combiens de plan de cours on été remis au courant de cette année d'instruction</p>
</div>
<div class="card-body">
<div class="content">
<div class="row text-center">
<div class="chart-container" style="position: relative; width:100%">
<canvas id="chart1"></canvas>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Cours de l'année d'instruction</h4>
<p class="category">Combiens de cours ont été donnée au courant de cette année d'instruction</p>
</div>
<div class="card-body">
<div class="content">
<div class="row text-center">
<div class="chart-container" style="position: relative; width:100%">
<canvas id="chart2"></canvas>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Cours total de la DB</h4>
<p class="category">Combiens de cours ont été donnée au courant de cette année d'instruction par rapport au total de la DB</p>
</div>
<div class="card-body">
<div class="content">
<div class="row text-center">
<div class="chart-container" style="position: relative; width:100%">
<canvas id="chart3"></canvas>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@section('custom_scripts')
<script>
var ctx1 = $('#chart1');
var pieChart1 = new Chart(ctx1, {
type: 'pie',
data: {
datasets: [{
data: [{{$nbCourseUpToThisDay - ($nbCoursePlanDoneUTDP+$nbCoursePlanDoneAndCheckUTDP)}}, {{$nbCoursePlanDoneUTDP}}, {{$nbCoursePlanDoneAndCheckUTDP}}],
backgroundColor: ['#f44336','#ff9800','#4caf50'],
hoverBackgroundColor: ['#f66055','#ffad33','#5fb962']
}],
// These labels appear in the legend and in the tooltips when hovering different arcs
labels: ['Non-Remis', 'Remis non validé','Remis et validé']
},
options: {}
});
var ctx2 = $('#chart2');
var pieChart2 = new Chart(ctx2, {
type: 'pie',
data: {
datasets: [{
data: [{{$nbCourseUpToThisDay}}, {{$nbCourseThisYear - $nbCourseUpToThisDay}}],
backgroundColor: ['#4caf50','#ff9800'],
hoverBackgroundColor: ['#5fb962','#ffad33']
}],
// These labels appear in the legend and in the tooltips when hovering different arcs
labels: ['Donnée', 'Pas encore donnée']
},
options: {}
});
var ctx3 = $('#chart3');
var pieChart3 = new Chart(ctx3, {
type: 'pie',
data: {
datasets: [{
data: [{{$nbCourseUpToThisDay}}, {{$nbCourseInDB}}],
backgroundColor: ['#4caf50','#ff9800'],
hoverBackgroundColor: ['#5fb962','#ffad33']
}],
// These labels appear in the legend and in the tooltips when hovering different arcs
labels: ['Donnée', 'Pas encore donnée']
},
options: {}
});
</script>
@endsection

View File

@@ -51,6 +51,46 @@
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-plus"></i>
</div>
<div class="col m-auto text-left">
Ajout d'une section "Mes cours"
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-plus"></i>
</div>
<div class="col m-auto text-left">
Ajout d'une section "Mes fichiers"
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-plus"></i>
</div>
<div class="col m-auto text-left">
Ajout d'une liste des cours pour l'instruction
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-plus"></i>
</div>
<div class="col m-auto text-left">
Ajout de statistique pour l'instruction
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
@@ -91,6 +131,26 @@
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-coffee"></i>
</div>
<div class="col m-auto text-left">
Mise à jour de la section "Guide pédagogique et Norme de qualification"
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
<i class="fas fa-coffee"></i>
</div>
<div class="col m-auto text-left">
Mise à jour de la section "Fichier" de l'instruction
</div>
</div>
</li>
<li class="list-group-item">
<div class="row">
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">

View File

@@ -0,0 +1,84 @@
@extends('layouts.admin.main')
@section('content')
<div class="col-md-12">
<div class="card">
<div class="card-header card-header-primary">
<h4 class="card-title">Mes cours</h4>
</div>
<div class="card-body">
<div class="content">
<div class="row">
<div class="col-12">
<p>Liste de mes cours dans l'horaire</p>
<div class="row">
<div class="col-sm-6">
<a href="/admin/profil/courses" class="btn btn-block @if($mode == 'future')btn-primary active @else btn-outline-primary @endif">Cours future</a>
</div>
<div class="col-sm-6">
<a href="/admin/profil/courses?all=true" class="btn btn-block @if($mode == 'all')btn-primary active @else btn-outline-primary @endif">Tous les cours</a>
</div>
</div>
</div>
</div>
<table class="table table-striped table-no-bordered table-hover dataTable dtr-inline" id="table" style="width:100%">
<thead>
<tr>
<th>OCOM</th>
<th>Nom</th>
<th>Instructeur</th>
<th>Date</th>
<th class="text-center">Niveau</th>
<th class="text-center">Période</th>
<th style="width: 8rem">Plan de cours</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach($courses as $course)
<tr class="cursor">
<td>{{$course->ocom}}</td>
<td>{{$course->name}}</td>
<td>{{$course->instructor()}}</td>
<td>{{$course->event->date_begin}}</td>
<td class="text-center">{{$course->level}}</td>
<td class="text-center">{{$course->periode}}</td>
<th class="text-center">
@if($course->lessonPlan)
@if($course->lessonPlan->approved == 1)
<i class="fas fa-check-circle text-success fa-2x" data-toggle="tooltip" data-placement="top" title="Plan de cours remis et vérifié"></i>
@else
<i class="fas fa-exclamation-circle text-warning fa-2x" data-toggle="tooltip" data-placement="top" title="Plan de cours remis mais non vérifié"></i>
@endif
@else
<i class="fas fa-times-circle text-danger fa-2x" data-toggle="tooltip" data-placement="top" title="Plan de cours non remis"></i>
@endif
</th>
<td>
<a href="/admin/course/{{$course->id}}" class="btn btn-primary btn-fab btn-fab-mini btn-round">
<i class="material-icons">add</i>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
@endsection
@section('custom_scripts')
<script src="/js/ocom.js"></script>
<script>
$('.tooltip').tooltip('enable')
$(document).ready(function() {
$('#table').DataTable({
"lengthMenu": [[25, 50, -1], [25, 50, "All"]],
"ordering" : true,
"order": [[3, "asc"]]
});
} );
</script>
@endsection

View File

@@ -29,6 +29,7 @@
<link rel="stylesheet" href="/js/plugins/trumbowyg/plugins/colors/ui/trumbowyg.colors.min.css">
<link rel="stylesheet" href="/js/plugins/trumbowyg/plugins/emoji/ui/trumbowyg.emoji.min.css">
<link rel="stylesheet" href="/css/contextLoader.min.css">
<link rel="stylesheet" href="/css/Chart.min.css">
<link rel="stylesheet" href="/js/plugins/fontawesome-icon-picker/fontawesome-iconpicker.css">
<link rel="stylesheet" href="/css/monolith.min.css"/>

View File

@@ -67,7 +67,8 @@ foreach (Auth::user()->unreadNotifications as $notification) {
</p>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownProfile">
<a class="dropdown-item" href="/admin/profil">Profil</a>
<a class="dropdown-item" href="/admin/profil">Mon Profil</a>
<a class="dropdown-item" href="/admin/profil/courses">Mes cours</a>
<a class="dropdown-item" href="/admin/profil/settings">Options</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="/logout">Déconnexion</a>

View File

@@ -6,7 +6,7 @@
<script src="/js/core/bootstrap-material-design.min.js"></script>
<script src="/js/material-dashboard.js"></script>
<script src="/js/app.js"></script>
<!-- Plugin for the momentJs -->
<script src="/js/plugins/moment.min.js"></script>
<!-- Plugin for Sweet Alert -->
@@ -23,8 +23,8 @@
<script src="/js/plugins/jasny-bootstrap.min.js"></script>
<!-- Include a polyfill for ES6 Promises (optional) for IE11, UC Browser and Android browser support SweetAlert -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/core-js/2.4.1/core.js"></script>
<!-- Chartist JS -->
<script src="/js/plugins/chartist.min.js"></script>
<!-- ChartJS -->
<script src="/js/plugins/Chart.min.js"></script>
<!-- Notifications Plugin -->
<script src="/js/plugins/bootstrap-notify.js"></script>
@@ -43,5 +43,3 @@
</script>
<script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=r82pabvd9arn3fjb1e2fsolf2xpixuv4hwfwart4cf1fb7mx"></script>
<script src="/js/app.js"></script>

View File

@@ -1,4 +1,149 @@
<div class="sidebar" data-background-color="black">
@php
$sidebar = [
'Nouvelle' => [
'route' => 'admin.news',
'icon' => 'new_releases',
'perm' => 'news_see',
'child' => null
],
'Horaire' => [
'route' => 'admin.schedule',
'icon' => 'calendar_today',
'perm' => 'schedule_see',
'child' => null
],
'Instruction' => [
'route' => null,
'icon' => 'menu_book',
'perm' => null,
'child' => [
'Guide et NQP' => [
'route' => 'admin.instruction.guide',
'icon' => 'fas fa-book',
'perm' => 'instruction_guide_see',
'child' => null
],
'BD des cours' => [
'route' => 'admin.ocom',
'icon' => 'fas fa-database',
'perm' => 'instruction_db_ocom_see',
'child' => null
],
'Liste des cours' => [
'route' => 'admin.course',
'icon' => 'fas fa-list',
'perm' => 'course_see_all',
'child' => null
],
'Fichier' => [
'route' => 'admin.instruction.files',
'icon' => 'fas fa-folder',
'perm' => null,
'child' => null
],
'Statistiques' => [
'route' => 'admin.stats.instruction',
'icon' => 'fas fa-chart-line',
'perm' => 'stats_instruction_see',
'child' => null
],
]
],
'Administration' => [
'route' => null,
'icon' => 'recent_actors',
'perm' => null,
'child' => [
'Articles' => [
'route' => 'admin.article',
'icon' => 'fas fa-newspaper',
'perm' => 'article_see',
'child' => null
],
'Images' => [
'route' => 'admin.picture',
'icon' => 'fas fa-images',
'perm' => 'picture_see',
'child' => null
],
'Utilisateurs' => [
'route' => 'admin.users',
'icon' => 'fas fa-users',
'perm' => 'user_see',
'child' => null
],
'Liste nominative' => [
'route' => 'admin.users',
'icon' => 'fas fa-address-book',
'perm' => 'stats_see',
'child' => null
],
'Logs' => [
'route' => 'admin.stats.log',
'icon' => 'fas fa-stream',
'perm' => 'stats_see',
'child' => null
],
]
],
'Fichiers' => [
'route' => null,
'icon' => 'folder',
'perm' => 'file_see',
'child' => \App\GoogleDriveFile::getSidebarFile(),
],
'Configuration' => [
'route' => null,
'icon' => 'menu_book',
'perm' => 'config_edit',
'child' => [
'Général' => [
'route' => 'admin.config.general',
'icon' => 'fas fa-cogs',
'perm' => 'config_edit',
'child' => null
],
'Instruction' => [
'route' => 'admin.config.schedule',
'icon' => 'fas fa-book-open',
'perm' => 'config_edit_instruction',
'child' => null
],
'Administration' => [
'route' => 'admin.config.complementary-activity',
'icon' => 'fas fa-file-alt',
'perm' => 'config_edit_administration',
'child' => null
],
'Grade' => [
'route' => 'admin.config.rank',
'icon' => 'fas fa-user-shield',
'perm' => 'config_edit_rank',
'child' => null
],
'Poste' => [
'route' => 'admin.config.jobs',
'icon' => 'fas fa-user-tag',
'perm' => 'config_edit_job',
'child' => null
],
'Fichier' => [
'route' => 'admin.config.files',
'icon' => 'fas fa-folder',
'perm' => 'config_edit_files',
'child' => null
],
'Apparence' => [
'route' => 'admin.config.customisation',
'icon' => 'fas fa-palette',
'perm' => 'config_edit_instruction',
'child' => null
]
]
],
]
@endphp
<div class="sidebar" data-color="white" data-background-color="black" data-image="/images/sidebar.png">
<div class="logo">
<a href="/" class="logo-mini">
<img class="img-fluid" src="/assets/admin/images/favicon.png" alt="Logo">
@@ -8,312 +153,90 @@
</a>
</div>
<div class="sidebar-wrapper">
<div class="user">
<div class="photo">
<img src="/assets/admin/images/avatar/user-{{\Auth::User()->avatar}}.jpg">
</div>
<div class="user-info">
<a data-toggle="collapse" href="#collapseExample" class="username collapsed" aria-expanded="false">
<span>
{{\Auth::user()->lastname}}
<b class="caret"></b>
</span>
</a>
<div class="collapse" id="collapseExample" style="">
<ul class="nav">
<li class="nav-item">
<a class="nav-link" href="/admin/profil">
<span class="sidebar-mini"> <i class="fas fa-user-circle"></i> </span>
<span class="sidebar-normal"> Mon profil </span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/admin/profil/courses">
<span class="sidebar-mini"> <i class="fas fa-chalkboard"></i> </span>
<span class="sidebar-normal"> Mes cours </span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/admin/profil/settings">
<span class="sidebar-mini"> <i class="fas fa-cog"></i> </span>
<span class="sidebar-normal"> Options </span>
</a>
</li>
<li class="nav-item mt-3">
<a class="nav-link" href="/logout">
<span class="sidebar-mini"> <i class="fas fa-sign-out-alt"></i> </span>
<span class="sidebar-normal"> Déconnexion </span>
</a>
</li>
</ul>
</div>
</div>
</div>
<ul class="nav">
<li class="nav-item">
<li class="nav-item @if(\Request::route()->getName() == 'admin.dashboard') active @endif">
<a class="nav-link" href="/admin">
<i class="material-icons">dashboard</i>
<p> Dashboard </p>
</a>
</li>
<hr>
@if(\Auth::user()->p('msg_see') == 12)
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#message">
<i class="material-icons">email</i>
<p> Message
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="message">
<ul class="nav">
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/message">
<span class="sidebar-mini"> <i class="fas fa-eye"></i> </span>
<span class="sidebar-normal"> Afficher les messages </span>
</a>
</li>
@if(\Auth::user()->p('msg_add') == 1)
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/message/add">
<span class="sidebar-mini"> <i class="fas fa-plus"></i> </span>
<span class="sidebar-normal"> Ajouter un message </span>
</a>
</li>
@endif
@if(\Auth::user()->p('msg_delete') == 1)
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/message">
<span class="sidebar-mini"> <i class="fas fa-times"></i> </span>
<span class="sidebar-normal"> Supprimer un message </span>
</a>
</li>
@endif
</ul>
</div>
</li>
@endif
@if(\Auth::user()->p('news_see') == 1)
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#news">
<i class="material-icons">new_releases</i>
<p> Nouvelles
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="news">
<ul class="nav">
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/news">
<span class="sidebar-mini"> <i class="fas fa-eye"></i> </span>
<span class="sidebar-normal"> Voir les nouvelles </span>
</a>
</li>
@if(\Auth::user()->p('news_add') == 1)
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/news/add">
<span class="sidebar-mini"> <i class="fas fa-plus"></i> </span>
<span class="sidebar-normal"> Ajouter une nouvelle </span>
</a>
</li>
@endif
<!--<li class="nav-item ">
<a class="nav-link" href="/admin/inventory/booking">
<span class="sidebar-mini"> <i class="fas fa-bookmark"></i> </span>
<span class="sidebar-normal"> Réservation</span>
</a>
</li>-->
</ul>
</div>
</li>
@endif
@if(\Auth::user()->p('schedule_see') == 1)
<li class="nav-item ">
<a class="nav-link" href="/admin/schedule">
<i class="material-icons">calendar_today</i>
<p> Horaire</p>
</a>
</li>
@endif
@if(\Auth::user()->p('schedule_see') == 1)
<li class="nav-item ">
<a class="nav-link" href="/admin/ocom">
<i class="material-icons">menu_book</i>
<p> BD des cours</p>
</a>
</li>
@endif
@if(\Auth::user()->p('article_see') == 1)
<li class="nav-item ">
<a class="nav-link" href="/admin/article">
<i class="material-icons">description</i>
<p> Articles</p>
</a>
</li>
@endif
@if(\Auth::user()->p('inventory_see') == 1)
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#inventory">
<i class="material-icons">shopping_basket</i>
<p> Inventaire
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="inventory">
<ul class="nav">
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/inventory">
<span class="sidebar-mini"> <i class="fas fa-box"></i> </span>
<span class="sidebar-normal"> Voir l'inventaire </span>
</a>
</li>
@if(\Auth::user()->p('inventory_edit') == 1)
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/inventory/management">
<span class="sidebar-mini"> <i class="fas fa-cogs"></i> </span>
<span class="sidebar-normal"> Gestion de l'inventaire </span>
</a>
</li>
@endif
<!--<li class="nav-item ">
<a class="nav-link" href="/admin/inventory/booking">
<span class="sidebar-mini"> <i class="fas fa-bookmark"></i> </span>
<span class="sidebar-normal"> Réservation</span>
</a>
</li>-->
</ul>
</div>
</li>
@endif
@if(\Auth::user()->p('picture_see') == 1)
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#picture">
<i class="material-icons">image</i>
<p> Image
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="picture">
<ul class="nav">
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/picture">
<span class="sidebar-mini"> <i class="fas fa-list"></i> </span>
<span class="sidebar-normal"> Afficher toutes les images </span>
</a>
</li>
@if(\Auth::user()->p('picture_add') == 1)
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/picture/add">
<span class="sidebar-mini"> <i class="fas fa-plus"></i> </span>
<span class="sidebar-normal"> Ajouter une image </span>
</a>
</li>
@endif
</ul>
</div>
</li>
@endif
@if(\Auth::user()->p('stats_see') == 1)
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#stats">
<i class="material-icons">timeline</i>
<p> Statistiques
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="stats">
<ul class="nav">
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/stats/log">
<span class="sidebar-mini"> <i class="fas fa-user-secret"></i> </span>
<span class="sidebar-normal"> Liste des activitées </span>
</a>
</li>
</ul>
</div>
</li>
@endif
@if(\Auth::user()->p('user_see') == 1)
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#user">
<i class="material-icons">supervised_user_circle</i>
<p> utilisateurs
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="user">
<ul class="nav">
@if(\Auth::user()->p('user_add') == 1)
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/user/add">
<span class="sidebar-mini"> <i class="fas fa-plus"></i> </span>
<span class="sidebar-normal"> Ajouter un utilisateur </span>
</a>
</li>
@endif
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/user">
<span class="sidebar-mini"> <i class="fas fa-list"></i> </span>
<span class="sidebar-normal"> Liste des utilisateurs </span>
</a>
</li>
</ul>
</div>
</li>
@endif
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#file">
<i class="material-icons">folder</i>
<p> Fichier
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="file">
<ul class="nav">
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/drive">
<span class="sidebar-mini"> <i class="fab fa-google-drive"></i> </span>
<span class="sidebar-normal"> Explorateur de fichier </span>
@foreach($sidebar as $name => $s)
@if(\Auth::user()->p($s['perm']) == 1 || $s['perm'] == null)
@if($s['route'])
<li class="nav-item @if(\Request::route()->getName() == $s['route']) active @endif">
<a class="nav-link" href="{{route($s['route'])}}">
<i class="material-icons">{{$s['icon']}}</i>
<p> {{$name}} </p>
</a>
</li>
@if(\Auth::user()->p('file_see_staff') == 1)
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/guide">
<span class="sidebar-mini"> <i class="fas fa-book"></i></span>
<span class="sidebar-normal"> Guide pédagogique </span>
</a>
</li>
@endif
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/files">
<span class="sidebar-mini"> <i class="fas fa-cog"></i> </span>
<span class="sidebar-normal"> Divers </span>
@else
<li class="nav-item " id="link-{{str_replace(' ', '', $name)}}">
<a class="nav-link" data-toggle="collapse" href="#{{str_replace(' ', '', $name)}}">
<i class="material-icons">{{$s['icon']}}</i>
<p> {{$name}}
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="{{str_replace(' ', '', $name)}}">
<ul class="nav">
@foreach($s['child'] as $n => $i)
@if(\Auth::user()->p($i['perm']) == 1 || $i['perm'] == null)
<li class="nav-item pl-2 @if(strpos(\Request::route()->getName(),$i['route']) !== false) active @endif" parent="{{str_replace(' ', '', $name)}}">
<a class="nav-link" href="{{route($i['route'])}}">
<span class="sidebar-mini"> <i class="{{$i['icon']}}"></i> </span>
<span class="sidebar-normal"> {{$n}} </span>
</a>
</li>
@endif
@endforeach
</ul>
</div>
</li>
</ul>
</div>
</li>
@if(\Auth::user()->p('config_edit') == 1)
<li class="nav-item ">
<a class="nav-link" data-toggle="collapse" href="#config">
<i class="material-icons">settings</i>
<p> Configurations
<b class="caret"></b>
</p>
</a>
<div class="collapse" id="config">
<ul class="nav">
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config">
<span class="sidebar-mini"> <i class="fas fa-cog"></i> </span>
<span class="sidebar-normal"> Général </span>
</a>
</li>
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config/schedule">
<span class="sidebar-mini"> <i class="fas fa-calendar"></i></span>
<span class="sidebar-normal"> Horaire </span>
</a>
</li>
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config/activity">
<span class="sidebar-mini"> <i class="fas fa-hiking"></i> </span>
<span class="sidebar-normal"> Activités </span>
</a>
</li>
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config/ranks">
<span class="sidebar-mini"> <i class="fas fa-user-tag"></i> </span>
<span class="sidebar-normal"> Grade </span>
</a>
</li>
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config/jobs">
<span class="sidebar-mini"> <i class="fas fa-user-shield"></i> </span>
<span class="sidebar-normal"> Poste </span>
</a>
</li>
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config/customisation">
<span class="sidebar-mini"> <i class="fas fa-palette"></i> </span>
<span class="sidebar-normal"> Apparence </span>
</a>
</li>
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config/files">
<span class="sidebar-mini"> <i class="fas fa-folder"></i> </span>
<span class="sidebar-normal"> Fichier </span>
</a>
</li>
<li class="nav-item pl-2">
<a class="nav-link" href="/admin/config/coursedb">
<span class="sidebar-mini"> <i class="fas fa-database"></i> </span>
<span class="sidebar-normal"> BD des cours </span>
</a>
</li>
</ul>
</div>
</li>
@endif
@endif
@endif
@endforeach
<h6 class="ml-4 mt-5" style="color:white">
Outils
</h6>

View File

@@ -2,7 +2,7 @@
<div class="container mt-lg-5 pt-md-5">
<div class="row mt-sm-5 pt-md-5">
<div class="col-md-6 ml-auto mr-auto text-center">
<h1>
<h1 id="test">
{{App\Config::getData('escadron_name_full')}}
</h1>
<a class="badge badge-primary edit-btn" href="/admin/public/edit/escadron_name_full" style="display: none;">

View File

@@ -50,8 +50,10 @@
}
}
</script>
<script>
<script>
$('#test').html('Loading Start ...');
document.addEventListener('DOMContentLoaded', function() {
$('#test').html('DOM ContentLoaded');
var calendarEl = document.getElementById('public_calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
@@ -71,8 +73,9 @@
$('#schedulemodal').modal('toggle')
}
});
$('#test').html('Begin render');
calendar.render();
$('#test').html('Render Done');
});
</script>

View File

@@ -64,13 +64,17 @@ Route::middleware('auth:api')->group(function () {
/** Job Route */
Route::post('/config/job/delete','JobController@destroy')->middleware('perm:config_edit');
/** Course Route */
Route::post('/course/{id}/plan/validate','CourseController@validatePlan')->middleware('courseperm:validate_plan');;
/** File Exlorer Route */
Route::get('/drive/{folder}/permission/{subject}/{id}','GoogleDriveController@editPermissionModal')->middleware('perm:file_see');
Route::get('/drive/folders/{folder?}','GoogleDriveController@list');
Route::get('/drive/path/{folder}','GoogleDriveController@getPath');
Route::get('/drive/patharray','GoogleDriveController@getPathArray');
Route::get('/drive/files/{dir}/{file}','GoogleDriveController@showMetadata');
Route::get('/drive/checkfilestructure','GoogleDriveController@checkFileSystem');
Route::get('/drive/{folder}/addpermission/{subject}','GoogleDriveController@addPermissionModal')->middleware('perm:file_see');
Route::get('/drive/folders/{folder?}','GoogleDriveController@list')->middleware('fileperm:folder,r');
Route::get('/drive/path/{folder}','GoogleDriveController@getPath')->middleware('fileperm:folder,r');
Route::get('/drive/patharray','GoogleDriveController@getPathArray')->middleware('perm:file_see');
Route::get('/drive/files/{dir}/{file}','GoogleDriveController@showMetadata')->middleware('fileperm:folder,r');
Route::get('/drive/checkfilestructure','GoogleDriveController@checkFileSystem')->middleware('perm:config_edit');;
Route::get('/user/perm/{id}', function($id) {
$user = \App\User::find($id);

View File

@@ -50,9 +50,16 @@ Breadcrumbs::for('admin.log', function ($trail) {
});
// Admin > User
Breadcrumbs::for('admin.user', function ($trail) {
Breadcrumbs::for('admin.users', function ($trail) {
$trail->parent('admin.dashboard');
$trail->push('Utilisateurs', route('admin.user'));
$trail->push('Utilisateurs', route('admin.users'));
});
// Admin > User > [user]
Breadcrumbs::for('admin.user', function ($trail, $id) {
$user = \App\User::findOrFail($id);
$trail->parent('admin.users');
$trail->push($user->fullname(), route('admin.user',$user));
});
// Admin > User > Add
@@ -61,27 +68,35 @@ Breadcrumbs::for('admin.user.add', function ($trail) {
$trail->push('Ajouter un utilisateur', route('admin.user.add'));
});
// Admin > User > Edit
// Admin > User > [user] > Edit
Breadcrumbs::for('admin.user.edit', function ($trail, $id) {
$trail->parent('admin.user');
$trail->push('Modifier un utilisateur', route('admin.user.edit', $id));
$user = \App\User::findOrFail($id);
$trail->parent('admin.user',$id);
$trail->push('Modifier', route('admin.user.edit', $user));
});
// Admin > User > [user] > Courses
Breadcrumbs::for('admin.user.courses', function ($trail, $id) {
$user = \App\User::findOrFail($id);
$trail->parent('admin.user',$id);
$trail->push('Liste des cours', route('admin.user.courses', $user));
});
// Admin > Config
Breadcrumbs::for('admin.config', function ($trail) {
Breadcrumbs::for('admin.config.general', function ($trail) {
$trail->parent('admin.dashboard');
$trail->push('Configurations', route('admin.config'));
$trail->push('Configurations', route('admin.config.general'));
});
// Admin > Config > Calendrier
// Admin > Config > Instruction
Breadcrumbs::for('admin.config.schedule', function ($trail) {
$trail->parent('admin.config');
$trail->push('Horaire', route('admin.config.schedule'));
$trail->parent('admin.config.general');
$trail->push('Instruction', route('admin.config.schedule'));
});
// Admin > Config > Activite complementaire
Breadcrumbs::for('admin.config.complementary-activity', function ($trail) {
$trail->parent('admin.config');
$trail->parent('admin.config.general');
$trail->push('Activitée complémentaire', route('admin.config.complementary-activity'));
});
@@ -99,13 +114,13 @@ Breadcrumbs::for('admin.config.complementary-activity.edit', function ($trail, $
// Admin > Config > Customisation
Breadcrumbs::for('admin.config.customisation', function ($trail) {
$trail->parent('admin.config');
$trail->parent('admin.config.general');
$trail->push('Apparence', route('admin.config.customisation'));
});
// Admin > Config > Rank
Breadcrumbs::for('admin.config.rank', function ($trail) {
$trail->parent('admin.config');
$trail->parent('admin.config.general');
$trail->push('Grade', route('admin.config.rank'));
});
@@ -123,7 +138,7 @@ Breadcrumbs::for('admin.config.rank.edit', function ($trail, $id) {
// Admin > Config > Jobs
Breadcrumbs::for('admin.config.jobs', function ($trail) {
$trail->parent('admin.config');
$trail->parent('admin.config.general');
$trail->push('Postes', route('admin.config.jobs'));
});
@@ -141,7 +156,7 @@ Breadcrumbs::for('admin.config.jobs.edit', function ($trail, $id) {
// Admin > Config > Files
Breadcrumbs::for('admin.config.files', function ($trail) {
$trail->parent('admin.config');
$trail->parent('admin.config.general');
$trail->push('Système de fichier', route('admin.config.files'));
});
@@ -247,6 +262,12 @@ Breadcrumbs::for('admin.profil.psw', function ($trail) {
$trail->push('Password', route('admin.profil.psw'));
});
// Admin > Profil > Adress
Breadcrumbs::for('admin.profil.courses', function ($trail) {
$trail->parent('admin.profil');
$trail->push('Mes cours', route('admin.profil.courses'));
});
// Admin > Drive
Breadcrumbs::for('admin.drive', function ($trail) {
$trail->parent('admin.dashboard');
@@ -265,17 +286,64 @@ Breadcrumbs::for('admin.drive.folder', function ($trail,$folder) {
$trail->push(\Storage::cloud()->getMetadata($folder)['name'], route('admin.drive',$folder));
});
// Admin > Guide
Breadcrumbs::for('admin.guide', function ($trail) {
// Admin > Instruction
Breadcrumbs::for('admin.instruction', function ($trail) {
$trail->parent('admin.dashboard');
$trail->push('Guide pédagogique', route('admin.guide'));
$trail->push('Instruction', route('admin.instruction'));
});
// Admin > Instruction > Guide
Breadcrumbs::for('admin.instruction.guide', function ($trail) {
$trail->parent('admin.instruction');
$trail->push('Guide pédagogique et norme de qualification', route('admin.instruction.guide'));
});
// Admin > Instruction > Lesson Plan
Breadcrumbs::for('admin.instruction.course', function ($trail) {
$trail->parent('admin.instruction');
$trail->push('Plan de cours et documentation', route('admin.instruction.course'));
});
// Admin > Instruction > Lesson Plan
Breadcrumbs::for('admin.stats.instruction', function ($trail) {
$trail->parent('admin.instruction');
$trail->push('Statistique de l\'instruction', route('admin.stats.instruction'));
});
// Admin > Files
Breadcrumbs::for('admin.files', function ($trail) {
$trail->parent('admin.dashboard');
$trail->push('Fichier', route('admin.files'));
$trail->push('Mes fichier', route('admin.files'));
});
// Admin > Files > Cadet
Breadcrumbs::for('admin.files.cadet', function ($trail) {
$trail->parent('admin.files');
$trail->push('Cadet', route('admin.files.cadet'));
});
// Admin > Files > Staff
Breadcrumbs::for('admin.files.staff', function ($trail) {
$trail->parent('admin.files');
$trail->push('Staff', route('admin.files.staff'));
});
// Admin > Files > ETAMAS
Breadcrumbs::for('admin.files.etamas', function ($trail) {
$trail->parent('admin.files');
$trail->push('ETAMAS', route('admin.files.etamas'));
});
// Admin > Files > Officier
Breadcrumbs::for('admin.files.officier', function ($trail) {
$trail->parent('admin.files');
$trail->push('Officier', route('admin.files.officier'));
});
// Admin > Files > Publique
Breadcrumbs::for('admin.files.publique', function ($trail) {
$trail->parent('admin.files');
$trail->push('Publique', route('admin.files.publique'));
});
// Admin > OCOM
@@ -308,4 +376,17 @@ Breadcrumbs::for('admin.ocom.edit', function ($trail, $id) {
$ocom = \App\OCOM::findOrFail($id);
$trail->parent('admin.ocom.show',$id);
$trail->push('Modifier', route('admin.ocom.edit', $ocom));
});
// Admin > Course
Breadcrumbs::for('admin.course', function ($trail) {
$trail->parent('admin.dashboard');
$trail->push('Liste des cours', route('admin.course'));
});
// Admin > Course > [course]
Breadcrumbs::for('admin.course.show', function ($trail, $id) {
$course = \App\Course::findOrFail($id);
$trail->parent('admin.course',$id);
$trail->push($course->ocom.' ('.$course->event->date_begin.')', route('admin.course.show',$course));
});

View File

@@ -50,7 +50,8 @@ Route::middleware(['auth'])->name('admin.')->group(function () {
Route::post('/admin/schedule/event/edit/{id}','EventController@update')->middleware('perm:schedule_edit');
/** Statistique */
Route::get('/admin/stats/log' , 'LogController@index')->middleware('perm:stats_see')->name('log');
Route::get('/admin/stats/log' , 'LogController@index')->middleware('perm:stats_see')->name('stats.log');
Route::get('/admin/stats/instruction' , 'StatsController@instruction')->middleware('perm:stats_see')->name('stats.instruction');
/** Message */
Route::get('/admin/message' , 'MessageController@index')->middleware('perm:msg_see')->name('message');
@@ -59,22 +60,25 @@ Route::middleware(['auth'])->name('admin.')->group(function () {
Route::get('/admin/message/{id}', ['uses' =>'MessageController@show'])->middleware('perm:msg_see')->name('message.show');
/** User */
Route::get('/admin/user' , 'UserController@index')->middleware('perm:user_see')->name('user');
Route::get('/admin/user' , 'UserController@index')->middleware('perm:user_see')->name('users');
Route::get('/admin/user/{id}' , 'UserController@show')->middleware('perm:user_see')->name('user');
Route::get('/admin/user/{id}/course','UserController@showCourses')->name('user.courses');
Route::get('/admin/user/add' , 'UserController@create')->middleware('perm:user_add')->name('user.add');
Route::post('/admin/user/add' , 'UserController@store')->middleware('perm:user_add');
Route::get('/admin/user/edit/{id}' , 'UserController@edit')->middleware('perm:user_edit')->name('user.edit');
Route::post('/admin/user/edit/{id}' , 'UserController@update')->middleware('perm:user_edit');
/** Config */
Route::get('/admin/config/schedule' , 'ScheduleController@index')->middleware('perm:config_edit')->name('config.schedule');
Route::post('/admin/config/schedule/edit' , 'ScheduleController@update')->middleware('perm:config_edit');
Route::get('/admin/config/instruction' , 'ScheduleController@index')->middleware('perm:config_edit')->name('config.schedule');
Route::get('/admin/config/instruction/event_type/{id}' , 'EventTypeController@show')->middleware('perm:config_edit')->name('config.schedule.event_type');
Route::patch('/admin/config/instruction' , 'ScheduleController@update')->middleware('perm:config_edit');
Route::get('/admin/config/activity' , 'ComplementaryActivityController@index')->middleware('perm:config_edit')->name('config.complementary-activity');
Route::get('/admin/config/activity/add' , 'ComplementaryActivityController@create')->middleware('perm:config_edit')->name('config.complementary-activity.add');
Route::post('/admin/config/activity/add' , 'ComplementaryActivityController@store')->middleware('perm:config_edit');
Route::get('/admin/config/activity/edit/{id}' , 'ComplementaryActivityController@edit')->middleware('perm:config_edit')->name('config.complementary-activity.edit');
Route::post('/admin/config/activity/edit/{id}' , 'ComplementaryActivityController@update')->middleware('perm:config_edit');
Route::post('/admin/config/general/edit','ConfigController@update')->middleware('perm:config_edit');
Route::get('/admin/config/' , 'ConfigController@index')->middleware('perm:config_edit')->name('config');
Route::get('/admin/config/' , 'ConfigController@index')->middleware('perm:config_edit')->name('config.general');
Route::get('/admin/config/customisation','ConfigController@customisation')->middleware('perm:config_edit')->name('config.customisation');
Route::post('/admin/config/customisation','ConfigController@customisationUpdate')->middleware('perm:config_edit');
@@ -149,6 +153,7 @@ Route::middleware(['auth'])->name('admin.')->group(function () {
Route::post('/admin/notication/mark/{id}','UserController@notificationmark');
/** Profil */
Route::get('/admin/profil/courses' , 'ProfilController@courses')->name('profil.courses');
Route::get('/admin/profil/avatar' , 'UserController@UserAvatar')->name('profil.avatar');
Route::get('/admin/profil/password' , 'UserController@UserPassword')->name('profil.psw');
Route::get('/admin/profil/adress' , 'UserController@UserAdress')->name('profil.adress');
@@ -157,28 +162,51 @@ Route::middleware(['auth'])->name('admin.')->group(function () {
Route::get('/admin/profil/edit/avatar/{id}' , 'UserController@editUserAvatar');
Route::get('/admin/profil/{id?}' , 'UserController@showUserProfil')->name('profil');
/** Files */
Route::post('/file/create','GoogleDriveController@createFile');
Route::post('/file/upload','GoogleDriveController@uploadFile');
Route::post('/folder/create','GoogleDriveController@createFolder');
Route::get('/file/delete','GoogleDriveController@deleteFile')->middleware('perm:file_delete');
Route::get('/folder/delete','GoogleDriveController@deleteDir')->middleware('perm:file_delete');
/** Instruction */
Route::get('/admin/instruction','AdminController@instruction')->name('instruction');
Route::get('/admin/instruction/guide','FilesController@guide')->middleware('perm:instruction_guide_see')->name('instruction.guide');
Route::get('/admin/instruction/files','FilesController@instruction')->middleware('perm:file_see')->name('instruction.files');
/** Courses */
Route::get('/admin/course','CourseController@index')->name('course');
Route::get('/admin/course/{id}','CourseController@show')->name('course.show')->middleware('courseperm:see');
Route::patch('/admin/course/{id}/commentOfficer','CourseController@updateCommentOfficer')->middleware('courseperm:comment_officer');
Route::patch('/admin/course/{id}/comment','CourseController@updateComment')->middleware('courseperm:edit');
Route::patch('/admin/course/{id}/plan/commentOfficer','CourseController@updateCommentOfficerPlan')->middleware('courseperm:comment_plan_officer');
Route::patch('/admin/course/{id}/plan/comment','CourseController@updateCommentPlan')->middleware('courseperm:edit');
Route::post('/admin/course/{id}/lessonPlan','CourseController@updateLessonPlan')->middleware('courseperm:edit');
/** Files */
Route::post('/file/create','GoogleDriveController@createFile')->middleware('fileperm:folder,w');
Route::post('/file/upload','GoogleDriveController@uploadFile')->middleware('fileperm:folder,w');
Route::post('/folder/create','GoogleDriveController@createFolder')->middleware('fileperm:folder,w');
Route::get('/file/delete','GoogleDriveController@deleteFile')->middleware('perm:file_delete')->middleware('fileperm:folder,w');
Route::get('/folder/delete','GoogleDriveController@deleteDir')->middleware('perm:file_delete')->middleware('fileperm:folder,w');
Route::get('/admin/files','FilesController@index')->middleware('perm:file_see')->name('files');
Route::get('/admin/guide','FilesController@guide')->middleware('perm:file_see')->name('guide');
Route::get('/admin/drive/{folder?}','GoogleDriveController@index')->middleware('fileperm:folder,r')->name('drive');
Route::get('/admin/files/cadet','FilesController@cadet')->middleware('perm:file_see')->name('files.cadet')->middleware('fileperm:folder,r');
Route::get('/admin/files/staff','FilesController@staff')->middleware('perm:file_see')->name('files.staff')->middleware('fileperm:folder,r');
Route::get('/admin/files/etamas','FilesController@etamas')->middleware('perm:file_see')->name('files.etamas')->middleware('fileperm:folder,r');
Route::get('/admin/files/officier','FilesController@officier')->middleware('perm:file_see')->name('files.officier')->middleware('fileperm:folder,r');
Route::get('/admin/files/publique','FilesController@publique')->middleware('perm:file_see')->name('files.publique')->middleware('fileperm:folder,r');
Route::get('/admin/drive/{folder?}','GoogleDriveController@index')->middleware('fileperm:folder,r','perm:drive_see')->name('drive');
Route::get('/admin/folder/{folder?}','GoogleDriveController@index')->middleware('fileperm:folder,r')->name('drive');
Route::get('/admin/drive/{folder}/permission','GoogleDriveController@editPermission')->middleware('fileperm:folder,p')->name('drive.permission');
Route::patch('/admin/drive/{folder}/permission/{subject}/{id}','GoogleDriveController@editPermission')->middleware('perm:file_see','fileperm:folder,p');
Route::patch('/admin/drive/{folder}/permission/{subject}/{id}','GoogleDriveController@patchPermission')->middleware('perm:file_see','fileperm:folder,p');
Route::get('/admin/drive/{folder}/deletepermission/{subject}/{id}','GoogleDriveController@deletePermission')->middleware('perm:file_see','fileperm:folder,p');
Route::patch('/admin/drive/{folder}/addpermission/{subject}','GoogleDriveController@addPermission')->middleware('perm:file_see','fileperm:folder,p');
/** OCOM */
Route::get('/admin/ocom','OCOMController@index')->name('ocom');
Route::get('/admin/ocom/generate','OCOMController@showgenerate')->name('ocom.generate');
Route::put('/admin/ocom/generate','OCOMController@generate');
Route::get('/admin/ocom/add','OCOMController@create')->name('ocom.add');
Route::put('/admin/ocom/add','OCOMController@store');
Route::get('/admin/ocom/{id}/edit','OCOMController@edit')->name('ocom.edit');
Route::patch('/admin/ocom/{id}/edit','OCOMController@update');
Route::get('/admin/ocom/{id}','OCOMController@show')->name('ocom.show');
Route::get('/admin/ocom','OCOMController@index')->name('ocom')->middleware('perm:instruction_db_ocom_see');
Route::get('/admin/ocom/generate','OCOMController@showgenerate')->name('ocom.generate')->middleware('perm:instruction_db_ocom_edit');
Route::put('/admin/ocom/generate','OCOMController@generate')->middleware('perm:instruction_db_ocom_edit');
Route::get('/admin/ocom/add','OCOMController@create')->name('ocom.add')->middleware('perm:instruction_db_ocom_add');
Route::put('/admin/ocom/add','OCOMController@store')->middleware('perm:instruction_db_ocom_add');
Route::get('/admin/ocom/{id}/edit','OCOMController@edit')->name('ocom.edit')->middleware('perm:instruction_db_ocom_edit');
Route::patch('/admin/ocom/{id}/edit','OCOMController@update')->middleware('perm:instruction_db_ocom_edit');
Route::get('/admin/ocom/{id}','OCOMController@show')->name('ocom.show')->middleware('perm:instruction_db_ocom_see');
});