diff --git a/app/Course.php b/app/Course.php
index 53e08c26..7ad56fe2 100644
--- a/app/Course.php
+++ b/app/Course.php
@@ -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);
+ }
+
}
diff --git a/app/Event.php b/app/Event.php
index 37952ed7..b95d21af 100644
--- a/app/Event.php
+++ b/app/Event.php
@@ -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();
diff --git a/app/GoogleDriveFile.php b/app/GoogleDriveFile.php
index dde0e2a4..230fb95a 100644
--- a/app/GoogleDriveFile.php
+++ b/app/GoogleDriveFile.php
@@ -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;
+ }
}
diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php
index ce20ae4a..e7ad000f 100644
--- a/app/Http/Controllers/AdminController.php
+++ b/app/Http/Controllers/AdminController.php
@@ -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()
+ {
+
+ }
+
}
diff --git a/app/Http/Controllers/CourseController.php b/app/Http/Controllers/CourseController.php
index 6e495f85..3be9ccb5 100644
--- a/app/Http/Controllers/CourseController.php
+++ b/app/Http/Controllers/CourseController.php
@@ -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);
+ }
}
diff --git a/app/Http/Controllers/EventTypeController.php b/app/Http/Controllers/EventTypeController.php
index 231cb37e..55f99d88 100644
--- a/app/Http/Controllers/EventTypeController.php
+++ b/app/Http/Controllers/EventTypeController.php
@@ -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]);
}
/**
diff --git a/app/Http/Controllers/FilesController.php b/app/Http/Controllers/FilesController.php
index 135234ae..e87fae2d 100644
--- a/app/Http/Controllers/FilesController.php
+++ b/app/Http/Controllers/FilesController.php
@@ -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']);
}
}
diff --git a/app/Http/Controllers/GoogleDriveController.php b/app/Http/Controllers/GoogleDriveController.php
index 0a4431d1..facff370 100644
--- a/app/Http/Controllers/GoogleDriveController.php
+++ b/app/Http/Controllers/GoogleDriveController.php
@@ -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');
+ }
}
diff --git a/app/Http/Controllers/LessonPlanController.php b/app/Http/Controllers/LessonPlanController.php
new file mode 100644
index 00000000..32cfa438
--- /dev/null
+++ b/app/Http/Controllers/LessonPlanController.php
@@ -0,0 +1,85 @@
+ $courses,'mode' => $mode]);
+ }
+}
diff --git a/app/Http/Controllers/ScheduleController.php b/app/Http/Controllers/ScheduleController.php
index e4a2c70c..73cb6e0e 100644
--- a/app/Http/Controllers/ScheduleController.php
+++ b/app/Http/Controllers/ScheduleController.php
@@ -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()
diff --git a/app/Http/Controllers/StatsController.php b/app/Http/Controllers/StatsController.php
new file mode 100644
index 00000000..328f0381
--- /dev/null
+++ b/app/Http/Controllers/StatsController.php
@@ -0,0 +1,81 @@
+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()),
+ ]);
+ }
+}
diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php
index b1e66459..9f6c8f32 100644
--- a/app/Http/Controllers/UserController.php
+++ b/app/Http/Controllers/UserController.php
@@ -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]);
+ }
}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 75cf88dd..27361b03 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -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,
];
}
diff --git a/app/Http/Middleware/CheckCoursePerm.php b/app/Http/Middleware/CheckCoursePerm.php
new file mode 100644
index 00000000..24e0ccee
--- /dev/null
+++ b/app/Http/Middleware/CheckCoursePerm.php
@@ -0,0 +1,43 @@
+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');
+ }
+}
diff --git a/app/LessonPlan.php b/app/LessonPlan.php
new file mode 100644
index 00000000..6c05c0f3
--- /dev/null
+++ b/app/LessonPlan.php
@@ -0,0 +1,13 @@
+belongsTo('App\Course');
+ }
+}
diff --git a/app/Permission.php b/app/Permission.php
index 32f14a5c..6f2d4330 100644
--- a/app/Permission.php
+++ b/app/Permission.php
@@ -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
- ]
]
];
diff --git a/app/User.php b/app/User.php
index 987a3620..425717ad 100644
--- a/app/User.php
+++ b/app/User.php
@@ -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)
diff --git a/database/migrations/2019_08_17_102836_create_courses_table.php b/database/migrations/2019_08_17_102836_create_courses_table.php
index 3782007b..0e795d18 100644
--- a/database/migrations/2019_08_17_102836_create_courses_table.php
+++ b/database/migrations/2019_08_17_102836_create_courses_table.php
@@ -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();
diff --git a/database/migrations/2020_04_06_142322_create_lesson_plans_table.php b/database/migrations/2020_04_06_142322_create_lesson_plans_table.php
new file mode 100644
index 00000000..69b95ba6
--- /dev/null
+++ b/database/migrations/2020_04_06_142322_create_lesson_plans_table.php
@@ -0,0 +1,37 @@
+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');
+ }
+}
diff --git a/public/css/Chart.min.css b/public/css/Chart.min.css
new file mode 100644
index 00000000..9dc5ac2e
--- /dev/null
+++ b/public/css/Chart.min.css
@@ -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}
\ No newline at end of file
diff --git a/public/css/custom.css b/public/css/custom.css
index 4ca0c16e..1eb79b1c 100644
--- a/public/css/custom.css
+++ b/public/css/custom.css
@@ -1836,4 +1836,8 @@ h2 {
.no-hover:hover {
background-color: initial;
+}
+
+tfoot > tr {
+ width: 100%;
}
\ No newline at end of file
diff --git a/public/images/fall-art-red-autumn-leaves-orange-fall-trees-baslee-troutman-baslee-troutman-art-gallery-collections.jpg b/public/images/fall-art-red-autumn-leaves-orange-fall-trees-baslee-troutman-baslee-troutman-art-gallery-collections.jpg
new file mode 100644
index 00000000..9147ea2c
Binary files /dev/null and b/public/images/fall-art-red-autumn-leaves-orange-fall-trees-baslee-troutman-baslee-troutman-art-gallery-collections.jpg differ
diff --git a/public/images/sidebar.png b/public/images/sidebar.png
new file mode 100644
index 00000000..046f8771
Binary files /dev/null and b/public/images/sidebar.png differ
diff --git a/public/js/app.js b/public/js/app.js
index c041062a..f98ed062 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -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');
+ }
}
\ No newline at end of file
diff --git a/public/js/plugins/Chart.min.js b/public/js/plugins/Chart.min.js
new file mode 100644
index 00000000..7c16b0d1
--- /dev/null
+++ b/public/js/plugins/Chart.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Chart.js v2.9.3
+ * https://www.chartjs.org
+ * (c) 2019 Chart.js Contributors
+ * Released under the MIT License
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(function(){try{return require("moment")}catch(t){}}()):"function"==typeof define&&define.amd?define(["require"],(function(t){return e(function(){try{return t("moment")}catch(t){}}())})):(t=t||self).Chart=e(t.moment)}(this,(function(t){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t;var e={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},n=function(t,e){return t(e={exports:{}},e.exports),e.exports}((function(t){var n={};for(var i in e)e.hasOwnProperty(i)&&(n[e[i]]=i);var a=t.exports={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};for(var r in a)if(a.hasOwnProperty(r)){if(!("channels"in a[r]))throw new Error("missing channels property: "+r);if(!("labels"in a[r]))throw new Error("missing channel labels property: "+r);if(a[r].labels.length!==a[r].channels)throw new Error("channel and label counts mismatch: "+r);var o=a[r].channels,s=a[r].labels;delete a[r].channels,delete a[r].labels,Object.defineProperty(a[r],"channels",{value:o}),Object.defineProperty(a[r],"labels",{value:s})}a.rgb.hsl=function(t){var e,n,i=t[0]/255,a=t[1]/255,r=t[2]/255,o=Math.min(i,a,r),s=Math.max(i,a,r),l=s-o;return s===o?e=0:i===s?e=(a-r)/l:a===s?e=2+(r-i)/l:r===s&&(e=4+(i-a)/l),(e=Math.min(60*e,360))<0&&(e+=360),n=(o+s)/2,[e,100*(s===o?0:n<=.5?l/(s+o):l/(2-s-o)),100*n]},a.rgb.hsv=function(t){var e,n,i,a,r,o=t[0]/255,s=t[1]/255,l=t[2]/255,u=Math.max(o,s,l),d=u-Math.min(o,s,l),h=function(t){return(u-t)/6/d+.5};return 0===d?a=r=0:(r=d/u,e=h(o),n=h(s),i=h(l),o===u?a=i-n:s===u?a=1/3+e-i:l===u&&(a=2/3+n-e),a<0?a+=1:a>1&&(a-=1)),[360*a,100*r,100*u]},a.rgb.hwb=function(t){var e=t[0],n=t[1],i=t[2];return[a.rgb.hsl(t)[0],100*(1/255*Math.min(e,Math.min(n,i))),100*(i=1-1/255*Math.max(e,Math.max(n,i)))]},a.rgb.cmyk=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255;return[100*((1-n-(e=Math.min(1-n,1-i,1-a)))/(1-e)||0),100*((1-i-e)/(1-e)||0),100*((1-a-e)/(1-e)||0),100*e]},a.rgb.keyword=function(t){var i=n[t];if(i)return i;var a,r,o,s=1/0;for(var l in e)if(e.hasOwnProperty(l)){var u=e[l],d=(r=t,o=u,Math.pow(r[0]-o[0],2)+Math.pow(r[1]-o[1],2)+Math.pow(r[2]-o[2],2));d.04045?Math.pow((e+.055)/1.055,2.4):e/12.92)+.3576*(n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92)+.1805*(i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92)),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},a.rgb.lab=function(t){var e=a.rgb.xyz(t),n=e[0],i=e[1],r=e[2];return i/=100,r/=108.883,n=(n/=95.047)>.008856?Math.pow(n,1/3):7.787*n+16/116,[116*(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116)-16,500*(n-i),200*(i-(r=r>.008856?Math.pow(r,1/3):7.787*r+16/116))]},a.hsl.rgb=function(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[r=255*l,r,r];e=2*l-(n=l<.5?l*(1+s):l+s-l*s),a=[0,0,0];for(var u=0;u<3;u++)(i=o+1/3*-(u-1))<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a},a.hsl.hsv=function(t){var e=t[0],n=t[1]/100,i=t[2]/100,a=n,r=Math.max(i,.01);return n*=(i*=2)<=1?i:2-i,a*=r<=1?r:2-r,[e,100*(0===i?2*a/(r+a):2*n/(i+n)),100*((i+n)/2)]},a.hsv.rgb=function(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r));switch(i*=255,a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}},a.hsv.hsl=function(t){var e,n,i,a=t[0],r=t[1]/100,o=t[2]/100,s=Math.max(o,.01);return i=(2-r)*o,n=r*s,[a,100*(n=(n/=(e=(2-r)*s)<=1?e:2-e)||0),100*(i/=2)]},a.hwb.rgb=function(t){var e,n,i,a,r,o,s,l=t[0]/360,u=t[1]/100,d=t[2]/100,h=u+d;switch(h>1&&(u/=h,d/=h),i=6*l-(e=Math.floor(6*l)),0!=(1&e)&&(i=1-i),a=u+i*((n=1-d)-u),e){default:case 6:case 0:r=n,o=a,s=u;break;case 1:r=a,o=n,s=u;break;case 2:r=u,o=n,s=a;break;case 3:r=u,o=a,s=n;break;case 4:r=a,o=u,s=n;break;case 5:r=n,o=u,s=a}return[255*r,255*o,255*s]},a.cmyk.rgb=function(t){var e=t[0]/100,n=t[1]/100,i=t[2]/100,a=t[3]/100;return[255*(1-Math.min(1,e*(1-a)+a)),255*(1-Math.min(1,n*(1-a)+a)),255*(1-Math.min(1,i*(1-a)+a))]},a.xyz.rgb=function(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return n=-.9689*a+1.8758*r+.0415*o,i=.0557*a+-.204*r+1.057*o,e=(e=3.2406*a+-1.5372*r+-.4986*o)>.0031308?1.055*Math.pow(e,1/2.4)-.055:12.92*e,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:12.92*n,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:12.92*i,[255*(e=Math.min(Math.max(0,e),1)),255*(n=Math.min(Math.max(0,n),1)),255*(i=Math.min(Math.max(0,i),1))]},a.xyz.lab=function(t){var e=t[0],n=t[1],i=t[2];return n/=100,i/=108.883,e=(e/=95.047)>.008856?Math.pow(e,1/3):7.787*e+16/116,[116*(n=n>.008856?Math.pow(n,1/3):7.787*n+16/116)-16,500*(e-n),200*(n-(i=i>.008856?Math.pow(i,1/3):7.787*i+16/116))]},a.lab.xyz=function(t){var e,n,i,a=t[0];e=t[1]/500+(n=(a+16)/116),i=n-t[2]/200;var r=Math.pow(n,3),o=Math.pow(e,3),s=Math.pow(i,3);return n=r>.008856?r:(n-16/116)/7.787,e=o>.008856?o:(e-16/116)/7.787,i=s>.008856?s:(i-16/116)/7.787,[e*=95.047,n*=100,i*=108.883]},a.lab.lch=function(t){var e,n=t[0],i=t[1],a=t[2];return(e=360*Math.atan2(a,i)/2/Math.PI)<0&&(e+=360),[n,Math.sqrt(i*i+a*a),e]},a.lch.lab=function(t){var e,n=t[0],i=t[1];return e=t[2]/360*2*Math.PI,[n,i*Math.cos(e),i*Math.sin(e)]},a.rgb.ansi16=function(t){var e=t[0],n=t[1],i=t[2],r=1 in arguments?arguments[1]:a.rgb.hsv(t)[2];if(0===(r=Math.round(r/50)))return 30;var o=30+(Math.round(i/255)<<2|Math.round(n/255)<<1|Math.round(e/255));return 2===r&&(o+=60),o},a.hsv.ansi16=function(t){return a.rgb.ansi16(a.hsv.rgb(t),t[2])},a.rgb.ansi256=function(t){var e=t[0],n=t[1],i=t[2];return e===n&&n===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(i/255*5)},a.ansi16.rgb=function(t){var e=t%10;if(0===e||7===e)return t>50&&(e+=3.5),[e=e/10.5*255,e,e];var n=.5*(1+~~(t>50));return[(1&e)*n*255,(e>>1&1)*n*255,(e>>2&1)*n*255]},a.ansi256.rgb=function(t){if(t>=232){var e=10*(t-232)+8;return[e,e,e]}var n;return t-=16,[Math.floor(t/36)/5*255,Math.floor((n=t%36)/6)/5*255,n%6/5*255]},a.rgb.hex=function(t){var e=(((255&Math.round(t[0]))<<16)+((255&Math.round(t[1]))<<8)+(255&Math.round(t[2]))).toString(16).toUpperCase();return"000000".substring(e.length)+e},a.hex.rgb=function(t){var e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];var n=e[0];3===e[0].length&&(n=n.split("").map((function(t){return t+t})).join(""));var i=parseInt(n,16);return[i>>16&255,i>>8&255,255&i]},a.rgb.hcg=function(t){var e,n=t[0]/255,i=t[1]/255,a=t[2]/255,r=Math.max(Math.max(n,i),a),o=Math.min(Math.min(n,i),a),s=r-o;return e=s<=0?0:r===n?(i-a)/s%6:r===i?2+(a-n)/s:4+(n-i)/s+4,e/=6,[360*(e%=1),100*s,100*(s<1?o/(1-s):0)]},a.hsl.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=1,a=0;return(i=n<.5?2*e*n:2*e*(1-n))<1&&(a=(n-.5*i)/(1-i)),[t[0],100*i,100*a]},a.hsv.hcg=function(t){var e=t[1]/100,n=t[2]/100,i=e*n,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.hcg.rgb=function(t){var e=t[0]/360,n=t[1]/100,i=t[2]/100;if(0===n)return[255*i,255*i,255*i];var a,r=[0,0,0],o=e%1*6,s=o%1,l=1-s;switch(Math.floor(o)){case 0:r[0]=1,r[1]=s,r[2]=0;break;case 1:r[0]=l,r[1]=1,r[2]=0;break;case 2:r[0]=0,r[1]=1,r[2]=s;break;case 3:r[0]=0,r[1]=l,r[2]=1;break;case 4:r[0]=s,r[1]=0,r[2]=1;break;default:r[0]=1,r[1]=0,r[2]=l}return a=(1-n)*i,[255*(n*r[0]+a),255*(n*r[1]+a),255*(n*r[2]+a)]},a.hcg.hsv=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e),i=0;return n>0&&(i=e/n),[t[0],100*i,100*n]},a.hcg.hsl=function(t){var e=t[1]/100,n=t[2]/100*(1-e)+.5*e,i=0;return n>0&&n<.5?i=e/(2*n):n>=.5&&n<1&&(i=e/(2*(1-n))),[t[0],100*i,100*n]},a.hcg.hwb=function(t){var e=t[1]/100,n=e+t[2]/100*(1-e);return[t[0],100*(n-e),100*(1-n)]},a.hwb.hcg=function(t){var e=t[1]/100,n=1-t[2]/100,i=n-e,a=0;return i<1&&(a=(n-i)/(1-i)),[t[0],100*i,100*a]},a.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]},a.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]},a.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]},a.gray.hsl=a.gray.hsv=function(t){return[0,0,t[0]]},a.gray.hwb=function(t){return[0,100,t[0]]},a.gray.cmyk=function(t){return[0,0,0,t[0]]},a.gray.lab=function(t){return[t[0],0,0]},a.gray.hex=function(t){var e=255&Math.round(t[0]/100*255),n=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(n.length)+n},a.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}}));n.rgb,n.hsl,n.hsv,n.hwb,n.cmyk,n.xyz,n.lab,n.lch,n.hex,n.keyword,n.ansi16,n.ansi256,n.hcg,n.apple,n.gray;function i(t){var e=function(){for(var t={},e=Object.keys(n),i=e.length,a=0;a1&&(e=Array.prototype.slice.call(arguments));var n=t(e);if("object"==typeof n)for(var i=n.length,a=0;a1&&(e=Array.prototype.slice.call(arguments)),t(e))};return"conversion"in t&&(e.conversion=t.conversion),e}(i)}))}));var s=o,l={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},u={getRgba:d,getHsla:h,getRgb:function(t){var e=d(t);return e&&e.slice(0,3)},getHsl:function(t){var e=h(t);return e&&e.slice(0,3)},getHwb:c,getAlpha:function(t){var e=d(t);if(e)return e[3];if(e=h(t))return e[3];if(e=c(t))return e[3]},hexString:function(t,e){e=void 0!==e&&3===t.length?e:t[3];return"#"+v(t[0])+v(t[1])+v(t[2])+(e>=0&&e<1?v(Math.round(255*e)):"")},rgbString:function(t,e){if(e<1||t[3]&&t[3]<1)return f(t,e);return"rgb("+t[0]+", "+t[1]+", "+t[2]+")"},rgbaString:f,percentString:function(t,e){if(e<1||t[3]&&t[3]<1)return g(t,e);var n=Math.round(t[0]/255*100),i=Math.round(t[1]/255*100),a=Math.round(t[2]/255*100);return"rgb("+n+"%, "+i+"%, "+a+"%)"},percentaString:g,hslString:function(t,e){if(e<1||t[3]&&t[3]<1)return p(t,e);return"hsl("+t[0]+", "+t[1]+"%, "+t[2]+"%)"},hslaString:p,hwbString:function(t,e){void 0===e&&(e=void 0!==t[3]?t[3]:1);return"hwb("+t[0]+", "+t[1]+"%, "+t[2]+"%"+(void 0!==e&&1!==e?", "+e:"")+")"},keyword:function(t){return b[t.slice(0,3)]}};function d(t){if(t){var e=[0,0,0],n=1,i=t.match(/^#([a-fA-F0-9]{3,4})$/i),a="";if(i){a=(i=i[1])[3];for(var r=0;r0&&n.stroke()},draw:function(){var t=this._chart.ctx,e=this._view;if(0!==e.opacity){var n={width:e.width,height:e.height},i={x:e.x,y:e.y},a=Math.abs(e.opacity<.001)?0:e.opacity,r=e.title.length||e.beforeBody.length||e.body.length||e.afterBody.length||e.footer.length;this._options.enabled&&r&&(t.save(),t.globalAlpha=a,this.drawBackground(i,e,t,n),i.y+=e.yPadding,V.rtl.overrideTextDirection(t,e.textDirection),this.drawTitle(i,e,t),this.drawBody(i,e,t),this.drawFooter(i,e,t),V.rtl.restoreTextDirection(t,e.textDirection),t.restore())}},handleEvent:function(t){var e,n=this,i=n._options;return n._lastActive=n._lastActive||[],"mouseout"===t.type?n._active=[]:(n._active=n._chart.getElementsAtEventForMode(t,i.mode,i),i.reverse&&n._active.reverse()),(e=!V.arrayEquals(n._active,n._lastActive))&&(n._lastActive=n._active,(i.enabled||i.custom)&&(n._eventPosition={x:t.x,y:t.y},n.update(!0),n.pivot())),e}}),qe=Ne,Ue=je;Ue.positioners=qe;var Ye=V.valueOrDefault;function Ge(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){if("xAxes"===t||"yAxes"===t){var a,r,o,s=n[t].length;for(e[t]||(e[t]=[]),a=0;a=e[t].length&&e[t].push({}),!e[t][a].type||o.type&&o.type!==e[t][a].type?V.merge(e[t][a],[Oe.getScaleDefaults(r),o]):V.merge(e[t][a],o)}else V._merger(t,e,n,i)}})}function Xe(){return V.merge({},[].slice.call(arguments),{merger:function(t,e,n,i){var a=e[t]||{},r=n[t];"scales"===t?e[t]=Ge(a,r):"scale"===t?e[t]=V.merge(a,[Oe.getScaleDefaults(r.type),r]):V._merger(t,e,n,i)}})}function Ke(t){var e=t.options;V.each(t.scales,(function(e){ge.removeBox(t,e)})),e=Xe(z.global,z[t.config.type],e),t.options=t.config.options=e,t.ensureScalesHaveIDs(),t.buildOrUpdateScales(),t.tooltip._options=e.tooltips,t.tooltip.initialize()}function Ze(t,e,n){var i,a=function(t){return t.id===i};do{i=e+n++}while(V.findIndex(t,a)>=0);return i}function $e(t){return"top"===t||"bottom"===t}function Je(t,e){return function(n,i){return n[t]===i[t]?n[e]-i[e]:n[t]-i[t]}}z._set("global",{elements:{},events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,maintainAspectRatio:!0,responsive:!0,responsiveAnimationDuration:0});var Qe=function(t,e){return this.construct(t,e),this};V.extend(Qe.prototype,{construct:function(t,e){var n=this;e=function(t){var e=(t=t||{}).data=t.data||{};return e.datasets=e.datasets||[],e.labels=e.labels||[],t.options=Xe(z.global,z[t.type],t.options||{}),t}(e);var i=Fe.acquireContext(t,e),a=i&&i.canvas,r=a&&a.height,o=a&&a.width;n.id=V.uid(),n.ctx=i,n.canvas=a,n.config=e,n.width=o,n.height=r,n.aspectRatio=r?o/r:null,n.options=e.options,n._bufferedRender=!1,n._layers=[],n.chart=n,n.controller=n,Qe.instances[n.id]=n,Object.defineProperty(n,"data",{get:function(){return n.config.data},set:function(t){n.config.data=t}}),i&&a?(n.initialize(),n.update()):console.error("Failed to create chart: can't acquire context from the given item")},initialize:function(){var t=this;return Le.notify(t,"beforeInit"),V.retinaScale(t,t.options.devicePixelRatio),t.bindEvents(),t.options.responsive&&t.resize(!0),t.initToolTip(),Le.notify(t,"afterInit"),t},clear:function(){return V.canvas.clear(this),this},stop:function(){return $.cancelAnimation(this),this},resize:function(t){var e=this,n=e.options,i=e.canvas,a=n.maintainAspectRatio&&e.aspectRatio||null,r=Math.max(0,Math.floor(V.getMaximumWidth(i))),o=Math.max(0,Math.floor(a?r/a:V.getMaximumHeight(i)));if((e.width!==r||e.height!==o)&&(i.width=e.width=r,i.height=e.height=o,i.style.width=r+"px",i.style.height=o+"px",V.retinaScale(e,n.devicePixelRatio),!t)){var s={width:r,height:o};Le.notify(e,"resize",[s]),n.onResize&&n.onResize(e,s),e.stop(),e.update({duration:n.responsiveAnimationDuration})}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;V.each(e.xAxes,(function(t,n){t.id||(t.id=Ze(e.xAxes,"x-axis-",n))})),V.each(e.yAxes,(function(t,n){t.id||(t.id=Ze(e.yAxes,"y-axis-",n))})),n&&(n.id=n.id||"scale")},buildOrUpdateScales:function(){var t=this,e=t.options,n=t.scales||{},i=[],a=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{});e.scales&&(i=i.concat((e.scales.xAxes||[]).map((function(t){return{options:t,dtype:"category",dposition:"bottom"}})),(e.scales.yAxes||[]).map((function(t){return{options:t,dtype:"linear",dposition:"left"}})))),e.scale&&i.push({options:e.scale,dtype:"radialLinear",isDefault:!0,dposition:"chartArea"}),V.each(i,(function(e){var i=e.options,r=i.id,o=Ye(i.type,e.dtype);$e(i.position)!==$e(e.dposition)&&(i.position=e.dposition),a[r]=!0;var s=null;if(r in n&&n[r].type===o)(s=n[r]).options=i,s.ctx=t.ctx,s.chart=t;else{var l=Oe.getScaleConstructor(o);if(!l)return;s=new l({id:r,type:o,options:i,ctx:t.ctx,chart:t}),n[s.id]=s}s.mergeTicksOptions(),e.isDefault&&(t.scale=s)})),V.each(a,(function(t,e){t||delete n[e]})),t.scales=n,Oe.addScalesToLayout(this)},buildOrUpdateControllers:function(){var t,e,n=this,i=[],a=n.data.datasets;for(t=0,e=a.length;t=0;t--)e=i.getDistanceFromCenterForValue(r.ticks.reverse?i.min:i.max),n=i.getPointPosition(t,e),a.beginPath(),a.moveTo(i.xCenter,i.yCenter),a.lineTo(n.x,n.y),a.stroke();a.restore()}},_drawLabels:function(){var t=this,e=t.ctx,n=t.options.ticks;if(n.display){var i,a,r=t.getIndexAngle(0),o=V.options._parseFont(n),s=Nn(n.fontColor,z.global.defaultFontColor);e.save(),e.font=o.string,e.translate(t.xCenter,t.yCenter),e.rotate(r),e.textAlign="center",e.textBaseline="middle",V.each(t.ticks,(function(r,l){(0!==l||n.reverse)&&(i=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),n.showLabelBackdrop&&(a=e.measureText(r).width,e.fillStyle=n.backdropColor,e.fillRect(-a/2-n.backdropPaddingX,-i-o.size/2-n.backdropPaddingY,a+2*n.backdropPaddingX,o.size+2*n.backdropPaddingY)),e.fillStyle=s,e.fillText(r,0,-i))})),e.restore()}},_drawTitle:V.noop}),Xn=Wn;Gn._defaults=Xn;var Kn=V._deprecated,Zn=V.options.resolve,$n=V.valueOrDefault,Jn=Number.MIN_SAFE_INTEGER||-9007199254740991,Qn=Number.MAX_SAFE_INTEGER||9007199254740991,ti={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},ei=Object.keys(ti);function ni(t,e){return t-e}function ii(t){return V.valueOrDefault(t.time.min,t.ticks.min)}function ai(t){return V.valueOrDefault(t.time.max,t.ticks.max)}function ri(t,e,n,i){var a=function(t,e,n){for(var i,a,r,o=0,s=t.length-1;o>=0&&o<=s;){if(a=t[(i=o+s>>1)-1]||null,r=t[i],!a)return{lo:null,hi:r};if(r[e]=0;--n)(e=l[n].$filler)&&e.visible&&(a=(i=e.el)._view,r=i._children||[],o=e.mapper,s=a.backgroundColor||z.global.defaultColor,o&&s&&r.length&&(V.canvas.clipArea(u,t.chartArea),_i(u,r,o,a,s,i._loop),V.canvas.unclipArea(u)))}},wi=V.rtl.getRtlAdapter,Mi=V.noop,Si=V.valueOrDefault;function Ci(t,e){return t.usePointStyle&&t.boxWidth>e?e:t.boxWidth}z._set("global",{legend:{display:!0,position:"top",align:"center",fullWidth:!0,reverse:!1,weight:1e3,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,onLeave:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data.datasets,n=t.options.legend||{},i=n.labels&&n.labels.usePointStyle;return t._getSortedDatasetMetas().map((function(n){var a=n.controller.getStyle(i?0:void 0);return{text:e[n.index].label,fillStyle:a.backgroundColor,hidden:!t.isDatasetVisible(n.index),lineCap:a.borderCapStyle,lineDash:a.borderDash,lineDashOffset:a.borderDashOffset,lineJoin:a.borderJoinStyle,lineWidth:a.borderWidth,strokeStyle:a.borderColor,pointStyle:a.pointStyle,rotation:a.rotation,datasetIndex:n.index}}),this)}}},legendCallback:function(t){var e,n,i,a=document.createElement("ul"),r=t.data.datasets;for(a.setAttribute("class",t.id+"-legend"),e=0,n=r.length;e
- {{$r['desc']}} -
-{{$r['communName']}}
+ {{$r['desc']}}
+