mirror of
https://gitlab.com/TheGamecraft/c-cms.git
synced 2026-04-21 02:39:10 -04:00
File Explorer update + Permission update
This commit is contained in:
@@ -33,8 +33,8 @@ MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
|
||||
NEXMO_KEY=4587feffd # Votre Clé Nexmo API
|
||||
NEXMO_SECRET=54dasf4e8fa4s4fd4f5s # Votre Mot de passe Nexmo API
|
||||
NEXMO_KEY= # Votre Clé Nexmo API
|
||||
NEXMO_SECRET= # Votre Mot de passe Nexmo API
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
|
||||
@@ -3,9 +3,25 @@
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use League\Flysystem\FileNotFoundException;
|
||||
use mysql_xdevapi\Exception;
|
||||
|
||||
class GoogleDriveFile extends Model
|
||||
{
|
||||
protected $primaryKey = 'id'; // or null
|
||||
|
||||
public $incrementing = false;
|
||||
|
||||
// In Laravel 6.0+ make sure to also set $keyType
|
||||
protected $keyType = 'string';
|
||||
|
||||
protected $casts = [
|
||||
'rank_permission' => 'array',
|
||||
'job_permission' => 'array',
|
||||
'user_permission' => 'array',
|
||||
];
|
||||
|
||||
public static function icon($extension)
|
||||
{
|
||||
$icon = "fas fa-file";
|
||||
@@ -37,4 +53,204 @@ class GoogleDriveFile extends Model
|
||||
}
|
||||
return $icon;
|
||||
}
|
||||
|
||||
public static function checkConfig()
|
||||
{
|
||||
$configNull = (\Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_ID')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_SECRET')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_REFRESH_TOKEN')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_FOLDER_ID')) != "");
|
||||
$configOk = true;
|
||||
|
||||
if ($configNull)
|
||||
{
|
||||
try {
|
||||
\Storage::cloud()->listContents("/", false);
|
||||
}
|
||||
catch (\Exception $e)
|
||||
{
|
||||
$configOk = false;
|
||||
}
|
||||
}
|
||||
|
||||
return $configNull && $configOk;
|
||||
}
|
||||
|
||||
public static function findByName($name)
|
||||
{
|
||||
return GoogleDriveFile::where('name','=',$name)->get()->first();
|
||||
}
|
||||
|
||||
public static function findByPath($path)
|
||||
{
|
||||
return GoogleDriveFile::where('path','=',$path)->get()->first();
|
||||
}
|
||||
|
||||
public static function findByPathInDrive($path,$current_directory = '/')
|
||||
{
|
||||
if ($path != "")
|
||||
{
|
||||
$exploded_path = explode('/',$path);
|
||||
if ($exploded_path[0] == "")
|
||||
{
|
||||
array_splice($exploded_path,0,1);
|
||||
}
|
||||
$contents = collect(Storage::cloud()->listContents($current_directory, false));
|
||||
|
||||
$dir = $contents->where('type', '=', 'dir')
|
||||
->where('name', '=', $exploded_path[0])
|
||||
->first();
|
||||
|
||||
if ( ! $dir)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
array_splice($exploded_path,0,1);
|
||||
$newPath = implode('/',$exploded_path);
|
||||
if ($newPath == "")
|
||||
{
|
||||
return $dir['basename'];
|
||||
}
|
||||
else
|
||||
{
|
||||
return GoogleDriveFile::findByPathInDrive($newPath,$dir['basename']);
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function createByPathInDrive($path,$current_directory = '/')
|
||||
{
|
||||
if ($path != "")
|
||||
{
|
||||
$exploded_path = explode('/',$path);
|
||||
$size = count($exploded_path);
|
||||
if ($size > 1)
|
||||
{
|
||||
$parent = self::findByName($exploded_path[$size-2]);
|
||||
\Storage::cloud()->createDir($parent->id.'/'.$exploded_path[$size-1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
\Storage::cloud()->createDir('/'.$exploded_path[$size-1]);
|
||||
}
|
||||
return self::findByPathInDrive($path);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function setPermission($subject, $value)
|
||||
{
|
||||
$explodedSubject = explode('.',$subject);
|
||||
$subject = $explodedSubject[0];
|
||||
$id = $explodedSubject[1];
|
||||
|
||||
$permission = null;
|
||||
if ($subject == 'rank')
|
||||
{
|
||||
$permission = $this->rank_permission;
|
||||
}
|
||||
elseif ($subject == 'job')
|
||||
{
|
||||
$permission = $this->job_permission;
|
||||
}
|
||||
elseif ($subject == 'user')
|
||||
{
|
||||
$permission = $this->user_permission;
|
||||
}
|
||||
|
||||
[$id] = $value;
|
||||
|
||||
if ($subject == 'rank')
|
||||
{
|
||||
$this->rank_permission = $permission;
|
||||
}
|
||||
elseif ($subject == 'job')
|
||||
{
|
||||
$this->job_permission = $permission;
|
||||
}
|
||||
elseif ($subject == 'user')
|
||||
{
|
||||
$this->user_permission = $permission;
|
||||
}
|
||||
$this->save();
|
||||
}
|
||||
|
||||
public function getAllPermission($subject)
|
||||
{
|
||||
$permission = null;
|
||||
if ($subject == 'rank')
|
||||
{
|
||||
$permission = $this->rank_permission;
|
||||
}
|
||||
elseif ($subject == 'job')
|
||||
{
|
||||
$permission = $this->job_permission;
|
||||
}
|
||||
elseif ($subject == 'user')
|
||||
{
|
||||
$permission = $this->user_permission;
|
||||
}
|
||||
|
||||
return $permission;
|
||||
}
|
||||
|
||||
public function getPermission($subject)
|
||||
{
|
||||
$explodedSubject = explode('.',$subject);
|
||||
$subject = $explodedSubject[0];
|
||||
$id = $explodedSubject[1];
|
||||
|
||||
if (isset($this->getAllPermission($subject)[$id]))
|
||||
{
|
||||
return $this->getAllPermission($subject)[$id];
|
||||
}
|
||||
else
|
||||
{
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
public function canUser($user, $permission = 'r')
|
||||
{
|
||||
if (strpos($this->getPermission('rank.0'),$permission) !== false)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (strpos($this->getPermission('user.'.$user->id),$permission) === false)
|
||||
{
|
||||
if (strpos($this->getPermission('job.'.$user->job->id),$permission) === false)
|
||||
{
|
||||
if (strpos($this->getPermission('rank.'.$user->rank->id),$permission) === false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function canAuthUser($perm = 'r')
|
||||
{
|
||||
return $this->canUser(\Auth::user(),$perm);
|
||||
}
|
||||
|
||||
public static function getPermForUser($folder,$user,$perm = 'r')
|
||||
{
|
||||
$dir = \App\GoogleDriveFile::find($folder);
|
||||
if ($dir == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return $dir->canUser($user,$perm);
|
||||
}
|
||||
}
|
||||
|
||||
public static function getPermForAuthUser($folder,$perm = 'r')
|
||||
{
|
||||
return self::getPermForUser($folder,\Auth::user(),$perm);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\GoogleDriveFile;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Psy\Util\Str;
|
||||
@@ -245,9 +246,6 @@ class GoogleDriveController extends Controller
|
||||
$contents = collect(Storage::cloud()->listContents($folder, $recursive));
|
||||
}
|
||||
|
||||
//dd($contents);
|
||||
//$meta = collect(Storage::cloud()->listContents($folder, true));
|
||||
//dd($meta);
|
||||
return view('admin.files.Google Drive.explorer',['directories' => $contents->where('type', '=', 'dir')->sortByDesc('name'), 'files' => $contents->where('type', '=', 'file'), 'currentDir' => $folder]);
|
||||
}
|
||||
|
||||
@@ -256,7 +254,7 @@ class GoogleDriveController extends Controller
|
||||
$error = [];
|
||||
if(\App\Config::getData('is_Google_Drive_enabled') == "true")
|
||||
{
|
||||
if ($this->checkConfig())
|
||||
if (GoogleDriveFile::checkConfig())
|
||||
{
|
||||
$structure = $this->getFileStructure();
|
||||
$this->checkStructure($structure,'/','/',$error);
|
||||
@@ -273,61 +271,135 @@ class GoogleDriveController extends Controller
|
||||
return $error;
|
||||
}
|
||||
|
||||
public function checkStructure($structure,$parent,$id,&$error)
|
||||
public function checkStructure()
|
||||
{
|
||||
$mydir = $this->listLockDirectory($id);
|
||||
$structure = $this->getFileStructure();
|
||||
|
||||
foreach ($structure as $key => $value)
|
||||
foreach ($structure as $directory => $value)
|
||||
{
|
||||
$found = false;
|
||||
$newDirID = null;
|
||||
$p = null;
|
||||
foreach ($mydir as $dir)
|
||||
$basename = GoogleDriveFile::findByPathInDrive($directory);
|
||||
if ($basename == false)
|
||||
{
|
||||
$p = $dir['basename'];
|
||||
if ($dir['extension'] == $key)
|
||||
$basename = GoogleDriveFile::createByPathInDrive($directory);
|
||||
}
|
||||
|
||||
$googleDriveFile = GoogleDriveFile::findByPath($directory);
|
||||
if ($googleDriveFile == null)
|
||||
{
|
||||
$googleDriveFile = new GoogleDriveFile();
|
||||
$googleDriveFile->id = $basename;
|
||||
$googleDriveFile->type = 'directory';
|
||||
$googleDriveFile->rank_permission = $value['rank'];
|
||||
$googleDriveFile->job_permission = [];
|
||||
$googleDriveFile->user_permission = [];
|
||||
$googleDriveFile->path = $directory;
|
||||
$name = explode('/',$directory);
|
||||
$googleDriveFile->name = $name[count($name)-1];
|
||||
$googleDriveFile->save();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ($googleDriveFile->id != $basename)
|
||||
{
|
||||
$found = true;
|
||||
$newDirID = $dir['basename'];
|
||||
break;
|
||||
$googleDriveFile->id = $basename;
|
||||
$googleDriveFile->save();
|
||||
}
|
||||
}
|
||||
if (!$found)
|
||||
{
|
||||
array_push($error,'Dossier 🔒.'.$key.' manquant... Le dossier a été créer');
|
||||
\Storage::cloud()->createDir($parent.'/🔒.'.$key);
|
||||
$tempdir = $this->listLockDirectory($parent);
|
||||
$p = $tempdir->where('extension','=',$key)->first()['basename'];
|
||||
}
|
||||
if ($value != [])
|
||||
{
|
||||
$this->checkStructure($value,$p,$newDirID,$error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function editPermission($folder)
|
||||
{
|
||||
$f = GoogleDriveFile::find($folder);
|
||||
if ($f == null)
|
||||
{
|
||||
$metadata = \Storage::cloud()->getMetadata($folder);
|
||||
$f = new GoogleDriveFile();
|
||||
$f->id = $folder;
|
||||
$f->type = 'directory';
|
||||
$f->name = $metadata['name'];
|
||||
$f->rank_permission = [1 => 'rwp'];
|
||||
$f->job_permission = [];
|
||||
$f->user_permission = [];
|
||||
$f->path = $this->recreatePath($folder);
|
||||
$f->save();
|
||||
}
|
||||
return view('admin.files.Google Drive.permission',['dir' => $f]);
|
||||
}
|
||||
|
||||
public function getFileStructure()
|
||||
{
|
||||
return collect([
|
||||
'Privé' => [
|
||||
'Cadet' => [],
|
||||
'ETAMAS' => [],
|
||||
'Officier' => [],
|
||||
'Staff' => [
|
||||
'Guide' => []
|
||||
]
|
||||
'🔒.Privé' => [
|
||||
'rank' => [1 => 'rwp'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'Publique' => [
|
||||
'Fichier' => [],
|
||||
'Image' => []
|
||||
'🔒.Privé/🔒.Cadet' => [
|
||||
'rank' => [1 => 'rwp'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'🔒.Privé/🔒.ETAMAS' => [
|
||||
'rank' => [1 => 'rwp'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'🔒.Privé/🔒.Officier' => [
|
||||
'rank' => [1 => 'rwp'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'🔒.Privé/🔒.Staff' => [
|
||||
'rank' => [1 => 'rwp'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'🔒.Privé/🔒.Staff/🔒.Guide' => [
|
||||
'rank' => [1 => 'rwp'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'🔒.Publique' => [
|
||||
'rank' => [1 => 'rwp',0 => 'r'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'🔒.Publique/🔒.Fichier' => [
|
||||
'rank' => [1 => 'rwp',0 => 'r'],
|
||||
'job' => [],
|
||||
'user' => []
|
||||
],
|
||||
'🔒.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' => []
|
||||
],
|
||||
'Système' => [
|
||||
'Fichier' => [],
|
||||
'Image' => [
|
||||
'Nouvelle' => [],
|
||||
'Profil' => []
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -340,24 +412,70 @@ class GoogleDriveController extends Controller
|
||||
return $dir;
|
||||
}
|
||||
|
||||
public function checkConfig()
|
||||
public function recreatePath($folder)
|
||||
{
|
||||
$configNull = (\Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_ID')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_CLIENT_SECRET')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_REFRESH_TOKEN')) != "" && \Crypt::decryptString(\App\Config::getData('GOOGLE_DRIVE_FOLDER_ID')) != "");
|
||||
$configOk = true;
|
||||
|
||||
if ($configNull)
|
||||
$path = [];
|
||||
$name = [];
|
||||
$directories = collect(json_decode($this->getPathArray(),true));
|
||||
foreach ($directories as $dir)
|
||||
{
|
||||
try {
|
||||
$contents = collect(Storage::cloud()->listContents("/", false));
|
||||
}
|
||||
catch (\Exception $e)
|
||||
$path[$dir['basename']] = $dir['dirname'];
|
||||
$name[$dir['basename']] = $dir['name'];
|
||||
}
|
||||
$realPath = $name[$folder];
|
||||
$foo = $folder;
|
||||
while ($foo != "")
|
||||
{
|
||||
$bar = explode('/',$path[$foo]);
|
||||
$foo = $bar[count($bar)-1];
|
||||
if ($foo != "")
|
||||
{
|
||||
$configOk = false;
|
||||
$realPath = $name[$foo].'/'.$realPath;
|
||||
}
|
||||
}
|
||||
return $realPath;
|
||||
}
|
||||
|
||||
return $configNull && $configOk;
|
||||
public function editPermissionModal($folder,$subject,$id)
|
||||
{
|
||||
$dir = GoogleDriveFile::find($folder);
|
||||
$foo = null;
|
||||
$perm = null;
|
||||
if ($subject == 'rank')
|
||||
{
|
||||
if ($id == 0)
|
||||
{
|
||||
$foo = new \App\Rank();
|
||||
$foo->name = "Utilisateur non authentifié";
|
||||
$foo->id = 0;
|
||||
if (isset($dir->rank_permission[$id]))
|
||||
{
|
||||
$perm = $dir->rank_permission[$id];
|
||||
}
|
||||
else
|
||||
{
|
||||
$perm = "";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$foo = \App\Rank::find($id);
|
||||
$perm = $dir->rank_permission[$id];
|
||||
}
|
||||
}
|
||||
elseif ($subject == 'job')
|
||||
{
|
||||
$foo = \App\Job::find($id);
|
||||
$perm = $dir->job_permission[$id];
|
||||
}
|
||||
else
|
||||
{
|
||||
$foo = \App\User::find($id);
|
||||
$perm = $dir->user_permission[$id];
|
||||
}
|
||||
return view('admin.files.Google Drive.permission.edit',['folder' => $dir,'subject' => $foo,'perm' => $perm,'s' => $subject]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -62,5 +62,6 @@ class Kernel extends HttpKernel
|
||||
'staff' => \App\Http\Middleware\AccesStaff::class,
|
||||
'admin' => \App\Http\Middleware\AccesAdmin::class,
|
||||
'perm' => \App\Http\Middleware\CheckPerm::class,
|
||||
'fileperm' => \App\Http\Middleware\CheckFilePerm::class,
|
||||
];
|
||||
}
|
||||
|
||||
62
app/Http/Middleware/CheckFilePerm.php
Normal file
62
app/Http/Middleware/CheckFilePerm.php
Normal file
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use \App\GoogleDriveFile;
|
||||
use \App\Config;
|
||||
|
||||
class CheckFilePerm
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, Closure $next,$type,$permission = 'r')
|
||||
{
|
||||
if (GoogleDriveFile::checkConfig() && Config::getData('is_Google_Drive_enabled') == 'true')
|
||||
{
|
||||
if ($type == 'file')
|
||||
{
|
||||
$dir = GoogleDriveFile::find($request->d);
|
||||
if ($dir != null)
|
||||
{
|
||||
if (\Auth::check())
|
||||
{
|
||||
if ($dir->canUser(\Auth::user(),$permission) == false)
|
||||
{
|
||||
clog('navigate','danger','Vous n\'avez pas la permission d\'accéder a ce fichier',\Auth::user()->id);
|
||||
return redirect('/admin')->with('error','Vous n\'avez pas la permission d\'accéder a ce fichier');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (strpos($dir->getPermission('rank.0'),$permission) === false)
|
||||
{
|
||||
clog('navigate','danger','Un utilisateur non authentifié a tenter de télécharger un fichier privé','0');
|
||||
abort(401,'Vous n\'avez pas la permission d\'accéder a ce fichier');
|
||||
}
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
if (\Auth::check())
|
||||
{
|
||||
if (\Auth::user()->permission('config_edit'))
|
||||
{
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
abort(401,'Vous n\'avez pas la permission d\'accéder a ce fichier');
|
||||
}
|
||||
abort(500);
|
||||
}
|
||||
else
|
||||
{
|
||||
clog('navigate','danger','Google Drive n\'est pas activé ou les identifiants sont incorrect',\Auth::user()->id);
|
||||
return redirect('/admin')->with('error','Google Drive n\'est pas activé ou les identifiants sont incorrect');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -48,6 +48,7 @@ function clog(string $type,string $result,string $event,$user_id = null,$obj_typ
|
||||
$log->user_id = \Auth::User()->id;
|
||||
}
|
||||
|
||||
|
||||
if ($obj_type != null)
|
||||
{
|
||||
$log->logable_type = $obj_type;
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
"php": "^7.2",
|
||||
"barryvdh/laravel-dompdf": "^0.8.4",
|
||||
"barryvdh/laravel-ide-helper": "v2.6.6",
|
||||
"davejamesmiller/laravel-breadcrumbs": "5.3.1",
|
||||
"fideloper/proxy": "^4.0",
|
||||
"guzzlehttp/guzzle": "^6.3",
|
||||
"laravel/framework": "^6.0",
|
||||
|
||||
105
composer.lock
generated
105
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "57f87b1252c823a7d2a41bf3f850e726",
|
||||
"content-hash": "1f2a06232956fd23a3faa4bba05f8f95",
|
||||
"packages": [
|
||||
{
|
||||
"name": "barryvdh/laravel-dompdf",
|
||||
@@ -483,6 +483,65 @@
|
||||
],
|
||||
"time": "2020-03-01T12:26:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "davejamesmiller/laravel-breadcrumbs",
|
||||
"version": "5.3.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/davejamesmiller/laravel-breadcrumbs.git",
|
||||
"reference": "40a73bc9b32fbbee18938dc92228dea161365245"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/davejamesmiller/laravel-breadcrumbs/zipball/40a73bc9b32fbbee18938dc92228dea161365245",
|
||||
"reference": "40a73bc9b32fbbee18938dc92228dea161365245",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"facade/ignition-contracts": "^1.0",
|
||||
"illuminate/support": "^5.6|^6.0",
|
||||
"illuminate/view": "^5.6|^6.0",
|
||||
"php": ">=7.1.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"orchestra/testbench": "^3.6",
|
||||
"php-coveralls/php-coveralls": "^1.0",
|
||||
"phpunit/phpunit": "^7.0|^8.0",
|
||||
"spatie/phpunit-snapshot-assertions": "^2.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"DaveJamesMiller\\Breadcrumbs\\BreadcrumbsServiceProvider"
|
||||
],
|
||||
"aliases": {
|
||||
"Breadcrumbs": "DaveJamesMiller\\Breadcrumbs\\Facades\\Breadcrumbs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"DaveJamesMiller\\Breadcrumbs\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Dave James Miller",
|
||||
"email": "dave@davejamesmiller.com"
|
||||
}
|
||||
],
|
||||
"description": "A simple Laravel-style way to create breadcrumbs.",
|
||||
"homepage": "https://github.com/davejamesmiller/laravel-breadcrumbs",
|
||||
"keywords": [
|
||||
"laravel"
|
||||
],
|
||||
"time": "2019-10-20T18:25:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "dnoegel/php-xdg-base-dir",
|
||||
"version": "v0.1.1",
|
||||
@@ -1073,6 +1132,50 @@
|
||||
],
|
||||
"time": "2020-02-13T22:36:52+00:00"
|
||||
},
|
||||
{
|
||||
"name": "facade/ignition-contracts",
|
||||
"version": "1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/facade/ignition-contracts.git",
|
||||
"reference": "f445db0fb86f48e205787b2592840dd9c80ded28"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28",
|
||||
"reference": "f445db0fb86f48e205787b2592840dd9c80ded28",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Facade\\IgnitionContracts\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Freek Van der Herten",
|
||||
"email": "freek@spatie.be",
|
||||
"homepage": "https://flareapp.io",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Solution contracts for Ignition",
|
||||
"homepage": "https://github.com/facade/ignition-contracts",
|
||||
"keywords": [
|
||||
"contracts",
|
||||
"flare",
|
||||
"ignition"
|
||||
],
|
||||
"time": "2019-08-30T14:06:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fideloper/proxy",
|
||||
"version": "4.3.0",
|
||||
|
||||
75
config/breadcrumbs.php
Normal file
75
config/breadcrumbs.php
Normal file
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| View Name
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Choose a view to display when Breadcrumbs::render() is called.
|
||||
| Built in templates are:
|
||||
|
|
||||
| - 'breadcrumbs::bootstrap4' - Bootstrap 4
|
||||
| - 'breadcrumbs::bootstrap3' - Bootstrap 3
|
||||
| - 'breadcrumbs::bootstrap2' - Bootstrap 2
|
||||
| - 'breadcrumbs::bulma' - Bulma
|
||||
| - 'breadcrumbs::foundation6' - Foundation 6
|
||||
| - 'breadcrumbs::materialize' - Materialize
|
||||
| - 'breadcrumbs::uikit' - UIkit
|
||||
| - 'breadcrumbs::json-ld' - JSON-LD Structured Data
|
||||
|
|
||||
| Or a custom view, e.g. '_partials/breadcrumbs'.
|
||||
|
|
||||
*/
|
||||
|
||||
'view' => 'breadcrumbs::bootstrap4',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Breadcrumbs File(s)
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The file(s) where breadcrumbs are defined. e.g.
|
||||
|
|
||||
| - base_path('routes/breadcrumbs.php')
|
||||
| - glob(base_path('breadcrumbs/*.php'))
|
||||
|
|
||||
*/
|
||||
|
||||
'files' => base_path('routes/breadcrumbs.php'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Exceptions
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Determine when to throw an exception.
|
||||
|
|
||||
*/
|
||||
|
||||
// When route-bound breadcrumbs are used but the current route doesn't have a name (UnnamedRouteException)
|
||||
'unnamed-route-exception' => false,
|
||||
|
||||
// When route-bound breadcrumbs are used and the matching breadcrumb doesn't exist (InvalidBreadcrumbException)
|
||||
'missing-route-bound-breadcrumb-exception' => false,
|
||||
|
||||
// When a named breadcrumb is used but doesn't exist (InvalidBreadcrumbException)
|
||||
'invalid-named-breadcrumb-exception' => true,
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Classes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Subclass the default classes for more advanced customisations.
|
||||
|
|
||||
*/
|
||||
|
||||
// Manager
|
||||
'manager-class' => DaveJamesMiller\Breadcrumbs\BreadcrumbsManager::class,
|
||||
|
||||
// Generator
|
||||
'generator-class' => DaveJamesMiller\Breadcrumbs\BreadcrumbsGenerator::class,
|
||||
|
||||
];
|
||||
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateGoogleDriveFileTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('google_drive_files', function (Blueprint $table) {
|
||||
$table->string('id');
|
||||
$table->index('id');
|
||||
$table->string('type');
|
||||
$table->string('name');
|
||||
$table->string('path')->default('');
|
||||
$table->string('rank_permission');
|
||||
$table->string('job_permission');
|
||||
$table->string('user_permission');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('google_drive_file');
|
||||
}
|
||||
}
|
||||
19
public/css/custom.css
vendored
19
public/css/custom.css
vendored
@@ -57,6 +57,10 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.no-cursor {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.word-wrap {
|
||||
white-space: normal;
|
||||
word-break: break-word;
|
||||
@@ -140,7 +144,7 @@
|
||||
top: 36px;
|
||||
left: 36px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
height: 0;progress-bar
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
@@ -1816,3 +1820,16 @@ td{
|
||||
h2 {
|
||||
text-transform: capitalize !important;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
margin: auto;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-wrapper {
|
||||
max-width: 75%;
|
||||
}
|
||||
.progress-bar-top {
|
||||
margin-bottom: -4px;
|
||||
border-radius: 6px 6px 0px 0px;
|
||||
}
|
||||
BIN
public/images/C-CMS.png
Normal file
BIN
public/images/C-CMS.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 28 KiB |
BIN
public/images/C-CMS_G.png
Normal file
BIN
public/images/C-CMS_G.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 38 KiB |
77
public/js/plugins/drive-explorer.js
vendored
77
public/js/plugins/drive-explorer.js
vendored
@@ -1,8 +1,9 @@
|
||||
var folderHistory = [];
|
||||
var folderHistory = false;
|
||||
var path = '';
|
||||
var currentFolder = '';
|
||||
var folderGoBack = [];
|
||||
|
||||
var permissionModalHtml = null;
|
||||
var progressBar = 0;
|
||||
function init(folder)
|
||||
{
|
||||
loadFolder(folder);
|
||||
@@ -10,18 +11,32 @@ function init(folder)
|
||||
}
|
||||
|
||||
function loadHistory() {
|
||||
updateProgressBar(progressBar+5);
|
||||
let btnBack = $('#backbtn');
|
||||
btnBack.prop('disabled','true');
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: '/api/drive/patharray?api_token=' + api_token,
|
||||
success: function (rawpath) {
|
||||
updateProgressBar(progressBar+30);
|
||||
var path = JSON.parse(rawpath);
|
||||
Object.keys(path).forEach(function (item) {
|
||||
var dir = path[item].dirname.split('/');
|
||||
folderGoBack[path[item].basename] = dir[dir.length - 1];
|
||||
});
|
||||
folderHistory = true;
|
||||
updateProgressBar(progressBar+10);
|
||||
if(!currentFolder == '' || !currentFolder == 'root')
|
||||
{
|
||||
btnBack.removeAttr('disabled');
|
||||
}
|
||||
updateProgressBar(progressBar+5);
|
||||
},
|
||||
error: function () {
|
||||
showNotification('error', 'Impossible de charger la hiérachie des dossiers', 'top', 'center')
|
||||
if (folderHistory)
|
||||
{
|
||||
showNotification('error', 'Impossible de charger la hiérachie des dossiers', 'top', 'center')
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -30,26 +45,35 @@ function loadFolder(folder) {
|
||||
if (folder != undefined)
|
||||
{
|
||||
showLoader();
|
||||
updateProgressBar(progressBar+5);
|
||||
$.ajax({
|
||||
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);
|
||||
updateProgressBar(progressBar+5);
|
||||
hideLoader();
|
||||
|
||||
$('.currentDir').attr('value',folder);
|
||||
|
||||
if(currentFolder == '' || currentFolder == 'root')
|
||||
if (folderHistory)
|
||||
{
|
||||
$('#backbtn').prop('disabled','true');
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#backbtn').removeAttr('disabled');
|
||||
if((currentFolder == '' || currentFolder == 'root'))
|
||||
{
|
||||
$('#backbtn').prop('disabled','true');
|
||||
}
|
||||
else
|
||||
{
|
||||
console.log('wtf');
|
||||
console.log(folderGoBack);
|
||||
$('#backbtn').removeAttr('disabled');
|
||||
}
|
||||
}
|
||||
updateProgressBar(progressBar+10);
|
||||
},
|
||||
error: function () {
|
||||
showNotification('error', 'Impossible de charger le dossier '+folder, 'top', 'center')
|
||||
@@ -123,3 +147,38 @@ function deleteFolder(folder)
|
||||
function refreshFolder() {
|
||||
loadFolder(currentFolder);
|
||||
}
|
||||
|
||||
function editPermission(folder,subject,id)
|
||||
{
|
||||
$('#permissionModal').on('hidden.bs.modal', function (e) {
|
||||
$('#permissionModalHtml').html(permissionModalHtml);
|
||||
});
|
||||
|
||||
$.ajax({
|
||||
type: 'GET',
|
||||
url: '/api/drive/'+folder+'/permission/'+subject+'/'+id+'?api_token=' + api_token,
|
||||
success: function (modal) {
|
||||
permissionModalHtml = $('#permissionModalHtml').html();
|
||||
$('#permissionModalHtml').html(modal);
|
||||
$('#permissionModal').modal('show');
|
||||
},
|
||||
error: function () {
|
||||
showNotification('error', 'Impossible de charger le dossier '+folder, 'top', 'center')
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function updateProgressBar(value)
|
||||
{
|
||||
progressBar = value;
|
||||
let bar = $('#progress-bar');
|
||||
bar.css('width',value+"%");
|
||||
if (progressBar >= 100)
|
||||
{
|
||||
$('.progress').fadeOut(1500);
|
||||
}
|
||||
else
|
||||
{
|
||||
$('.progress').fadeIn(650);
|
||||
}
|
||||
}
|
||||
|
||||
19
resources/custom.css
vendored
19
resources/custom.css
vendored
@@ -57,6 +57,10 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.no-cursor {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.word-wrap {
|
||||
white-space: normal;
|
||||
word-break: break-word;
|
||||
@@ -140,7 +144,7 @@
|
||||
top: 36px;
|
||||
left: 36px;
|
||||
width: 0;
|
||||
height: 0;
|
||||
height: 0;progress-bar
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
@@ -1816,3 +1820,16 @@ td{
|
||||
h2 {
|
||||
text-transform: capitalize !important;
|
||||
}
|
||||
|
||||
.breadcrumb {
|
||||
margin: auto;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.navbar-wrapper {
|
||||
max-width: 75%;
|
||||
}
|
||||
.progress-bar-top {
|
||||
margin-bottom: -4px;
|
||||
border-radius: 6px 6px 0px 0px;
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
<div class="col-md-12">
|
||||
<div class="card">
|
||||
<div class="card-header card-header-primary">
|
||||
<h4>Configuration Générale</h4>
|
||||
<h4>Apparence</h4>
|
||||
</div>
|
||||
<div class="card-body mt-5">
|
||||
<form action="/admin/config/customisation" method="POST">
|
||||
@@ -27,27 +27,6 @@
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('breadcrumb')
|
||||
<div class="breadcrumbs">
|
||||
<div class="col-sm-4">
|
||||
<div class="page-header float-left">
|
||||
<div class="page-title">
|
||||
<h1>Configuration Générale</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/Générale</li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
@section('custom_scripts')
|
||||
<script>
|
||||
function saveChange(pPerm) {
|
||||
|
||||
@@ -1,32 +1,53 @@
|
||||
<table class="table table-hover dt-responsive material-datatables w-100" id="table">
|
||||
<table class="table table-hover table-responsive dt-responsive material-datatables w-100 d-sm-table" id="table">
|
||||
<thead class="thead-dark">
|
||||
<tr>
|
||||
<td class="text-center explorerType"><strong>#</strong></td>
|
||||
<td class="text-left">Nom</td>
|
||||
<td class="text-center">Dernière modification</td>
|
||||
<td></td>
|
||||
<td class="td-actions text-right">
|
||||
@if(\App\GoogleDriveFile::getPermForAuthUser($currentDir,'p'))
|
||||
<div class="dropdown">
|
||||
<div id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-v fa-2x ml-3 text-gray" style="margin-right: .8rem !important;cursor: pointer;margin-top: -10px;margin-bottom: -6px"></i>
|
||||
</div>
|
||||
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
||||
<a class="dropdown-item" href="/admin/drive/{{$currentDir}}/permission">
|
||||
<i class="fas fa-lock mr-2"></i></i>Permission
|
||||
</a>
|
||||
<a class="dropdown-item text-danger" onclick="deleteFolder('{{ $currentDir }}')">
|
||||
<i class="fas fa-trash-alt mr-2"></i>Supprimer
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<i class="fas fa-lock text-danger mr-2" data-toggle="tooltip" data-placement="left" title="Vous n'avez pas les permissions nécessaires pour modifier ce dossier"></i>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($directories as $directory)
|
||||
<tr class="context-menu-one">
|
||||
<td onclick="loadFolder('{{$directory['basename']}}')" style="cursor: pointer;" ><i class="fas fa-folder fa-2x"></i></td>
|
||||
<td onclick="loadFolder('{{$directory['basename']}}')" style="cursor: pointer;" >{{$directory['name']}}</td>
|
||||
<td @if(\App\GoogleDriveFile::getPermForAuthUser($directory['basename'],'r')) onclick="loadFolder('{{$directory['basename']}}')" @endif style="cursor: pointer;" ><i class="fas fa-folder fa-2x"></i></td>
|
||||
<td @if(\App\GoogleDriveFile::getPermForAuthUser($directory['basename'],'r')) onclick="loadFolder('{{$directory['basename']}}')" @endif style="cursor: pointer;" >{{$directory['name']}}</td>
|
||||
<td class="text-center" onclick="loadFolder('{{$directory['basename']}}')" style="cursor: pointer;" ><span data-toggle="tooltip" data-placement="bottom" title="{{date('r',$directory['timestamp'])}}">{{strftime('%e %b %Y',$directory['timestamp'])}}</span></td>
|
||||
<td class="td-actions text-right">
|
||||
@if($directory['filename'] != '🔒')
|
||||
@if(\App\GoogleDriveFile::getPermForAuthUser($directory['basename'],'p'))
|
||||
<div class="dropdown">
|
||||
<div id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||
<i class="fas fa-ellipsis-v fa-2x ml-3 text-gray" style="margin-right: .8rem !important;cursor: pointer;"></i>
|
||||
</div>
|
||||
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
|
||||
<a class="dropdown-item" href="/admin/drive/{{$directory['basename']}}/permission">
|
||||
<i class="fas fa-lock mr-2"></i></i>Permission
|
||||
</a>
|
||||
<a class="dropdown-item text-danger" onclick="deleteFolder('{{ $directory['basename'] }}')">
|
||||
<i class="fas fa-trash-alt mr-2"></i>Supprimer
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<i class="fas fa-lock text-danger mr-2"></i>
|
||||
<i class="fas fa-lock text-danger mr-2" data-toggle="tooltip" data-placement="left" title="Vous n'avez pas les permissions nécessaires pour modifier ce dossier"></i>
|
||||
@endif
|
||||
</td>
|
||||
</tr>
|
||||
@@ -49,7 +70,10 @@
|
||||
<div class="col-md-2">
|
||||
Taille : {{GetSizeName($file['size'])}}
|
||||
</div>
|
||||
<div class="col-md-4 offset-md-4 text-right">
|
||||
<div class="col-md-4">
|
||||
Permission : rw
|
||||
</div>
|
||||
<div class="col-md-4 text-right">
|
||||
<a href="/file/get?f={{urlencode($file['name'])}}&d={{$file['dirname']}}" rel="tooltip" class="btn btn-info">
|
||||
<i class="material-icons">cloud_download</i>
|
||||
</a>
|
||||
@@ -61,6 +85,13 @@
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
@if(count($directories) == 0 && count($files) == 0)
|
||||
<tr>
|
||||
<td colspan="4" class="text-center m-2">
|
||||
Le dossier est vide
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
</tbody>
|
||||
</table>
|
||||
<small class="float-right mr-4">Dernière mise à jour {{date('r')}}</small>
|
||||
|
||||
@@ -2,13 +2,16 @@
|
||||
|
||||
@section('content')
|
||||
<div class="card">
|
||||
<div class="progress progress-bar-top">
|
||||
<div id="progress-bar" class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div>
|
||||
</div>
|
||||
<div class="row ml-3 mr-3 mt-3">
|
||||
<div class="col-1 d-inline-flex">
|
||||
<button id="backbtn" type="button" onclick="goBack()" class="btn btn-secondary" style="border-radius: 50% !important; width: 3.5rem;height: 3.5rem;margin-bottom: -10px;margin-top: -2px"><i class="fas fa-arrow-left fa-2x" aria-hidden="true" style="margin-left: -0.6rem;"></i></button>
|
||||
<button id="backbtn" 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 class="col-sm-1 d-inline-flex">
|
||||
<button id="backbtn" type="button" onclick="goBack()" class="btn btn-secondary" style="border-radius: 50% !important; width: 3.5rem;height: 3.5rem;margin-bottom: -10px;margin-top: -2px" disabled><i class="fas fa-arrow-left fa-2x" aria-hidden="true" style="margin-left: -0.6rem;"></i></button>
|
||||
<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-4 d-flex justify-content-end offset-7">
|
||||
<div class="dropdown mr-2">
|
||||
<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">
|
||||
<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>
|
||||
|
||||
269
resources/views/admin/files/Google Drive/permission.blade.php
Normal file
269
resources/views/admin/files/Google Drive/permission.blade.php
Normal file
@@ -0,0 +1,269 @@
|
||||
@extends('layouts.admin.main')
|
||||
|
||||
@section('content')
|
||||
<div class="col-md-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h4 class="card-title">Permission du dossier: {{$dir->name}}</h4>
|
||||
<p class="category">/{{$dir->path}}</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5>Permission des grades</h5>
|
||||
<table class="table table-striped w-100">
|
||||
<thead class="table-dark">
|
||||
<tr class="text-center">
|
||||
<td class="text-left" style="width: 25%">Grade</td>
|
||||
<td >Lecture</td>
|
||||
<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">
|
||||
<i class="material-icons">add</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="text-center">
|
||||
<td class="text-left">
|
||||
Utilisateur non authentifié
|
||||
</td>
|
||||
<td>
|
||||
@if(isset($dir->rank_permission[0]))
|
||||
@if(strpos($dir->rank_permission[0],'r') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(isset($dir->rank_permission[0]))
|
||||
@if(strpos($dir->rank_permission[0],'w') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(isset($dir->rank_permission[0]))
|
||||
@if(strpos($dir->rank_permission[0],'p') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<button class="btn btn-primary btn-fab btn-fab-mini btn-round" onclick="editPermission('{{$dir->id}}','rank','0')">
|
||||
<i class="material-icons">edit</i>
|
||||
</button>
|
||||
<button class="btn btn-danger btn-fab btn-fab-mini btn-round no-cursor" disabled data-toggle="tooltip" data-placement="bottom" title="Vous ne pouvez pas supprimer les permissions des utilisteurs non authentifié">
|
||||
<i class="material-icons">delete</i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
@foreach($dir->rank_permission as $key => $rank)
|
||||
@if($key != 0)
|
||||
<tr class="text-center">
|
||||
<td class="text-left">
|
||||
{{\App\Rank::find($key)->name}}
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'r') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'w') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'p') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<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">
|
||||
<i class="material-icons">delete</i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
<h5 class="mt-5">Permission des postes</h5>
|
||||
<table class="table table-striped w-100">
|
||||
<thead class="table-dark">
|
||||
<tr class="text-center">
|
||||
<td class="text-left" style="width: 25%">Poste</td>
|
||||
<td >Lecture</td>
|
||||
<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">
|
||||
<i class="material-icons">add</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if(count($dir->job_permission) < 1)
|
||||
<tr>
|
||||
<td colspan="5" class="text-center">
|
||||
Aucune permission de poste
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
@foreach($dir->job_permission as $key => $rank)
|
||||
<tr class="text-center">
|
||||
<td class="text-left">
|
||||
{{\App\Job::find($key)->name}}
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'r') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'w') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'p') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<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">
|
||||
<i class="material-icons">delete</i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
<h5 class="mt-5">Permission des utilisateurs</h5>
|
||||
<table class="table table-striped w-100">
|
||||
<thead class="table-dark">
|
||||
<tr class="text-center">
|
||||
<td class="text-left" style="width: 25%">Utilisateurs</td>
|
||||
<td >Lecture</td>
|
||||
<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">
|
||||
<i class="material-icons">add</i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@if(count($dir->user_permission) < 1)
|
||||
<tr>
|
||||
<td colspan="5" class="text-center">
|
||||
Aucune permission d'utilisateur
|
||||
</td>
|
||||
</tr>
|
||||
@endif
|
||||
@foreach($dir->user_permission as $key => $rank)
|
||||
<tr class="text-center">
|
||||
<td class="text-left">
|
||||
{{\App\User::find($key)->fullname()}}
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'r') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'w') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if(strpos($rank,'p') !== false)
|
||||
<i class="fas fa-check-circle fa-2x text-success"></i>
|
||||
@else
|
||||
<i class="fas fa-times-circle fa-2x text-danger"></i>
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<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">
|
||||
<i class="material-icons">delete</i>
|
||||
</button>
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<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">
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content" id="permissionModalHtml">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">Chargement ...</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
@loaderDot
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary" disabled>Sauvegarder</button>
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Annuler</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</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>
|
||||
<script src="/js/plugins/drive-explorer.js"></script>
|
||||
@endsection
|
||||
@@ -0,0 +1,70 @@
|
||||
<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">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<form action="/admin/drive/{{$folder->id}}/permission/{{$s}}/{{$subject->id}}" method="post">
|
||||
@csrf
|
||||
@method('patch')
|
||||
<div class="modal-body">
|
||||
<div class="row">
|
||||
<div class="col-md-3">
|
||||
@switch($s)
|
||||
@case('rank')
|
||||
Grade : {{$subject->name}}
|
||||
@break
|
||||
@case('job')
|
||||
Poste : {{$subject->name}}
|
||||
@break
|
||||
@case('user')
|
||||
Utilisateur : {{$subject->fullname()}}
|
||||
@break
|
||||
@endswitch
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="togglebutton row">
|
||||
<div class="col-3">
|
||||
<label>
|
||||
<input type="checkbox" @if(strpos($perm,'r') !== false) checked @endif>
|
||||
<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 type="checkbox" @if(strpos($perm,'w') !== false) checked @endif>
|
||||
<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 type="checkbox" @if(strpos($perm,'p') !== false) checked @endif>
|
||||
<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>
|
||||
</form>
|
||||
@@ -60,7 +60,7 @@
|
||||
<td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_rendement}}</td>
|
||||
<td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_competence}}</td>
|
||||
<td>
|
||||
<a href="/admin/ocom/edit/{{$ocom->id}}" class="btn btn-primary btn-fab btn-fab-mini btn-round">
|
||||
<a href="/admin/ocom/{{$ocom->id}}/edit" class="btn btn-primary btn-fab btn-fab-mini btn-round">
|
||||
<i class="material-icons">edit</i>
|
||||
</a>
|
||||
<button class="btn btn-danger btn-fab btn-fab-mini btn-round" onclick="deleteOCOM({{$ocom->id}})">
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<p>{{$ocom->objectif_rendement}}</p>
|
||||
</div>
|
||||
<div class="col-md-8 text-right">
|
||||
<a href="/admin/ocom/edit/{{$ocom->id}}" class="btn btn-warning">Modifier</a>
|
||||
<a href="/admin/ocom/{{$ocom->id}}/edit" class="btn btn-warning">Modifier</a>
|
||||
<button type="button" class="btn btn-danger" onclick="deleteOCOM('{{$ocom->id}}')">Supprimer</button>
|
||||
</div>
|
||||
<div class="col-12">
|
||||
|
||||
@@ -65,10 +65,10 @@
|
||||
<span class="fileinput-filename"></span>
|
||||
</div>
|
||||
<span class="input-group-append">
|
||||
<span class="input-group-text fileinput-exists" data-dismiss="fileinput">Remove</span>
|
||||
<span class="input-group-text fileinput-exists cursor" data-dismiss="fileinput">Remove</span>
|
||||
<span class="input-group-text btn-file">
|
||||
<span class="fileinput-new">Select file</span>
|
||||
<span class="fileinput-exists">Change</span>
|
||||
<span class="fileinput-new cursor">Select file</span>
|
||||
<span class="fileinput-exists cursor">Change</span>
|
||||
<input type="file" name="file_msg" multiple>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
@@ -2,6 +2,109 @@
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-md-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<div class="row">
|
||||
<div class="col-sm-6">
|
||||
<h3 class="card-title">3.2.5</h3>
|
||||
<p class="category">2019-10-19</p>
|
||||
</div>
|
||||
<div class="col-sm-6 text-right">
|
||||
<span class="badge badge-pill badge-success">STABLE</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<p>
|
||||
Nouveauté
|
||||
<ul class="list-group list-group-flush ml-3">
|
||||
<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'un breadcrumb
|
||||
</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 la base de donnée des 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-coffee"></i>
|
||||
</div>
|
||||
<div class="col m-auto text-left">
|
||||
Mise à jour des pages d'erreurs
|
||||
</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 l'horaire vers la version 3
|
||||
</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 du système de fichier vers Google Drive
|
||||
</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 du système de permission
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p>
|
||||
Bug
|
||||
<ul class="list-group list-group-flush ml-3">
|
||||
<li class="list-group-item">
|
||||
<div class="row">
|
||||
<div class="text-success" style="font-size: 1.3rem;width: 1.5rem">
|
||||
<i class="fas fa-bug"></i>
|
||||
</div>
|
||||
<div class="col m-auto text-left">
|
||||
Correction de multiples bugs</a>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
|
||||
@@ -1,90 +1,9 @@
|
||||
<html lang="en"><head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
@extends('errors.layout')
|
||||
|
||||
<title>Error</title>
|
||||
|
||||
<!-- Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css">
|
||||
|
||||
<!-- Styles -->
|
||||
<style>
|
||||
html, body {
|
||||
background-color: #fff;
|
||||
color: #636b6f;
|
||||
font-family: 'Raleway', sans-serif;
|
||||
font-weight: 100;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.full-height {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.flex-center {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.position-ref {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.content {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 36px;
|
||||
padding: 20px;
|
||||
}
|
||||
.loader{
|
||||
text-align: center;
|
||||
}
|
||||
.loader-bg{
|
||||
width: 70px;
|
||||
margin-top: 50px;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.loader-spinner {
|
||||
position: relative;
|
||||
border: 16px solid #f3f3f3;
|
||||
border-top: 16px solid #272c33;
|
||||
border-radius: 50%;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
animation: spin 2s linear infinite;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: -163px;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex-center position-ref full-height">
|
||||
<div class="content">
|
||||
<div class="title">
|
||||
<h1 class="glitch" data-text="500" style="font-size: 20rem;margin:0px;">401</h1>
|
||||
</div>
|
||||
<div class="loader">
|
||||
<img class="loader-bg" src="/images/leaf_of_canada.png"></img>
|
||||
<div class="loader-spinner"></div>
|
||||
</div>
|
||||
<div class="title">
|
||||
Oups ... Vous n'avez pas l'autorisation de venir ici {{ $exception->getMessage() }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</body></html>
|
||||
@section('title', __('Non autorisé'))
|
||||
@section('code')
|
||||
<span>4</span><span>0</span><span>1</span>
|
||||
@endsection
|
||||
@section('message', 'Nous sommes désolé, vous n\'avez pas l\'autorisation d\'être ici.')
|
||||
@section('error',$exception->getMessage())
|
||||
@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/401')
|
||||
|
||||
9
resources/views/errors/403.blade.php
Normal file
9
resources/views/errors/403.blade.php
Normal file
@@ -0,0 +1,9 @@
|
||||
@extends('errors.layout')
|
||||
|
||||
@section('title', __('Accès refusé'))
|
||||
@section('code')
|
||||
<span>4</span><span>0</span><span>3</span>
|
||||
@endsection
|
||||
@section('message', 'Nous sommes désolé, le serveur a compris la requête, mais refuse de l\'exécuter.')
|
||||
@section('error',$exception->getMessage())
|
||||
@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/403')
|
||||
@@ -1,90 +1,9 @@
|
||||
<html lang="en"><head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
@extends('errors.layout')
|
||||
|
||||
<title>Error</title>
|
||||
|
||||
<!-- Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css">
|
||||
|
||||
<!-- Styles -->
|
||||
<style>
|
||||
html, body {
|
||||
background-color: #fff;
|
||||
color: #636b6f;
|
||||
font-family: 'Raleway', sans-serif;
|
||||
font-weight: 100;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.full-height {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.flex-center {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.position-ref {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.content {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 36px;
|
||||
padding: 20px;
|
||||
}
|
||||
.loader{
|
||||
text-align: center;
|
||||
}
|
||||
.loader-bg{
|
||||
width: 70px;
|
||||
margin-top: 50px;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.loader-spinner {
|
||||
position: relative;
|
||||
border: 16px solid #f3f3f3;
|
||||
border-top: 16px solid #272c33;
|
||||
border-radius: 50%;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
animation: spin 2s linear infinite;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: -163px;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex-center position-ref full-height">
|
||||
<div class="content">
|
||||
<div class="title">
|
||||
<h1 class="glitch" data-text="500" style="font-size: 20rem;margin:0px;">404</h1>
|
||||
</div>
|
||||
<div class="loader">
|
||||
<img class="loader-bg" src="/images/leaf_of_canada.png"></img>
|
||||
<div class="loader-spinner"></div>
|
||||
</div>
|
||||
<div class="title">
|
||||
Oups ... Il n'y a malheureusement rien là {{ $exception->getMessage() }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</body></html>
|
||||
@section('title', __('Page introuvable'))
|
||||
@section('code')
|
||||
<span>4</span><span>0</span><span>4</span>
|
||||
@endsection
|
||||
@section('message', 'Nous sommes désolé, la page demandée ne semble pas exister.')
|
||||
@section('error',$exception->getMessage())
|
||||
@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/404')
|
||||
|
||||
9
resources/views/errors/419.blade.php
Normal file
9
resources/views/errors/419.blade.php
Normal file
@@ -0,0 +1,9 @@
|
||||
@extends('errors.layout')
|
||||
|
||||
@section('title', __('Page expiré'))
|
||||
@section('code')
|
||||
<span>4</span><span>1</span><span>9</span>
|
||||
@endsection
|
||||
@section('message', 'Nous sommes désolé, la page a expiré.')
|
||||
@section('error',$exception->getMessage())
|
||||
@section('url','')
|
||||
9
resources/views/errors/429.blade.php
Normal file
9
resources/views/errors/429.blade.php
Normal file
@@ -0,0 +1,9 @@
|
||||
@extends('errors.layout')
|
||||
|
||||
@section('title', __('Trop de requêtes'))
|
||||
@section('code')
|
||||
<span>4</span><span>2</span><span>9</span>
|
||||
@endsection
|
||||
@section('message', 'Nous sommes désolé, mais le client a émis trop de requêtes. ')
|
||||
@section('error',$exception->getMessage())
|
||||
@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/429')
|
||||
@@ -1,90 +1,10 @@
|
||||
<html lang="en"><head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
@extends('errors.layout')
|
||||
|
||||
<title>Error</title>
|
||||
@section('title', __('Erreur interne'))
|
||||
@section('code')
|
||||
<span>5</span><span>0</span><span>0</span>
|
||||
@endsection
|
||||
@section('message', 'Nous sommes désolé, le serveur a rencontré une exception.')
|
||||
@section('error',$exception->getMessage())
|
||||
@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/500')
|
||||
|
||||
<!-- Fonts -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css">
|
||||
|
||||
<!-- Styles -->
|
||||
<style>
|
||||
html, body {
|
||||
background-color: #fff;
|
||||
color: #636b6f;
|
||||
font-family: 'Raleway', sans-serif;
|
||||
font-weight: 100;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.full-height {
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.flex-center {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.position-ref {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.content {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 36px;
|
||||
padding: 20px;
|
||||
}
|
||||
.loader{
|
||||
text-align: center;
|
||||
}
|
||||
.loader-bg{
|
||||
width: 70px;
|
||||
margin-top: 50px;
|
||||
margin-bottom: 50px;
|
||||
}
|
||||
.loader-spinner {
|
||||
position: relative;
|
||||
border: 16px solid #f3f3f3;
|
||||
border-top: 16px solid #272c33;
|
||||
border-radius: 50%;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
animation: spin 2s linear infinite;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
top: -163px;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="flex-center position-ref full-height">
|
||||
<div class="content">
|
||||
<div class="title">
|
||||
<h1 class="glitch" data-text="500" style="font-size: 20rem;margin:0px;">500</h1>
|
||||
</div>
|
||||
<div class="loader">
|
||||
<img class="loader-bg" src="/images/leaf_of_canada.png"></img>
|
||||
<div class="loader-spinner"></div>
|
||||
</div>
|
||||
<div class="title">
|
||||
Oups ... Le serveur n'aime pas ça, svp laisser lui le temps de soufler {{ $exception->getMessage() }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</body></html>
|
||||
9
resources/views/errors/503.blade.php
Normal file
9
resources/views/errors/503.blade.php
Normal file
@@ -0,0 +1,9 @@
|
||||
@extends('errors.layout')
|
||||
|
||||
@section('title', __('Service indisponible'))
|
||||
@section('code')
|
||||
<span>5</span><span>0</span><span>3</span>
|
||||
@endsection
|
||||
@section('message', 'Nous sommes désolé, mais le service est temporairement indisponible ou en maintenance.')
|
||||
@section('error',$exception->getMessage())
|
||||
@section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/503')
|
||||
194
resources/views/errors/layout.blade.php
Normal file
194
resources/views/errors/layout.blade.php
Normal file
@@ -0,0 +1,194 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
|
||||
|
||||
<title>@yield('title') - C-CMS</title>
|
||||
|
||||
<!-- Google font -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Cabin:400,700" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat:900" rel="stylesheet">
|
||||
<script src="/js/plugins/fontawesome/js/all.min.js"></script>
|
||||
|
||||
<!-- Custom stlylesheet -->
|
||||
<link type="text/css" rel="stylesheet" href="css/style.css" />
|
||||
|
||||
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[if lt IE 9]>
|
||||
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
|
||||
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
||||
<![endif]-->
|
||||
<style>
|
||||
* {
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#notfound {
|
||||
position: relative;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
#notfound .notfound {
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
-ms-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
.notfound {
|
||||
max-width: 520px;
|
||||
width: 100%;
|
||||
line-height: 1.4;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.notfound .notfound-404 {
|
||||
position: relative;
|
||||
height: 240px;
|
||||
}
|
||||
|
||||
.notfound .notfound-404 h1 {
|
||||
font-family: 'Montserrat', sans-serif;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
-ms-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
font-size: 252px;
|
||||
font-weight: 900;
|
||||
margin: 0px;
|
||||
color: #262626;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: -40px;
|
||||
margin-left: -20px;
|
||||
}
|
||||
|
||||
.notfound .notfound-404 h1>span {
|
||||
text-shadow: -8px 0px 0px #fff;
|
||||
}
|
||||
|
||||
.notfound .notfound-404 h3 {
|
||||
font-family: 'Cabin', sans-serif;
|
||||
position: relative;
|
||||
font-size: 16px;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
color: #262626;
|
||||
margin: 0px;
|
||||
letter-spacing: 3px;
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
.notfound h2{
|
||||
font-family: 'Cabin', sans-serif;
|
||||
font-size: 20px;
|
||||
font-weight: 400;
|
||||
text-transform: uppercase;
|
||||
color: #000;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-family: 'Cabin', sans-serif;
|
||||
font-size: 15px;
|
||||
font-weight: 400;
|
||||
text-transform: uppercase;
|
||||
color: #262626;
|
||||
margin-top: 0px;
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
|
||||
.help {
|
||||
float: right;
|
||||
margin-right: 8%;
|
||||
color: #262626;
|
||||
}
|
||||
|
||||
.animate {
|
||||
animation: blinker 1.75s linear infinite;
|
||||
}
|
||||
|
||||
img {
|
||||
height: 50px;
|
||||
margin: 8px 10px 8px 15px;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 767px) {
|
||||
.notfound .notfound-404 {
|
||||
height: 200px;
|
||||
}
|
||||
.notfound .notfound-404 h1 {
|
||||
font-size: 200px;
|
||||
}
|
||||
.help {
|
||||
margin-right: 15%;
|
||||
}
|
||||
img {
|
||||
height: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 480px) {
|
||||
.notfound .notfound-404 {
|
||||
height: 162px;
|
||||
}
|
||||
.notfound .notfound-404 h1 {
|
||||
font-size: 162px;
|
||||
height: 150px;
|
||||
line-height: 162px;
|
||||
}
|
||||
.notfound h2 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
img {
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes blinker {
|
||||
50% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="notfound">
|
||||
<img src="/images/C-CMS_G.png">
|
||||
{{ Breadcrumbs::render() }}
|
||||
<div class="notfound">
|
||||
<div class="notfound-404">
|
||||
<h3>Oops! @yield('title')</h3>
|
||||
<h1>@yield('code')</h1>
|
||||
<a target="_blank" class="animate" href="@yield('url')">
|
||||
<i class="fas fa-question-circle help"></i>
|
||||
</a>
|
||||
</div>
|
||||
<h2>@yield('message')</h2>
|
||||
<h3>@yield('error')</h3>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body><!-- This templates was made by Colorlib (https://colorlib.com) -->
|
||||
|
||||
</html>
|
||||
@@ -13,7 +13,7 @@ foreach (Auth::user()->unreadNotifications as $notification) {
|
||||
<i class="material-icons design_bullet-list-67 visible-on-sidebar-mini">view_list</i>
|
||||
</button>
|
||||
</div>
|
||||
@yield('breadcrumb')
|
||||
{{ Breadcrumbs::render() }}
|
||||
</div>
|
||||
<button class="navbar-toggler" type="button" data-toggle="collapse" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
|
||||
@@ -65,6 +65,7 @@ Route::middleware('auth:api')->group(function () {
|
||||
Route::post('/config/job/delete','JobController@destroy')->middleware('perm:config_edit');
|
||||
|
||||
/** 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');
|
||||
|
||||
311
routes/breadcrumbs.php
Normal file
311
routes/breadcrumbs.php
Normal file
@@ -0,0 +1,311 @@
|
||||
<?php
|
||||
|
||||
// Admin
|
||||
use DaveJamesMiller\Breadcrumbs\Facades\Breadcrumbs;
|
||||
|
||||
// Error 404
|
||||
Breadcrumbs::for('errors.404', function ($trail) {
|
||||
$trail->parent('dashboard');
|
||||
$trail->push('Page introuvable');
|
||||
});
|
||||
|
||||
Breadcrumbs::for('admin.dashboard', function ($trail) {
|
||||
$trail->push('Dashboard', route('admin.dashboard'));
|
||||
});
|
||||
|
||||
// Admin > Update
|
||||
Breadcrumbs::for('admin.update', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Note de mise à jour', route('admin.update'));
|
||||
});
|
||||
|
||||
// Admin > Status
|
||||
Breadcrumbs::for('admin.status', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Status de C-CMS', route('admin.status'));
|
||||
});
|
||||
|
||||
// Admin > Schedule
|
||||
Breadcrumbs::for('admin.schedule', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Horaire', route('admin.schedule'));
|
||||
});
|
||||
|
||||
// Admin > Schedule > Add
|
||||
Breadcrumbs::for('admin.schedule.add', function ($trail,$date) {
|
||||
$trail->parent('admin.schedule');
|
||||
$trail->push('Ajouter un évenement', route('admin.schedule.add',$date));
|
||||
});
|
||||
|
||||
// Admin > Schedule > Edit
|
||||
Breadcrumbs::for('admin.schedule.edit', function ($trail,$id) {
|
||||
$trail->parent('admin.schedule');
|
||||
$trail->push('Modifier un évenement', route('admin.schedule.edit',$id));
|
||||
});
|
||||
|
||||
// Admin > Statistiques
|
||||
Breadcrumbs::for('admin.log', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Historique des activitées', route('admin.log'));
|
||||
});
|
||||
|
||||
// Admin > User
|
||||
Breadcrumbs::for('admin.user', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Utilisateurs', route('admin.user'));
|
||||
});
|
||||
|
||||
// Admin > User > Add
|
||||
Breadcrumbs::for('admin.user.add', function ($trail) {
|
||||
$trail->parent('admin.user');
|
||||
$trail->push('Ajouter un utilisateur', route('admin.user.add'));
|
||||
});
|
||||
|
||||
// Admin > User > Edit
|
||||
Breadcrumbs::for('admin.user.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.user');
|
||||
$trail->push('Modifier un utilisateur', route('admin.user.edit', $id));
|
||||
});
|
||||
|
||||
// Admin > Config
|
||||
Breadcrumbs::for('admin.config', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Configurations', route('admin.config'));
|
||||
});
|
||||
|
||||
// Admin > Config > Calendrier
|
||||
Breadcrumbs::for('admin.config.schedule', function ($trail) {
|
||||
$trail->parent('admin.config');
|
||||
$trail->push('Horaire', route('admin.config.schedule'));
|
||||
});
|
||||
|
||||
// Admin > Config > Activite complementaire
|
||||
Breadcrumbs::for('admin.config.complementary-activity', function ($trail) {
|
||||
$trail->parent('admin.config');
|
||||
$trail->push('Activitée complémentaire', route('admin.config.complementary-activity'));
|
||||
});
|
||||
|
||||
// Admin > Config > Activite complementaire > Add
|
||||
Breadcrumbs::for('admin.config.complementary-activity.add', function ($trail) {
|
||||
$trail->parent('admin.config.complementary-activity');
|
||||
$trail->push('Ajouter', route('admin.config.complementary-activity.add'));
|
||||
});
|
||||
|
||||
// Admin > Config > Activite complementaire > Edit
|
||||
Breadcrumbs::for('admin.config.complementary-activity.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.config.complementary-activity');
|
||||
$trail->push('Modifier', route('admin.config.complementary-activity.edit', $id));
|
||||
});
|
||||
|
||||
// Admin > Config > Customisation
|
||||
Breadcrumbs::for('admin.config.customisation', function ($trail) {
|
||||
$trail->parent('admin.config');
|
||||
$trail->push('Apparence', route('admin.config.customisation'));
|
||||
});
|
||||
|
||||
// Admin > Config > Rank
|
||||
Breadcrumbs::for('admin.config.rank', function ($trail) {
|
||||
$trail->parent('admin.config');
|
||||
$trail->push('Grade', route('admin.config.rank'));
|
||||
});
|
||||
|
||||
// Admin > Config > Rank > Add
|
||||
Breadcrumbs::for('admin.config.rank.add', function ($trail) {
|
||||
$trail->parent('admin.config.rank');
|
||||
$trail->push('Ajouter', route('admin.config.rank.add'));
|
||||
});
|
||||
|
||||
// Admin > Config > Rank > Edit
|
||||
Breadcrumbs::for('admin.config.rank.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.config.rank');
|
||||
$trail->push('Modifier', route('admin.config.rank.edit',$id));
|
||||
});
|
||||
|
||||
// Admin > Config > Jobs
|
||||
Breadcrumbs::for('admin.config.jobs', function ($trail) {
|
||||
$trail->parent('admin.config');
|
||||
$trail->push('Postes', route('admin.config.jobs'));
|
||||
});
|
||||
|
||||
// Admin > Config > Jobs > Add
|
||||
Breadcrumbs::for('admin.config.jobs.add', function ($trail) {
|
||||
$trail->parent('admin.config.jobs');
|
||||
$trail->push('Ajouter', route('admin.config.jobs.add'));
|
||||
});
|
||||
|
||||
// Admin > Config > Jobs > Edit
|
||||
Breadcrumbs::for('admin.config.jobs.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.config.jobs');
|
||||
$trail->push('Modifier', route('admin.config.jobs.edit', $id));
|
||||
});
|
||||
|
||||
// Admin > Config > Files
|
||||
Breadcrumbs::for('admin.config.files', function ($trail) {
|
||||
$trail->parent('admin.config');
|
||||
$trail->push('Système de fichier', route('admin.config.files'));
|
||||
});
|
||||
|
||||
// Admin > Picture
|
||||
Breadcrumbs::for('admin.picture', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Photo', route('admin.picture'));
|
||||
});
|
||||
|
||||
// Admin > Picture > Add
|
||||
Breadcrumbs::for('admin.picture.add', function ($trail) {
|
||||
$trail->parent('admin.picture');
|
||||
$trail->push('Ajouter', route('admin.picture.add'));
|
||||
});
|
||||
|
||||
// Admin > Picture > Edit
|
||||
Breadcrumbs::for('admin.picture.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.picture');
|
||||
$trail->push('Modifier', route('admin.picture.edit', $id));
|
||||
});
|
||||
|
||||
// Admin > Inventaire
|
||||
Breadcrumbs::for('admin.inv', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Inventaire', route('admin.inv'));
|
||||
});
|
||||
|
||||
// Admin > Inventaire > Management
|
||||
Breadcrumbs::for('admin.inv.management', function ($trail) {
|
||||
$trail->parent('admin.inv');
|
||||
$trail->push('Gestion de l\'inventaire', route('admin.inv.management'));
|
||||
});
|
||||
|
||||
// Admin > Inventaire > Management > Category
|
||||
Breadcrumbs::for('admin.inv.management.category', function ($trail) {
|
||||
$trail->parent('admin.inv.management');
|
||||
$trail->push('Catégories', route('admin.inv.management.category'));
|
||||
});
|
||||
|
||||
// Admin > Inventaire > Management > Category > Add
|
||||
Breadcrumbs::for('admin.inv.management.category.add', function ($trail) {
|
||||
$trail->parent('admin.inv.management.category');
|
||||
$trail->push('Ajouter', route('admin.inv.management.category.add'));
|
||||
});
|
||||
|
||||
// Admin > Inventaire > Management > Category > Edit
|
||||
Breadcrumbs::for('admin.inv.management.category.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.inv.management.category');
|
||||
$trail->push('Modifier', route('admin.inv.management.category.edit', $id));
|
||||
});
|
||||
|
||||
// Admin > News
|
||||
Breadcrumbs::for('admin.news', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Nouvelles', route('admin.news'));
|
||||
});
|
||||
|
||||
// Admin > News > Add
|
||||
Breadcrumbs::for('admin.news.add', function ($trail) {
|
||||
$trail->parent('admin.news');
|
||||
$trail->push('Ajouter', route('admin.news.add'));
|
||||
});
|
||||
|
||||
// Admin > News > Edit
|
||||
Breadcrumbs::for('admin.news.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.news');
|
||||
$trail->push('Modifier', route('admin.news.edit', $id));
|
||||
});
|
||||
|
||||
// Admin > Article
|
||||
Breadcrumbs::for('admin.article', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Articles', route('admin.article'));
|
||||
});
|
||||
|
||||
// Admin > Article > Edit
|
||||
Breadcrumbs::for('admin.article.edit', function ($trail, $id) {
|
||||
$trail->parent('admin.article');
|
||||
$trail->push('Modifier', route('admin.article.edit', $id));
|
||||
});
|
||||
|
||||
// Admin > Profil
|
||||
Breadcrumbs::for('admin.profil', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Profil d\'utilisateur', route('admin.profil'));
|
||||
});
|
||||
|
||||
// Admin > Profil > Avatar
|
||||
Breadcrumbs::for('admin.profil.avatar', function ($trail) {
|
||||
$trail->parent('admin.profil');
|
||||
$trail->push('Avatar', route('admin.profil.avatar'));
|
||||
});
|
||||
|
||||
// Admin > Profil > Adress
|
||||
Breadcrumbs::for('admin.profil.adress', function ($trail) {
|
||||
$trail->parent('admin.profil');
|
||||
$trail->push('Adresse', route('admin.profil.adress'));
|
||||
});
|
||||
|
||||
// Admin > Profil > Password
|
||||
Breadcrumbs::for('admin.profil.psw', function ($trail) {
|
||||
$trail->parent('admin.profil');
|
||||
$trail->push('Password', route('admin.profil.psw'));
|
||||
});
|
||||
|
||||
// Admin > Drive
|
||||
Breadcrumbs::for('admin.drive', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Explorateur de fichier', route('admin.drive'));
|
||||
});
|
||||
|
||||
// Admin > Drive > Permission
|
||||
Breadcrumbs::for('admin.drive.permission', function ($trail,$folder) {
|
||||
$trail->parent('admin.drive.folder',$folder);
|
||||
$trail->push('Permission', route('admin.drive.permission',$folder));
|
||||
});
|
||||
|
||||
// Admin > Drive > [$folder]
|
||||
Breadcrumbs::for('admin.drive.folder', function ($trail,$folder) {
|
||||
$trail->parent('admin.drive');
|
||||
$trail->push(\Storage::cloud()->getMetadata($folder)['name'], route('admin.drive',$folder));
|
||||
});
|
||||
|
||||
|
||||
// Admin > Guide
|
||||
Breadcrumbs::for('admin.guide', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Guide pédagogique', route('admin.guide'));
|
||||
});
|
||||
|
||||
// Admin > Files
|
||||
Breadcrumbs::for('admin.files', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Fichier', route('admin.files'));
|
||||
});
|
||||
|
||||
// Admin > OCOM
|
||||
Breadcrumbs::for('admin.ocom', function ($trail) {
|
||||
$trail->parent('admin.dashboard');
|
||||
$trail->push('Base de données des cours', route('admin.ocom'));
|
||||
});
|
||||
|
||||
// Admin > OCOM > Generate
|
||||
Breadcrumbs::for('admin.ocom.generate', function ($trail) {
|
||||
$trail->parent('admin.ocom');
|
||||
$trail->push('Génération de masse', route('admin.ocom.generate'));
|
||||
});
|
||||
|
||||
// Admin > OCOM > Add
|
||||
Breadcrumbs::for('admin.ocom.add', function ($trail) {
|
||||
$trail->parent('admin.ocom');
|
||||
$trail->push('Ajouter', route('admin.ocom.add'));
|
||||
});
|
||||
|
||||
// Admin > OCOM > [ocom]
|
||||
Breadcrumbs::for('admin.ocom.show', function ($trail, $id) {
|
||||
$ocom = \App\OCOM::findOrFail($id);
|
||||
$trail->parent('admin.ocom');
|
||||
$trail->push($ocom->ocom, route('admin.ocom.show', $ocom));
|
||||
});
|
||||
|
||||
// Admin > OCOM > [ocom] > Edit
|
||||
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));
|
||||
});
|
||||
120
routes/web.php
120
routes/web.php
@@ -28,65 +28,67 @@ Route::get('/activity/{id}', 'ComplementaryActivityController@show');
|
||||
Route::get('/picture/{id}', 'PictureController@show');
|
||||
Route::get('/pictures', 'PictureController@index');
|
||||
|
||||
Route::get('/file/get','GoogleDriveController@getFile')->middleware('fileperm:file,r');
|
||||
|
||||
Route::middleware(['auth'])->group(function () {
|
||||
|
||||
Route::middleware(['auth'])->name('admin.')->group(function () {
|
||||
|
||||
/* Espace Administration Route */
|
||||
|
||||
/** Dashboard & General */
|
||||
Route::get('/admin', 'AdminController@index')->name('admin');
|
||||
Route::get('/admin/update', 'AdminController@update');
|
||||
Route::get('/admin/status','AdminController@status');
|
||||
Route::get('/admin', 'AdminController@index')->name('dashboard');
|
||||
Route::get('/admin/update', 'AdminController@update')->name('update');
|
||||
Route::get('/admin/status','AdminController@status')->name('status');
|
||||
|
||||
/** Schedule */
|
||||
Route::get('/admin/schedule', 'CalendarController@index')->middleware('perm:schedule_see');
|
||||
Route::get('/admin/schedule/pdf/event/{id}','ScheduleController@printtopdf')->middleware('perm:schedule_see');
|
||||
Route::get('/admin/schedule/add/{date}','ScheduleController@create')->middleware('perm:schedule_add');
|
||||
Route::get('/admin/schedule/edit/{id}','EventController@edit')->middleware('perm:schedule_edit');
|
||||
Route::get('/admin/schedule', 'CalendarController@index')->middleware('perm:schedule_see')->name('schedule');
|
||||
Route::get('/admin/schedule/pdf/event/{id}','ScheduleController@printtopdf')->middleware('perm:schedule_see')->name('schedule.pdf');
|
||||
Route::get('/admin/schedule/add/{date}','ScheduleController@create')->middleware('perm:schedule_add')->name('schedule.add');
|
||||
Route::get('/admin/schedule/edit/{id}','EventController@edit')->middleware('perm:schedule_edit')->name('schedule.edit');
|
||||
Route::post('/admin/schedule/event/add','EventController@Store')->middleware('perm:schedule_add');
|
||||
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');
|
||||
Route::get('/admin/stats/log' , 'LogController@index')->middleware('perm:stats_see')->name('log');
|
||||
|
||||
/** Message */
|
||||
Route::get('/admin/message' , 'MessageController@index')->middleware('perm:msg_see');
|
||||
Route::get('/admin/message/add' , 'MessageController@create')->middleware('perm:msg_add');
|
||||
Route::get('/admin/message' , 'MessageController@index')->middleware('perm:msg_see')->name('message');
|
||||
Route::get('/admin/message/add' , 'MessageController@create')->middleware('perm:msg_add')->name('message.add');
|
||||
Route::post('/admin/message/add' , 'MessageController@store')->middleware('perm:msg_add');
|
||||
Route::get('/admin/message/{id}', ['uses' =>'MessageController@show'])->middleware('perm:msg_see');
|
||||
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');
|
||||
Route::get('/admin/user/add' , 'UserController@create')->middleware('perm:user_add');
|
||||
Route::get('/admin/user' , 'UserController@index')->middleware('perm:user_see')->name('user');
|
||||
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');
|
||||
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');
|
||||
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/activity' , 'ComplementaryActivityController@index')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/activity/add' , 'ComplementaryActivityController@create')->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');
|
||||
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');
|
||||
Route::get('/admin/config/customisation','ConfigController@customisation')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/' , 'ConfigController@index')->middleware('perm:config_edit')->name('config');
|
||||
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');
|
||||
|
||||
Route::get('/admin/config/ranks','RankController@index')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/ranks/add','RankController@create')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/ranks','RankController@index')->middleware('perm:config_edit')->name('config.rank');
|
||||
Route::get('/admin/config/ranks/add','RankController@create')->middleware('perm:config_edit')->name('config.rank.add');
|
||||
Route::post('/admin/config/ranks/add','RankController@store')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/ranks/{id}','RankController@show')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/ranks/{id}','RankController@show')->middleware('perm:config_edit')->name('config.rank.edit');
|
||||
Route::post('/admin/config/ranks/{id}','RankController@update')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/jobs','JobController@index')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/jobs/add','JobController@create')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/jobs','JobController@index')->middleware('perm:config_edit')->name('config.jobs');
|
||||
Route::get('/admin/config/jobs/add','JobController@create')->middleware('perm:config_edit')->name('config.jobs.add');
|
||||
Route::post('/admin/config/jobs/add','JobController@store')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/jobs/{id}','JobController@edit')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/jobs/{id}','JobController@edit')->middleware('perm:config_edit')->name('config.jobs.edit');
|
||||
Route::post('/admin/config/jobs/{id}','JobController@update')->middleware('perm:config_edit');
|
||||
|
||||
Route::get('/admin/config/files' , 'ConfigController@showfilesConfig')->middleware('perm:config_edit');
|
||||
Route::get('/admin/config/files' , 'ConfigController@showfilesConfig')->middleware('perm:config_edit')->name('config.files');
|
||||
Route::post('/admin/config/files' , 'ConfigController@editfilesConfig')->middleware('perm:config_edit');
|
||||
|
||||
/** Public page */
|
||||
@@ -94,33 +96,33 @@ Route::middleware(['auth'])->group(function () {
|
||||
Route::post('/admin/public/edit/{config}', 'PublicController@update')->middleware('perm:config_edit');
|
||||
|
||||
/** Picture */
|
||||
Route::get('/admin/picture','PictureController@indexAdmin')->middleware('perm:picture_see');
|
||||
Route::get('/admin/picture/add','PictureController@create')->middleware('perm:picture_add');
|
||||
Route::get('/admin/picture','PictureController@indexAdmin')->middleware('perm:picture_see')->name('picture');
|
||||
Route::get('/admin/picture/add','PictureController@create')->middleware('perm:picture_add')->name('picture.add');
|
||||
Route::post('/admin/picture/add','PictureController@store')->middleware('perm:picture_add');
|
||||
Route::get('/admin/picture/edit/{id}','PictureController@edit')->middleware('perm:picture_edit');
|
||||
Route::get('/admin/picture/edit/{id}','PictureController@edit')->middleware('perm:picture_edit')->name('picture.edit');
|
||||
Route::post('/admin/picture/edit/{id}','PictureController@update')->middleware('perm:picture_edit');
|
||||
|
||||
/** Inventory */
|
||||
Route::get('/admin/inventory' , 'InventoryController@index')->middleware('perm:inventory_see');
|
||||
Route::get('/admin/inventory/management','InventoryController@management')->middleware('perm:inventory_edit');
|
||||
Route::get('/admin/inventory' , 'InventoryController@index')->middleware('perm:inventory_see')->name('inv');
|
||||
Route::get('/admin/inventory/management','InventoryController@management')->middleware('perm:inventory_edit')->name('inv.management');
|
||||
|
||||
/** Item Category */
|
||||
Route::get('/admin/inventory/management/category','ItemCategoryController@index')->middleware('perm:inventory_edit');
|
||||
Route::get('/admin/inventory/management/category/add','ItemCategoryController@create')->middleware('perm:inventory_add');
|
||||
Route::get('/admin/inventory/management/category','ItemCategoryController@index')->middleware('perm:inventory_edit')->name('inv.management.category');
|
||||
Route::get('/admin/inventory/management/category/add','ItemCategoryController@create')->middleware('perm:inventory_add')->name('inv.management.category.add');
|
||||
Route::post('/admin/inventory/management/category/add','ItemCategoryController@store')->middleware('perm:inventory_add');
|
||||
Route::get('/admin/inventory/management/category/edit/{id}','ItemCategoryController@edit')->middleware('perm:inventory_edit');
|
||||
Route::get('/admin/inventory/management/category/edit/{id}','ItemCategoryController@edit')->middleware('perm:inventory_edit')->name('inv.management.category.edit');
|
||||
Route::post('/admin/inventory/management/category/edit/{id}','ItemCategoryController@update')->middleware('perm:inventory_edit');
|
||||
|
||||
/** News */
|
||||
Route::get('/admin/news','NewsController@indexAdmin')->middleware('perm:news_see');
|
||||
Route::get('/admin/news/add','NewsController@create')->middleware('perm:news_add');
|
||||
Route::get('/admin/news','NewsController@indexAdmin')->middleware('perm:news_see')->name('news');
|
||||
Route::get('/admin/news/add','NewsController@create')->middleware('perm:news_add')->name('news.add');
|
||||
Route::post('/admin/news/add','NewsController@store')->middleware('perm:news_add');
|
||||
Route::get('/admin/news/edit/{id}','NewsController@edit')->middleware('perm:news_edit');
|
||||
Route::get('/admin/news/edit/{id}','NewsController@edit')->middleware('perm:news_edit')->name('news.edit');
|
||||
Route::post('/admin/news/edit/{id}','NewsController@update')->middleware('perm:news_edit');
|
||||
|
||||
/** Articles */
|
||||
Route::get('/admin/article','ArticleController@index')->middleware('perm:article_see');
|
||||
Route::get('/admin/article/activity/edit/{id}','ArticleController@editActivity')->middleware('perm:article_edit');
|
||||
Route::get('/admin/article','ArticleController@index')->middleware('perm:article_see')->name('article');
|
||||
Route::get('/admin/article/activity/edit/{id}','ArticleController@editActivity')->middleware('perm:article_edit')->name('article.edit');
|
||||
Route::post('/admin/article/activity/edit/{id}','ArticleController@updateActivity')->middleware('perm:article_edit');
|
||||
Route::get('/admin/article/activity/picture/{id}','ArticleController@pictureActivity')->middleware('perm:article_edit');
|
||||
Route::get('/admin/article/activity/picture/{id}/add','ArticleController@pictureActivityCreate')->middleware('perm:article_edit');
|
||||
@@ -143,39 +145,39 @@ Route::middleware(['auth'])->group(function () {
|
||||
|
||||
/** Notification */
|
||||
Route::get('/admin/notication/mark','UserController@notificationmarkALL');
|
||||
Route::post('/admin/notication/mark/{id}','UserController@notificationmark');
|
||||
Route::get('/ecc/notication/mark','UserController@notificationmarkALL');
|
||||
Route::post('/ecc/notication/mark/{id}','UserController@notificationmarkECC');
|
||||
Route::post('/admin/notication/mark/{id}','UserController@notificationmark');
|
||||
|
||||
/** Profil */
|
||||
Route::get('/admin/profil/avatar' , 'UserController@UserAvatar');
|
||||
Route::get('/admin/profil/password' , 'UserController@UserPassword');
|
||||
Route::get('/admin/profil/adress' , 'UserController@UserAdress');
|
||||
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');
|
||||
Route::post('/admin/profil/edit/adress' , 'UserController@editUserAdress');
|
||||
Route::post('/admin/profil/edit/password' , 'UserController@editUserPassword');
|
||||
Route::get('/admin/profil/edit/avatar/{id}' , 'UserController@editUserAvatar');
|
||||
Route::get('/admin/profil/{id?}' , 'UserController@showUserProfil');
|
||||
Route::get('/admin/profil/{id?}' , 'UserController@showUserProfil')->name('profil');
|
||||
|
||||
/** Files */
|
||||
Route::get('/file/get','GoogleDriveController@getFile')->middleware('perm:file_see');
|
||||
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');
|
||||
Route::get('/admin/files','FilesController@index')->middleware('perm:file_see');
|
||||
Route::get('/admin/guide','FilesController@guide')->middleware('perm:file_see');
|
||||
Route::get('/admin/drive/{folder?}','GoogleDriveController@index')->middleware('perm:file_see');
|
||||
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('perm:file_see')->name('drive');
|
||||
Route::get('/admin/drive/{folder}/permission','GoogleDriveController@editPermission')->middleware('perm:file_see')->name('drive.permission');
|
||||
Route::patch('/admin/drive/{folder}/permission/{subject}/{id}','GoogleDriveController@editPermission')->middleware('perm:file_see');
|
||||
|
||||
/** OCOM */
|
||||
Route::get('/admin/ocom','OCOMController@index');
|
||||
Route::get('/admin/ocom/generate','OCOMController@showgenerate');
|
||||
|
||||
/** 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');
|
||||
Route::get('/admin/ocom/add','OCOMController@create')->name('ocom.add');
|
||||
Route::put('/admin/ocom/add','OCOMController@store');
|
||||
Route::get('/admin/ocom/edit/{id}','OCOMController@edit');
|
||||
Route::patch('/admin/ocom/edit/{id}','OCOMController@update');
|
||||
Route::get('/admin/ocom/{id}','OCOMController@show');
|
||||
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');
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user