File Explorer update + Permission update

This commit is contained in:
George Frederick "Buzz" Beurling
2020-03-19 19:07:26 -04:00
parent 8a0e09cb80
commit 1e3ae2fbbb
36 changed files with 1899 additions and 434 deletions

View File

@@ -33,8 +33,8 @@ MAIL_USERNAME=null
MAIL_PASSWORD=null MAIL_PASSWORD=null
MAIL_ENCRYPTION=null MAIL_ENCRYPTION=null
NEXMO_KEY=4587feffd # Votre Clé Nexmo API NEXMO_KEY= # Votre Clé Nexmo API
NEXMO_SECRET=54dasf4e8fa4s4fd4f5s # Votre Mot de passe Nexmo API NEXMO_SECRET= # Votre Mot de passe Nexmo API
PUSHER_APP_ID= PUSHER_APP_ID=
PUSHER_APP_KEY= PUSHER_APP_KEY=

View File

@@ -3,9 +3,25 @@
namespace App; namespace App;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Storage;
use League\Flysystem\FileNotFoundException;
use mysql_xdevapi\Exception;
class GoogleDriveFile extends Model 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) public static function icon($extension)
{ {
$icon = "fas fa-file"; $icon = "fas fa-file";
@@ -37,4 +53,204 @@ class GoogleDriveFile extends Model
} }
return $icon; 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);
}
} }

View File

@@ -2,6 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\GoogleDriveFile;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Psy\Util\Str; use Psy\Util\Str;
@@ -245,9 +246,6 @@ class GoogleDriveController extends Controller
$contents = collect(Storage::cloud()->listContents($folder, $recursive)); $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]); 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 = []; $error = [];
if(\App\Config::getData('is_Google_Drive_enabled') == "true") if(\App\Config::getData('is_Google_Drive_enabled') == "true")
{ {
if ($this->checkConfig()) if (GoogleDriveFile::checkConfig())
{ {
$structure = $this->getFileStructure(); $structure = $this->getFileStructure();
$this->checkStructure($structure,'/','/',$error); $this->checkStructure($structure,'/','/',$error);
@@ -273,61 +271,135 @@ class GoogleDriveController extends Controller
return $error; 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; $basename = GoogleDriveFile::findByPathInDrive($directory);
$newDirID = null; if ($basename == false)
$p = null;
foreach ($mydir as $dir)
{ {
$p = $dir['basename']; $basename = GoogleDriveFile::createByPathInDrive($directory);
if ($dir['extension'] == $key) }
$googleDriveFile = GoogleDriveFile::findByPath($directory);
if ($googleDriveFile == null)
{ {
$found = true; $googleDriveFile = new GoogleDriveFile();
$newDirID = $dir['basename']; $googleDriveFile->id = $basename;
break; $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)
{
$googleDriveFile->id = $basename;
$googleDriveFile->save();
} }
} }
if (!$found) }
}
public function editPermission($folder)
{ {
array_push($error,'Dossier 🔒.'.$key.' manquant... Le dossier a été créer'); $f = GoogleDriveFile::find($folder);
\Storage::cloud()->createDir($parent.'/🔒.'.$key); if ($f == null)
$tempdir = $this->listLockDirectory($parent);
$p = $tempdir->where('extension','=',$key)->first()['basename'];
}
if ($value != [])
{ {
$this->checkStructure($value,$p,$newDirID,$error); $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() public function getFileStructure()
{ {
return collect([ return collect([
'Privé' => [ '🔒.Privé' => [
'Cadet' => [], 'rank' => [1 => 'rwp'],
'ETAMAS' => [], 'job' => [],
'Officier' => [], 'user' => []
'Staff' => [
'Guide' => []
]
], ],
'Publique' => [ '🔒.Privé/🔒.Cadet' => [
'Fichier' => [], 'rank' => [1 => 'rwp'],
'Image' => [] '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; 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')) != ""); $path = [];
$configOk = true; $name = [];
$directories = collect(json_decode($this->getPathArray(),true));
if ($configNull) foreach ($directories as $dir)
{ {
try { $path[$dir['basename']] = $dir['dirname'];
$contents = collect(Storage::cloud()->listContents("/", false)); $name[$dir['basename']] = $dir['name'];
} }
catch (\Exception $e) $realPath = $name[$folder];
$foo = $folder;
while ($foo != "")
{ {
$configOk = false; $bar = explode('/',$path[$foo]);
$foo = $bar[count($bar)-1];
if ($foo != "")
{
$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]);
} }
} }

View File

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

View 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');
}
}
}

View File

@@ -48,6 +48,7 @@ function clog(string $type,string $result,string $event,$user_id = null,$obj_typ
$log->user_id = \Auth::User()->id; $log->user_id = \Auth::User()->id;
} }
if ($obj_type != null) if ($obj_type != null)
{ {
$log->logable_type = $obj_type; $log->logable_type = $obj_type;

View File

@@ -8,6 +8,7 @@
"php": "^7.2", "php": "^7.2",
"barryvdh/laravel-dompdf": "^0.8.4", "barryvdh/laravel-dompdf": "^0.8.4",
"barryvdh/laravel-ide-helper": "v2.6.6", "barryvdh/laravel-ide-helper": "v2.6.6",
"davejamesmiller/laravel-breadcrumbs": "5.3.1",
"fideloper/proxy": "^4.0", "fideloper/proxy": "^4.0",
"guzzlehttp/guzzle": "^6.3", "guzzlehttp/guzzle": "^6.3",
"laravel/framework": "^6.0", "laravel/framework": "^6.0",

105
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "57f87b1252c823a7d2a41bf3f850e726", "content-hash": "1f2a06232956fd23a3faa4bba05f8f95",
"packages": [ "packages": [
{ {
"name": "barryvdh/laravel-dompdf", "name": "barryvdh/laravel-dompdf",
@@ -483,6 +483,65 @@
], ],
"time": "2020-03-01T12:26:26+00:00" "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", "name": "dnoegel/php-xdg-base-dir",
"version": "v0.1.1", "version": "v0.1.1",
@@ -1073,6 +1132,50 @@
], ],
"time": "2020-02-13T22:36:52+00:00" "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", "name": "fideloper/proxy",
"version": "4.3.0", "version": "4.3.0",

75
config/breadcrumbs.php Normal file
View 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,
];

View File

@@ -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
View File

@@ -57,6 +57,10 @@
cursor: pointer; cursor: pointer;
} }
.no-cursor {
cursor: default;
}
.word-wrap { .word-wrap {
white-space: normal; white-space: normal;
word-break: break-word; word-break: break-word;
@@ -140,7 +144,7 @@
top: 36px; top: 36px;
left: 36px; left: 36px;
width: 0; width: 0;
height: 0; height: 0;progress-bar
opacity: 1; opacity: 1;
} }
100% { 100% {
@@ -1816,3 +1820,16 @@ td{
h2 { h2 {
text-transform: capitalize !important; 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
public/images/C-CMS_G.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -1,8 +1,9 @@
var folderHistory = []; var folderHistory = false;
var path = ''; var path = '';
var currentFolder = ''; var currentFolder = '';
var folderGoBack = []; var folderGoBack = [];
var permissionModalHtml = null;
var progressBar = 0;
function init(folder) function init(folder)
{ {
loadFolder(folder); loadFolder(folder);
@@ -10,19 +11,33 @@ function init(folder)
} }
function loadHistory() { function loadHistory() {
updateProgressBar(progressBar+5);
let btnBack = $('#backbtn');
btnBack.prop('disabled','true');
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: '/api/drive/patharray?api_token=' + api_token, url: '/api/drive/patharray?api_token=' + api_token,
success: function (rawpath) { success: function (rawpath) {
updateProgressBar(progressBar+30);
var path = JSON.parse(rawpath); var path = JSON.parse(rawpath);
Object.keys(path).forEach(function (item) { Object.keys(path).forEach(function (item) {
var dir = path[item].dirname.split('/'); var dir = path[item].dirname.split('/');
folderGoBack[path[item].basename] = dir[dir.length - 1]; 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 () { error: function () {
if (folderHistory)
{
showNotification('error', 'Impossible de charger la hiérachie des dossiers', 'top', 'center') showNotification('error', 'Impossible de charger la hiérachie des dossiers', 'top', 'center')
} }
}
}); });
} }
@@ -30,26 +45,35 @@ function loadFolder(folder) {
if (folder != undefined) if (folder != undefined)
{ {
showLoader(); showLoader();
updateProgressBar(progressBar+5);
$.ajax({ $.ajax({
type: 'GET', type: 'GET',
url: '/api/drive/folders/'+folder+'?api_token=' + api_token, url: '/api/drive/folders/'+folder+'?api_token=' + api_token,
success: function (template) { success: function (template) {
// Load Explorer Content // Load Explorer Content
updateProgressBar(progressBar+30);
$(".drive-explorer").html(template); $(".drive-explorer").html(template);
currentFolder = folder; currentFolder = folder;
window.history.pushState("object or string", "Page Title", "/admin/drive/"+folder); window.history.pushState("object or string", "Page Title", "/admin/drive/"+folder);
updateProgressBar(progressBar+5);
hideLoader(); hideLoader();
$('.currentDir').attr('value',folder); $('.currentDir').attr('value',folder);
if(currentFolder == '' || currentFolder == 'root') if (folderHistory)
{
if((currentFolder == '' || currentFolder == 'root'))
{ {
$('#backbtn').prop('disabled','true'); $('#backbtn').prop('disabled','true');
} }
else else
{ {
console.log('wtf');
console.log(folderGoBack);
$('#backbtn').removeAttr('disabled'); $('#backbtn').removeAttr('disabled');
} }
}
updateProgressBar(progressBar+10);
}, },
error: function () { error: function () {
showNotification('error', 'Impossible de charger le dossier '+folder, 'top', 'center') showNotification('error', 'Impossible de charger le dossier '+folder, 'top', 'center')
@@ -123,3 +147,38 @@ function deleteFolder(folder)
function refreshFolder() { function refreshFolder() {
loadFolder(currentFolder); 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
View File

@@ -57,6 +57,10 @@
cursor: pointer; cursor: pointer;
} }
.no-cursor {
cursor: default;
}
.word-wrap { .word-wrap {
white-space: normal; white-space: normal;
word-break: break-word; word-break: break-word;
@@ -140,7 +144,7 @@
top: 36px; top: 36px;
left: 36px; left: 36px;
width: 0; width: 0;
height: 0; height: 0;progress-bar
opacity: 1; opacity: 1;
} }
100% { 100% {
@@ -1816,3 +1820,16 @@ td{
h2 { h2 {
text-transform: capitalize !important; 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;
}

View File

@@ -4,7 +4,7 @@
<div class="col-md-12"> <div class="col-md-12">
<div class="card"> <div class="card">
<div class="card-header card-header-primary"> <div class="card-header card-header-primary">
<h4>Configuration Générale</h4> <h4>Apparence</h4>
</div> </div>
<div class="card-body mt-5"> <div class="card-body mt-5">
<form action="/admin/config/customisation" method="POST"> <form action="/admin/config/customisation" method="POST">
@@ -27,27 +27,6 @@
</div> </div>
@endsection @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') @section('custom_scripts')
<script> <script>
function saveChange(pPerm) { function saveChange(pPerm) {

View File

@@ -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"> <thead class="thead-dark">
<tr> <tr>
<td class="text-center explorerType"><strong>#</strong></td> <td class="text-center explorerType"><strong>#</strong></td>
<td class="text-left">Nom</td> <td class="text-left">Nom</td>
<td class="text-center">Dernière modification</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> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach($directories as $directory) @foreach($directories as $directory)
<tr class="context-menu-one"> <tr class="context-menu-one">
<td onclick="loadFolder('{{$directory['basename']}}')" 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;" ><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;" >{{$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="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"> <td class="td-actions text-right">
@if($directory['filename'] != '🔒') @if(\App\GoogleDriveFile::getPermForAuthUser($directory['basename'],'p'))
<div class="dropdown"> <div class="dropdown">
<div id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <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> <i class="fas fa-ellipsis-v fa-2x ml-3 text-gray" style="margin-right: .8rem !important;cursor: pointer;"></i>
</div> </div>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> <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'] }}')"> <a class="dropdown-item text-danger" onclick="deleteFolder('{{ $directory['basename'] }}')">
<i class="fas fa-trash-alt mr-2"></i>Supprimer <i class="fas fa-trash-alt mr-2"></i>Supprimer
</a> </a>
</div> </div>
</div> </div>
@else @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 @endif
</td> </td>
</tr> </tr>
@@ -49,7 +70,10 @@
<div class="col-md-2"> <div class="col-md-2">
Taille : {{GetSizeName($file['size'])}} Taille : {{GetSizeName($file['size'])}}
</div> </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"> <a href="/file/get?f={{urlencode($file['name'])}}&d={{$file['dirname']}}" rel="tooltip" class="btn btn-info">
<i class="material-icons">cloud_download</i> <i class="material-icons">cloud_download</i>
</a> </a>
@@ -61,6 +85,13 @@
</td> </td>
</tr> </tr>
@endforeach @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> </tbody>
</table> </table>
<small class="float-right mr-4">Dernière mise à jour {{date('r')}}</small> <small class="float-right mr-4">Dernière mise à jour {{date('r')}}</small>

View File

@@ -2,13 +2,16 @@
@section('content') @section('content')
<div class="card"> <div class="card">
<div class="row ml-3 mr-3 mt-3"> <div class="progress progress-bar-top">
<div class="col-1 d-inline-flex"> <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>
<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> </div>
<div class="col-4 d-flex justify-content-end offset-7"> <div class="row ml-3 mr-3 mt-3">
<div class="dropdown mr-2"> <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-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"> <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 <i class="fas fa-plus"></i> Nouveau
</button> </button>

View 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">&times;</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

View File

@@ -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">&times;</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>

View File

@@ -60,7 +60,7 @@
<td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_rendement}}</td> <td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_rendement}}</td>
<td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_competence}}</td> <td onclick="navigate({{$ocom->id}})">{{$ocom->objectif_competence}}</td>
<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> <i class="material-icons">edit</i>
</a> </a>
<button class="btn btn-danger btn-fab btn-fab-mini btn-round" onclick="deleteOCOM({{$ocom->id}})"> <button class="btn btn-danger btn-fab btn-fab-mini btn-round" onclick="deleteOCOM({{$ocom->id}})">

View File

@@ -43,7 +43,7 @@
<p>{{$ocom->objectif_rendement}}</p> <p>{{$ocom->objectif_rendement}}</p>
</div> </div>
<div class="col-md-8 text-right"> <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> <button type="button" class="btn btn-danger" onclick="deleteOCOM('{{$ocom->id}}')">Supprimer</button>
</div> </div>
<div class="col-12"> <div class="col-12">

View File

@@ -65,10 +65,10 @@
<span class="fileinput-filename"></span> <span class="fileinput-filename"></span>
</div> </div>
<span class="input-group-append"> <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="input-group-text btn-file">
<span class="fileinput-new">Select file</span> <span class="fileinput-new cursor">Select file</span>
<span class="fileinput-exists">Change</span> <span class="fileinput-exists cursor">Change</span>
<input type="file" name="file_msg" multiple> <input type="file" name="file_msg" multiple>
</span> </span>
</span> </span>

View File

@@ -2,6 +2,109 @@
@section('content') @section('content')
<div class="row"> <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="col-md-12">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">

View File

@@ -1,90 +1,9 @@
<html lang="en"><head> @extends('errors.layout')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Error</title> @section('title', __('Non autorisé'))
@section('code')
<!-- Fonts --> <span>4</span><span>0</span><span>1</span>
<link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css"> @endsection
@section('message', 'Nous sommes désolé, vous n\'avez pas l\'autorisation d\'être ici.')
<!-- Styles --> @section('error',$exception->getMessage())
<style> @section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/401')
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>

View 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')

View File

@@ -1,90 +1,9 @@
<html lang="en"><head> @extends('errors.layout')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Error</title> @section('title', __('Page introuvable'))
@section('code')
<!-- Fonts --> <span>4</span><span>0</span><span>4</span>
<link href="https://fonts.googleapis.com/css?family=Raleway:100,600" rel="stylesheet" type="text/css"> @endsection
@section('message', 'Nous sommes désolé, la page demandée ne semble pas exister.')
<!-- Styles --> @section('error',$exception->getMessage())
<style> @section('url','https://developer.mozilla.org/fr/docs/Web/HTTP/Status/404')
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 {{ $exception->getMessage() }}</div>
</div>
</div>
</body></html>

View 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','')

View 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')

View File

@@ -1,90 +1,10 @@
<html lang="en"><head> @extends('errors.layout')
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<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>

View 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')

View 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>

View File

@@ -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> <i class="material-icons design_bullet-list-67 visible-on-sidebar-mini">view_list</i>
</button> </button>
</div> </div>
@yield('breadcrumb') {{ Breadcrumbs::render() }}
</div> </div>
<button class="navbar-toggler" type="button" data-toggle="collapse" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> <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> <span class="sr-only">Toggle navigation</span>

View File

@@ -65,6 +65,7 @@ Route::middleware('auth:api')->group(function () {
Route::post('/config/job/delete','JobController@destroy')->middleware('perm:config_edit'); Route::post('/config/job/delete','JobController@destroy')->middleware('perm:config_edit');
/** File Exlorer Route */ /** 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/folders/{folder?}','GoogleDriveController@list');
Route::get('/drive/path/{folder}','GoogleDriveController@getPath'); Route::get('/drive/path/{folder}','GoogleDriveController@getPath');
Route::get('/drive/patharray','GoogleDriveController@getPathArray'); Route::get('/drive/patharray','GoogleDriveController@getPathArray');

311
routes/breadcrumbs.php Normal file
View 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));
});

View File

@@ -28,65 +28,67 @@ Route::get('/activity/{id}', 'ComplementaryActivityController@show');
Route::get('/picture/{id}', 'PictureController@show'); Route::get('/picture/{id}', 'PictureController@show');
Route::get('/pictures', 'PictureController@index'); 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 */ /* Espace Administration Route */
/** Dashboard & General */ /** Dashboard & General */
Route::get('/admin', 'AdminController@index')->name('admin'); Route::get('/admin', 'AdminController@index')->name('dashboard');
Route::get('/admin/update', 'AdminController@update'); Route::get('/admin/update', 'AdminController@update')->name('update');
Route::get('/admin/status','AdminController@status'); Route::get('/admin/status','AdminController@status')->name('status');
/** Schedule */ /** Schedule */
Route::get('/admin/schedule', 'CalendarController@index')->middleware('perm:schedule_see'); 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'); 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'); 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'); 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/add','EventController@Store')->middleware('perm:schedule_add');
Route::post('/admin/schedule/event/edit/{id}','EventController@update')->middleware('perm:schedule_edit'); Route::post('/admin/schedule/event/edit/{id}','EventController@update')->middleware('perm:schedule_edit');
/** Statistique */ /** 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 */ /** Message */
Route::get('/admin/message' , 'MessageController@index')->middleware('perm:msg_see'); Route::get('/admin/message' , 'MessageController@index')->middleware('perm:msg_see')->name('message');
Route::get('/admin/message/add' , 'MessageController@create')->middleware('perm:msg_add'); 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::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 */ /** User */
Route::get('/admin/user' , 'UserController@index')->middleware('perm:user_see'); Route::get('/admin/user' , 'UserController@index')->middleware('perm:user_see')->name('user');
Route::get('/admin/user/add' , 'UserController@create')->middleware('perm:user_add'); 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::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'); Route::post('/admin/user/edit/{id}' , 'UserController@update')->middleware('perm:user_edit');
/** Config */ /** 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::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' , 'ComplementaryActivityController@index')->middleware('perm:config_edit')->name('config.complementary-activity');
Route::get('/admin/config/activity/add' , 'ComplementaryActivityController@create')->middleware('perm:config_edit'); 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::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/activity/edit/{id}' , 'ComplementaryActivityController@update')->middleware('perm:config_edit');
Route::post('/admin/config/general/edit','ConfigController@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/' , 'ConfigController@index')->middleware('perm:config_edit')->name('config');
Route::get('/admin/config/customisation','ConfigController@customisation')->middleware('perm:config_edit'); 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::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','RankController@index')->middleware('perm:config_edit')->name('config.rank');
Route::get('/admin/config/ranks/add','RankController@create')->middleware('perm:config_edit'); 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::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::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','JobController@index')->middleware('perm:config_edit')->name('config.jobs');
Route::get('/admin/config/jobs/add','JobController@create')->middleware('perm:config_edit'); 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::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::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'); Route::post('/admin/config/files' , 'ConfigController@editfilesConfig')->middleware('perm:config_edit');
/** Public page */ /** Public page */
@@ -94,33 +96,33 @@ Route::middleware(['auth'])->group(function () {
Route::post('/admin/public/edit/{config}', 'PublicController@update')->middleware('perm:config_edit'); Route::post('/admin/public/edit/{config}', 'PublicController@update')->middleware('perm:config_edit');
/** Picture */ /** Picture */
Route::get('/admin/picture','PictureController@indexAdmin')->middleware('perm:picture_see'); Route::get('/admin/picture','PictureController@indexAdmin')->middleware('perm:picture_see')->name('picture');
Route::get('/admin/picture/add','PictureController@create')->middleware('perm:picture_add'); 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::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'); Route::post('/admin/picture/edit/{id}','PictureController@update')->middleware('perm:picture_edit');
/** Inventory */ /** Inventory */
Route::get('/admin/inventory' , 'InventoryController@index')->middleware('perm:inventory_see'); Route::get('/admin/inventory' , 'InventoryController@index')->middleware('perm:inventory_see')->name('inv');
Route::get('/admin/inventory/management','InventoryController@management')->middleware('perm:inventory_edit'); Route::get('/admin/inventory/management','InventoryController@management')->middleware('perm:inventory_edit')->name('inv.management');
/** Item Category */ /** Item Category */
Route::get('/admin/inventory/management/category','ItemCategoryController@index')->middleware('perm:inventory_edit'); 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'); 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::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'); Route::post('/admin/inventory/management/category/edit/{id}','ItemCategoryController@update')->middleware('perm:inventory_edit');
/** News */ /** News */
Route::get('/admin/news','NewsController@indexAdmin')->middleware('perm:news_see'); Route::get('/admin/news','NewsController@indexAdmin')->middleware('perm:news_see')->name('news');
Route::get('/admin/news/add','NewsController@create')->middleware('perm:news_add'); 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::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'); Route::post('/admin/news/edit/{id}','NewsController@update')->middleware('perm:news_edit');
/** Articles */ /** Articles */
Route::get('/admin/article','ArticleController@index')->middleware('perm:article_see'); 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'); 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::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}','ArticleController@pictureActivity')->middleware('perm:article_edit');
Route::get('/admin/article/activity/picture/{id}/add','ArticleController@pictureActivityCreate')->middleware('perm:article_edit'); Route::get('/admin/article/activity/picture/{id}/add','ArticleController@pictureActivityCreate')->middleware('perm:article_edit');
@@ -144,38 +146,38 @@ Route::middleware(['auth'])->group(function () {
/** Notification */ /** Notification */
Route::get('/admin/notication/mark','UserController@notificationmarkALL'); Route::get('/admin/notication/mark','UserController@notificationmarkALL');
Route::post('/admin/notication/mark/{id}','UserController@notificationmark'); Route::post('/admin/notication/mark/{id}','UserController@notificationmark');
Route::get('/ecc/notication/mark','UserController@notificationmarkALL');
Route::post('/ecc/notication/mark/{id}','UserController@notificationmarkECC');
/** Profil */ /** Profil */
Route::get('/admin/profil/avatar' , 'UserController@UserAvatar'); Route::get('/admin/profil/avatar' , 'UserController@UserAvatar')->name('profil.avatar');
Route::get('/admin/profil/password' , 'UserController@UserPassword'); Route::get('/admin/profil/password' , 'UserController@UserPassword')->name('profil.psw');
Route::get('/admin/profil/adress' , 'UserController@UserAdress'); Route::get('/admin/profil/adress' , 'UserController@UserAdress')->name('profil.adress');
Route::post('/admin/profil/edit/adress' , 'UserController@editUserAdress'); Route::post('/admin/profil/edit/adress' , 'UserController@editUserAdress');
Route::post('/admin/profil/edit/password' , 'UserController@editUserPassword'); Route::post('/admin/profil/edit/password' , 'UserController@editUserPassword');
Route::get('/admin/profil/edit/avatar/{id}' , 'UserController@editUserAvatar'); 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 */ /** Files */
Route::get('/file/get','GoogleDriveController@getFile')->middleware('perm:file_see');
Route::post('/file/create','GoogleDriveController@createFile'); Route::post('/file/create','GoogleDriveController@createFile');
Route::post('/file/upload','GoogleDriveController@uploadFile'); Route::post('/file/upload','GoogleDriveController@uploadFile');
Route::post('/folder/create','GoogleDriveController@createFolder'); Route::post('/folder/create','GoogleDriveController@createFolder');
Route::get('/file/delete','GoogleDriveController@deleteFile')->middleware('perm:file_delete'); Route::get('/file/delete','GoogleDriveController@deleteFile')->middleware('perm:file_delete');
Route::get('/folder/delete','GoogleDriveController@deleteDir')->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/files','FilesController@index')->middleware('perm:file_see')->name('files');
Route::get('/admin/guide','FilesController@guide')->middleware('perm:file_see'); Route::get('/admin/guide','FilesController@guide')->middleware('perm:file_see')->name('guide');
Route::get('/admin/drive/{folder?}','GoogleDriveController@index')->middleware('perm:file_see'); 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 */ /** OCOM */
Route::get('/admin/ocom','OCOMController@index'); Route::get('/admin/ocom','OCOMController@index')->name('ocom');
Route::get('/admin/ocom/generate','OCOMController@showgenerate'); Route::get('/admin/ocom/generate','OCOMController@showgenerate')->name('ocom.generate');
Route::put('/admin/ocom/generate','OCOMController@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::put('/admin/ocom/add','OCOMController@store');
Route::get('/admin/ocom/edit/{id}','OCOMController@edit'); Route::get('/admin/ocom/{id}/edit','OCOMController@edit')->name('ocom.edit');
Route::patch('/admin/ocom/edit/{id}','OCOMController@update'); Route::patch('/admin/ocom/{id}/edit','OCOMController@update');
Route::get('/admin/ocom/{id}','OCOMController@show'); Route::get('/admin/ocom/{id}','OCOMController@show')->name('ocom.show');
}); });