Commit 44a604c3 authored by Goldenscarab's avatar Goldenscarab

Mise à jour avec générateur de code

parent 5cadf314
......@@ -14,12 +14,12 @@ use Modules\Small\Http\Repositories\SmallRepository;
class SmallController extends Controller
{
private $small_repo;
private $repository;
public function __construct(SmallRepository $small_repo)
public function __construct(SmallRepository $repository)
{
$this->small_repo = $small_repo;
$this->repository = $repository;
}
/**
......@@ -28,15 +28,21 @@ class SmallController extends Controller
*/
public function index(Request $request)
{
$sort = $request->get('sort', 'id');
$direction = $request->get('direction', 'asc');
$persmall = $request->get('perpage', 15);
$search = $request->get('search');
$sort = $request->get('sort', 'id');
$direction = $request->get('direction', 'asc');
$perpage = $request->get('perpage', 15);
$search = $request->get('search');
$filter = $request->get('filter');
$include = $request->get('include');
$smalls = $this->small_repo->list($sort, $direction, $persmall, $search);
$smalls->load('user');
$resources = $this->repository->list($sort, $direction, $perpage, $search, $filter);
return response()->json($smalls);
// Ajout des relations
if (!empty($include)) {
$resources->load($include);
}
return response()->json($resources);
}
/**
......@@ -56,10 +62,10 @@ class SmallController extends Controller
*/
public function show(Request $request, $public_id)
{
$small = $this->small_repo->findOrfail($public_id);
$resource = $this->repository->findOrfail($public_id);
// Retourne avec un cache en secondes
return response()->json($small)->header('Cache-Control', 'max-age=60');
return response()->json($resource);
}
/**
......
......@@ -24,7 +24,7 @@ class ConfigController extends Controller
'config' => null
);
return view('small::app.config.form')->with([
return view('small::config.form')->with([
'title' => '<i class="fa fa-cogs mr-2" aria-hidden="true"></i>Module Small',
'subtitle' => 'Configuration',
'config' => $config,
......
......@@ -7,21 +7,22 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Small\Exports\SmallExport;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Response;
use Illuminate\Contracts\Support\Renderable;
use Modules\Small\Exports\SmallExport;
use Modules\Small\Http\Requests\SmallStoreRequest;
use Modules\Small\Http\Repositories\SmallRepository;
class SmallController extends Controller
{
private $small_repo;
private $repository;
public function __construct(SmallRepository $small)
{
$this->small_repo = $small;
$this->repository = $small;
// Définition des permissions par méthode
$this->middleware('permission:module-small-read')->only(['index']);
......@@ -43,8 +44,8 @@ class SmallController extends Controller
'Exemples' => null
);
return view('small::app.small.index')->with([
'title' => '<i class="fa fa-magic mr-1" aria-hidden="true"></i>Exemples',
return view('small::small.index')->with([
'title' => '<i class="fa fa-magic mr-2" aria-hidden="true"></i>Exemples',
'breadcrumb' => $breadcrumb,
]);
}
......@@ -55,7 +56,7 @@ class SmallController extends Controller
*/
public function create()
{
$small = $this->small_repo->new();
$small = $this->repository->new();
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
......@@ -63,8 +64,8 @@ class SmallController extends Controller
'Ajouter' => null
);
return view('small::app.small.form')->with([
'title' => '<i class="fa fa-magic mr-1" aria-hidden="true"></i>Exemples',
return view('small::small.form')->with([
'title' => '<i class="fa fa-magic mr-2" aria-hidden="true"></i>Exemples',
'action' => '<i class="fa fa-plus mr-2"></i>Création',
'breadcrumb' => $breadcrumb,
'item' => $small
......@@ -78,7 +79,7 @@ class SmallController extends Controller
*/
public function edit($id)
{
$small = $this->small_repo->findOrFail($id);
$small = $this->repository->findOrFail($id);
$breadcrumb = array(
......@@ -87,8 +88,8 @@ class SmallController extends Controller
'Modifier' => null
);
return view('small::app.small.form')->with([
'title' => '<i class="fa fa-magic mr-1"></i>Exemples',
return view('small::small.form')->with([
'title' => '<i class="fa fa-magic mr-2"></i>Exemples',
'action' => '<i class="fa fa-plus mr-2"></i>Modification',
'breadcrumb' => $breadcrumb,
'item' => $small
......@@ -113,7 +114,7 @@ class SmallController extends Controller
*/
public function show(Request $request, $id)
{
$small = $this->small_repo->findOrFail($id);
$small = $this->repository->findOrFail($id);
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
......@@ -121,8 +122,8 @@ class SmallController extends Controller
'Voir' => null
);
return view('small::app.small.show')->with([
'title' => '<i class="fa fa-magic mr-1"></i>Exemples',
return view('small::small.show')->with([
'title' => '<i class="fa fa-magic mr-2"></i>Exemples',
'subtitle' => $small->name,
'breadcrumb' => $breadcrumb,
'item' => $small
......@@ -133,24 +134,30 @@ class SmallController extends Controller
* Update the specified resource in storage.
* @param SmallStoreRequest $request
* @param int $id
* @return Renderable
* @return Redirect
*/
public function update(SmallStoreRequest $request, $id)
{
$small_data = collect($request->except(['_token']));
$small = $this->small_repo->store($small_data, $id);
$small = $this->repository->store($small_data, $id);
Session::flash('success', "Exemple ". (is_null($id) ? 'créé' : 'modifié') . " avec succès");
return Redirect::route('module.small.index');
}
/**
* Duplicate the specified resource in storage
*
* @param int $id
* @return Redirect
*/
public function duplicate($id)
{
$this->checkPermissionAccess($id);
$this->small_repo->duplicate($id);
$this->repository->duplicate($id);
Session::flash('success', "Exemple dupliqué avec succès");
......@@ -160,13 +167,13 @@ class SmallController extends Controller
/**
* Remove the specified resource from storage.
* @param int $id
* @return Renderable
* @return Redirect
*/
public function destroy($id)
{
$this->checkPermissionAccess($id);
$this->small_repo->destroy($id);
$this->repository->destroy($id);
Session::flash('success', 'Exemple supprimé avec succès');
......@@ -177,7 +184,7 @@ class SmallController extends Controller
* Exporte les données de la exemple
*
* @param int $id
* @return void
* @return Response
*/
public function export()
{
......
......@@ -8,35 +8,17 @@ use Modules\Small\Models\Small;
use Goldenscarab\Modulus\App\Http\Repositories\RepositoryInterface;
class SmallRepository implements RepositoryInterface {
class SmallRepository implements RepositoryInterface
{
public function all($columns = array('*'))
{
return Small::select($columns)->orderBy('id', 'asc')->get();
}
public function list($sorting, $direction = 'asc', $perpage = 15, $search = "", $user_id = null)
public function list($sorting, $direction = 'asc', $perpage = 15, $search = "", $filter = null)
{
// Si tri via relation
if (Str::contains($sorting, '.')) {
// Préparation de la jointure
$relation_filter = explode('.', $sorting);
$table_join = $relation_filter[0];
$primary_key = $table_join . '.id';
$foreign_key = Str::singular(collect(explode('_', $table_join))->last()) . '_id';
// Récupération des éléments
$list = Small::select('small.*')
->join($table_join, $primary_key, '=', $foreign_key)
->user($user_id)
->orderBy($sorting, $direction)
->search($search)->paginate($perpage);
} else {
$list = Small::search($search)->user($user_id)->orderBy($sorting, $direction)->paginate($perpage);
}
return $list;
return Small::search($search)->filter($filter)->sortBy($sorting, $direction)->paginate($perpage);
}
public function published($columns = array('*'))
......@@ -52,17 +34,17 @@ class SmallRepository implements RepositoryInterface {
public function store(Collection $data, $id = null)
{
if (is_null($id)) {
$small = new Small;
$resource = new Small;
} else {
$small = Small::findOrFail($id);
$resource = Small::findOrFail($id);
}
$small->name = $data->get('name');
$small->user_id = $data->get('user_id');
$resource->name = $data->get('name');
$resource->user_id = $data->get('user_id');
$small->save();
$resource->save();
return $small;
return $resource;
}
public function find($id, $columns = array('*'))
......@@ -118,8 +100,8 @@ class SmallRepository implements RepositoryInterface {
public function duplicate($id)
{
$item = Small::findOrFail($id);
$clone = $item->replicate();
$resource = Small::findOrFail($id);
$clone = $resource->replicate();
$availables = ['title', 'name', 'label', 'slug'];
......@@ -144,13 +126,13 @@ class SmallRepository implements RepositoryInterface {
private function calcNextPosition()
{
$item = Small::orderBy('position', 'desc')->first();
$resource = Small::orderBy('position', 'desc')->first();
if (is_null($item)) {
if (is_null($resource)) {
return 1;
}
return $item->position + 1;
return $resource->position + 1;
}
}
......@@ -2,14 +2,18 @@
namespace Modules\Small\Models;
use Illuminate\Database\Eloquent\Model;
use Goldenscarab\Modulus\App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Goldenscarab\Modulus\App\Traits\ModelSortable;
use Goldenscarab\Modulus\App\Traits\ModelFilterable;
use Goldenscarab\Modulus\App\Traits\ModelSearchable;
class Small extends Model
{
use ModelSortable, ModelFilterable, ModelSearchable;
protected $table = 'module_smalls';
protected $fillable = [];
......@@ -23,7 +27,7 @@ class Small extends Model
protected $appends = [];
/* Relation */
/* Relations */
public function user()
{
return $this->belongsTo(User::class, 'user_id');
......
......@@ -42,7 +42,7 @@
];
$params_list = [
'source' => route('api.module.small.index'),
'source' => route('api.module.small.index', ['include' => ['user']),
'menu' => [
'button' => $am->make('[READ]', ['attributes' => ['class' => 'btn-sm btn-success']]),
'dropdown' => [
......
......@@ -5,7 +5,7 @@ namespace Goldenscarab\Modulus\App\Console\Modulus;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
class EmailTest extends Command
class EmailTestCommand extends Command
{
/**
* The name and signature of the console command.
......@@ -42,7 +42,7 @@ class EmailTest extends Command
$this->line(vsprintf('Expéditeur: %s <%s>', [config('mail.from.name'), config('mail.from.address')]));
$this->line(sprintf('Destinataire: %s', $this->argument('email')));
Mail::raw('Félicitation ! La configuration mail est bien opérationnelle', function($msg) {
Mail::raw('Félicitation ! La configuration mail est bien opérationnelle', function ($msg) {
$msg->to($this->argument('email'))->subject('Modulus Test Email');
});
......
<?php
namespace Goldenscarab\Modulus\App\Console\Modulus;
use Illuminate\Support\Str;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;
use Goldenscarab\Modulus\App\Support\Stub;
class MakeResourceCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'modulus:make-resource
{resource : The name of resource (identique model) will be created.}
{module : The name of module will be used.}
{--table= : Specific table name}
{--uri= : Specific URI}';
/**
* The console command description.
*
* @var string
*/
protected $description = "Ajout d'une resource complète à un module (migration, model, repository, form-request, controler, view, route)";
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
// TODO - Gérer le front / back ou app
$this->alert("Création d'une nouvelle resource...");
$this->displayResume();
if ($this->confirm('Voulez-vous continuer ?')) {
$this->info("Création des fichiers : ");
$this->putMigrationFile();
$this->putFactoryFile();
$this->putSeederFile();
$this->putModelFile();
$this->putRepositoryFile();
$this->putRequestFiles();
$this->putExportFile();
$this->putAppControllerFile();
$this->putApiControllerFile();
$this->putViewFiles();
$this->putTestFile();
$this->newLine();
$this->info("Modification des fichiers : ");
$this->updateRouteFiles();
$this->newLine();
$this->info('✔ Resource créée avec succès');
$this->newLine();
$this->info('Migrations : <fg=cyan>php artisan module:migrate --seed ' . $this->getModuleName() . '</>');
$this->newLine();
}
}
private function createUrlPath()
{
return vsprintf('%s/%s', [
url('/'),
str_replace('.', '/', $this->createRoutePrefix())
]);
}
private function createModelClassName()
{
return Str::singular($this->getResourceName());
}
private function createModelPathName()
{
return vsprintf('/Models/%s.php', [
$this->createModelClassName()
]);
}
private function createTableName()
{
$prefix = 'module';
if (!empty($this->option('table'))) {
$table = $this->option('table');
} else {
$table = vsprintf('%s_%s_%s', [
$prefix,
strtolower($this->getModuleName()),
Str::plural(Str::snake($this->createModelClassName()))
]);
}
return $table;
}
private function createMigrationClassName()
{
$prefix = 'Create';
$suffix = 'Table';
$class = vsprintf('%s%s%s', [
$prefix,
Str::studly($this->createTableName()),
$suffix
]);
return $class;
}
private function createMigrationPathName()
{
return vsprintf('/Database/Migrations/%s_%s.php', [
date('Y_m_d_His'),
Str::snake($this->createMigrationClassName())
]);
}
private function createFactoryClassName()
{
$class = sprintf('%sFactory', $this->createModelClassName());
return $class;
}
private function createFactoryPathName()
{
return vsprintf('/Database/factories/%s.php', [
$this->createFactoryClassName()
]);
}
private function createSeederClassName()
{
$class = sprintf('%sSeeder', $this->createModelClassName());
return $class;
}
private function createSeederPathName()
{
return vsprintf('/Database/Seeders/%s.php', [
$this->createSeederClassName()
]);
}
private function createRepositoryClassName()
{
return sprintf('%sRepository', $this->createModelClassName());
}
private function createRepositoryPathName()
{
return vsprintf('/Http/Repositories/%s.php', [
$this->createRepositoryClassName()
]);
}
private function createRequestWebClassName($name)
{
if (!in_array($name, ['index', 'show', 'store', 'update', 'destroy'])) {
return;
}
return vsprintf('%s%sWebRequest', [
$this->createModelClassName(),
Str::studly($name)
]);
}
private function createRequestApiClassName($name)
{
if (!in_array($name, ['index', 'show', 'store', 'update', 'destroy'])) {
return;
}
return vsprintf('%s%sApiRequest', [
$this->createModelClassName(),
Str::studly($name)
]);
}
private function createRequestWebPathName($name)
{
if (!in_array($name, ['index', 'show', 'store', 'update', 'destroy'])) {
return;
}
return vsprintf('/Http/Requests/%s/%s.php', [
$this->createModelClassName(),
$this->createRequestWebClassName($name)
]);
}
private function createRequestApiPathName($name)
{
if (!in_array($name, ['index', 'show', 'store', 'update', 'destroy'])) {
return;
}
return vsprintf('/Http/Requests/%s/%s.php', [
$this->createModelClassName(),
$this->createRequestApiClassName($name)
]);
}
private function createExportClassName()
{
return sprintf('%sExport', $this->createModelClassName());
}
private function createExportPathName()
{
return vsprintf('/Exports/%s.php', [
$this->createExportClassName()
]);
}
private function createControllerClassName()
{
return sprintf('%sController', $this->createModelClassName());
}
private function createAppControllerPathName()
{
return vsprintf('/Http/Controllers/App/%s.php', [
$this->createControllerClassName()
]);
}
private function createApiControllerPathName()
{
return vsprintf('/Http/Controllers/Api/%s.php', [
$this->createControllerClassName()
]);
}
private function createViewPrefix()
{
return vsprintf('%s::%s', [
strtolower($this->getModuleName()),
Str::snake($this->createModelClassName(), '-'),
]);
}
private function createRoute()
{
return Str::plural(Str::snake($this->createModelClassName(), '-'));
}
private function createRoutePrefix()
{
return vsprintf('module.%s.%s', [
strtolower($this->getModuleName()),
$this->createRoute()
]);
}
private function createViewFolderPath()
{
return vsprintf('/Resources/views/%s/', [
Str::snake($this->createModelClassName(), '-')
]);
}
private function createTestClassName()
{
return sprintf('%sTest', $this->createModelClassName());
}
private function createTestPathName()
{
return vsprintf('/Tests/Unit/%s.php', [
$this->createTestClassName()
]);
}
private function createNamespaceFromPath($path)
{
preg_match('/\/([^.]*)\/.*.php/', $path, $matches);
$namespace = str_replace('/', '\\', $matches[1]);
return vsprintf('Modules\\%s\\%s', [
$this->getModuleName(),
$namespace
]);
}
private function createPrefixPermission()
{
return sprintf('module-%s', strtolower($this->getModuleName()));
}
private function displayResume()
{
$this->warn('Module : ' . sprintf('<fg=cyan>%s</>', $this->getModuleName()));
$this->warn('Table : ' . sprintf('<fg=cyan>%s</>', $this->createTableName()));
$this->warn('Url : ' . sprintf('<fg=cyan>%s</>', $this->createUrlPath()));
$this->newLine();
$this->line('Liste des fichiers allant être créés : ');
$this->table(
['Nom', 'Fichier', 'Classe'],
[
['Migration', $this->createMigrationPathName(), sprintf('<fg=cyan>%s</>', $this->createMigrationClassName())],
['Factory', $this->createFactoryPathName(), $this->createNamespaceFromPath($this->createFactoryPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createFactoryClassName())],
['Seeder', $this->createSeederPathName(), $this->createNamespaceFromPath($this->createSeederPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createSeederClassName())],
['Model', $this->createModelPathName(), $this->createNamespaceFromPath($this->createModelPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createModelClassName())],
['Respository', $this->createRepositoryPathName(), $this->createNamespaceFromPath($this->createRepositoryPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createRepositoryClassName())],
['FormRequest Api Index', $this->createRequestApiPathName('index'), $this->createNamespaceFromPath($this->createRequestApiPathName('index')) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createRequestApiClassName('index'))],
['FormRequest Api Store', $this->createRequestApiPathName('store'), $this->createNamespaceFromPath($this->createRequestApiPathName('store')) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createRequestApiClassName('store'))],
['FormRequest Api Show', $this->createRequestApiPathName('show'), $this->createNamespaceFromPath($this->createRequestApiPathName('show')) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createRequestApiClassName('show'))],
['FormRequest Api Update', $this->createRequestApiPathName('update'), $this->createNamespaceFromPath($this->createRequestApiPathName('update')) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createRequestApiClassName('update'))],
['FormRequest Api Destroy', $this->createRequestApiPathName('destroy'), $this->createNamespaceFromPath($this->createRequestApiPathName('destroy')) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createRequestApiClassName('destroy'))],
['FormRequest Web Store', $this->createRequestWebPathName('store'), $this->createNamespaceFromPath($this->createRequestWebPathName('store')) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createRequestWebClassName('store'))],
['Export', $this->createExportPathName(), $this->createNamespaceFromPath($this->createExportPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createExportClassName())],
['Controller App', $this->createAppControllerPathName(), $this->createNamespaceFromPath($this->createAppControllerPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createControllerClassName())],
['Controller Api', $this->createApiControllerPathName(), $this->createNamespaceFromPath($this->createApiControllerPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createControllerClassName())],
['Test', $this->createTestPathName(), $this->createNamespaceFromPath($this->createTestPathName()) . '' . chr(0) . sprintf('<fg=cyan>%s</>', $this->createTestClassName())],
['View index', $this->createViewFolderPath() . 'index.blade.php', '-'],
['View show', $this->createViewFolderPath() . 'show.blade.php', '-'],
['View form', $this->createViewFolderPath() . 'form.blade.php', '-'],
]
);
}
private function putMigrationFile()
{
$pathname = module_path($this->getModuleName()) . $this->createMigrationPathName();
// Suppression des fichiers précédement créés
$check_path = preg_replace('/\d{4}_\d{2}_\d{2}_\d{6}/', '*', $pathname);
$existing = File::glob($check_path);
foreach($existing as $file) {
File::delete($file);
}
$content = (new Stub('migration.stub', [
'TABLE' => $this->createTableName(),
'CLASS' => $this->createMigrationClassName(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createMigrationPathName());
}
private function putFactoryFile()
{
$pathname = module_path($this->getModuleName()) . $this->createFactoryPathName();
$content = (new Stub('factory.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createFactoryPathName()),
'MODULE' => $this->getModuleName(),
'CLASS' => $this->createFactoryClassName(),
'MODEL' => $this->createModelClassName()
]))->render();
File::put($pathname, $content);
$this->comment($this->createFactoryPathName());
}
private function putSeederFile()
{
$pathname = module_path($this->getModuleName()) . $this->createSeederPathName();
$content = (new Stub('seeder.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createSeederPathName()),
'MODULE' => $this->getModuleName(),
'FACTORY' => $this->createFactoryClassName(),
'CLASS' => $this->createSeederClassName(),
'TABLE' => $this->createTableName(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createSeederPathName());
}
private function putModelFile()
{
$pathname = module_path($this->getModuleName()) . $this->createModelPathName();
$content = (new Stub('model.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createModelPathName()),
'MODULE' => $this->getModuleName(),
'FACTORY' => $this->createFactoryClassName(),
'CLASS' => $this->createModelClassName(),
'TABLE' => $this->createTableName(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createModelPathName());
}
private function putRepositoryFile()
{
$pathname = module_path($this->getModuleName()) . $this->createRepositoryPathName();
$content = (new Stub('repository.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRepositoryPathName()),
'MODULE' => $this->getModuleName(),
'MODEL' => $this->createModelClassName(),
'CLASS' => $this->createRepositoryClassName()
]))->render();
File::put($pathname, $content);
$this->comment($this->createRepositoryPathName());
}
private function putRequestFiles()
{
// Api Index
$type = 'index';
$pathname = module_path($this->getModuleName()) . $this->createRequestApiPathName($type);
$dirname = Str::of($pathname)->dirname();
if (!File::isWritable($dirname)) {
File::makeDirectory($dirname);
}
$content = (new Stub('requests/' . $type . '.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRequestApiPathName($type)),
'CLASS' => $this->createRequestApiClassName($type),
'GUARD' => "'api'",
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createRequestApiPathName($type));
// Api Show
$type = 'show';
$pathname = module_path($this->getModuleName()) . $this->createRequestApiPathName($type);
$content = (new Stub('requests/' . $type . '.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRequestApiPathName($type)),
'CLASS' => $this->createRequestApiClassName($type),
'GUARD' => "'api'",
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createRequestApiPathName($type));
// Api Store
$type = 'store';
$pathname = module_path($this->getModuleName()) . $this->createRequestApiPathName($type);
$content = (new Stub('requests/' . $type . '.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRequestApiPathName($type)),
'CLASS' => $this->createRequestApiClassName($type),
'GUARD' => "'api'",
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createRequestApiPathName($type));
// Api Update
$type = 'update';
$pathname = module_path($this->getModuleName()) . $this->createRequestApiPathName($type);
$content = (new Stub('requests/' . $type . '.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRequestApiPathName($type)),
'CLASS' => $this->createRequestApiClassName($type),
'GUARD' => "'api'",
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createRequestApiPathName($type));
// Api Destroy
$type = 'destroy';
$pathname = module_path($this->getModuleName()) . $this->createRequestApiPathName($type);
$content = (new Stub('requests/' . $type . '.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRequestApiPathName($type)),
'CLASS' => $this->createRequestApiClassName($type),
'GUARD' => "'api'",
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createRequestApiPathName($type));
// Web Store
$type = 'store';
$pathname = module_path($this->getModuleName()) . $this->createRequestWebPathName($type);
$content = (new Stub('requests/' . $type . '.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRequestWebPathName($type)),
'CLASS' => $this->createRequestWebClassName($type),
'GUARD' => "",
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createRequestWebPathName($type));
}
private function putExportFile()
{
$pathname = module_path($this->getModuleName()) . $this->createExportPathName();
$content = (new Stub('export.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createExportPathName()),
'MODULE' => $this->getModuleName(),
'CLASS' => $this->createExportClassName(),
'REPOSITORY' => $this->createRepositoryClassName()
]))->render();
File::put($pathname, $content);
$this->comment($this->createExportPathName());
}
private function putAppControllerFile()
{
$pathname = module_path($this->getModuleName()) . $this->createAppControllerPathName();
$content = (new Stub('controllers/app.stub', [
'CLASS' => $this->createControllerClassName(),
'MODEL' => $this->createModelClassName(),
'MODULE' => $this->getModuleName(),
'EXPORT' => $this->createExportClassName(),
'REQUEST_INDEX' => $this->createRequestWebClassName('index'),
'REQUEST_SHOW' => $this->createRequestWebClassName('show'),
'REQUEST_STORE' => $this->createRequestWebClassName('store'),
'REQUEST_UPDATE' => $this->createRequestWebClassName('update'),
'REQUEST_DESTROY' => $this->createRequestWebClassName('destroy'),
'NAMESPACE' => $this->createNamespaceFromPath($this->createAppControllerPathName()),
'REPOSITORY' => $this->createRepositoryClassName(),
'VIEW_PREFIX' => $this->createViewPrefix(),
'ROUTE_PREFIX' => $this->createRoutePrefix(),
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createAppControllerPathName());
}
private function putApiControllerFile()
{
$pathname = module_path($this->getModuleName()) . $this->createApiControllerPathName();
$content = (new Stub('controllers/api.stub', [
'CLASS' => $this->createControllerClassName(),
'MODEL' => $this->createModelClassName(),
'MODULE' => $this->getModuleName(),
'REQUEST_INDEX' => $this->createRequestApiClassName('index'),
'REQUEST_SHOW' => $this->createRequestApiClassName('show'),
'REQUEST_STORE' => $this->createRequestApiClassName('store'),
'REQUEST_UPDATE' => $this->createRequestApiClassName('update'),
'REQUEST_DESTROY' => $this->createRequestApiClassName('destroy'),
'NAMESPACE' => $this->createNamespaceFromPath($this->createApiControllerPathName()),
'REPOSITORY' => $this->createRepositoryClassName(),
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createApiControllerPathName());
}
private function putTestFile()
{
$pathname = module_path($this->getModuleName()) . $this->createTestPathName();
$content = (new Stub('test.stub', [
'CLASS' => $this->createTestClassName(),
'MODULE' => $this->getModuleName(),
'NAMESPACE' => $this->createNamespaceFromPath($this->createTestPathName()),
'MODEL' => $this->createModelClassName(),
'FACTORY' => $this->createFactoryClassName(),
'ROUTE_PREFIX' => $this->createRoutePrefix(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createTestPathName());
}
private function putViewFiles()
{
$path = module_path($this->getModuleName()) . $this->createViewFolderPath();
if (!File::isWritable($path)) {
File::makeDirectory($path);
}
// index.blade.php
$filename = 'index.blade.php';
$pathname = $path . $filename;
$content = (new Stub('views/index.stub', [
'ROUTE_PREFIX' => $this->createRoutePrefix(),
'PERMISSION_PREFIX' => $this->createPrefixPermission(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createViewFolderPath() . $filename);
// show.blade.php
$filename = 'show.blade.php';
$pathname = $path . $filename;
$content = (new Stub('views/show.stub', [
'ROUTE_PREFIX' => $this->createRoutePrefix(),
]))->render();
File::put($pathname, $content);
$this->comment($this->createViewFolderPath() . $filename);
// form.blade.php
$filename = 'form.blade.php';
$pathname = $path . $filename;
$content = (new Stub('views/form.stub', []))->render();
File::put($pathname, $content);
$this->comment($this->createViewFolderPath() . $filename);
}
private function updateRouteFiles()
{
// Fichier web.php
$pathname = module_path($this->getModuleName()) . '/Routes/web.php';
$content = PHP_EOL;
$content .= (new Stub('routes/web.stub', [
'ROUTE' => $this->createRoute(),
'MODEL' => $this->createModelClassName(),
'CONTROLLER' => $this->createControllerClassName()
]))->render();
// Récupération du contenu actuel du fichier
$existing = File::get($pathname);
// Suppression d'une précédente génération
$existing = str_replace($content, '', $existing);
// Ajout à la fin du fichier
$new = preg_replace('/^(\}\);)$/m', $content . '});', $existing);
File::put($pathname, $new);
$this->comment('/Routes/web.php');
// Fichier api.php
$pathname = module_path($this->getModuleName()) . '/Routes/api.php';
$content = PHP_EOL;
$content .= (new Stub('routes/api.stub', [
'ROUTE' => $this->createRoute(),
'MODEL' => $this->createModelClassName(),
'CONTROLLER' => $this->createControllerClassName()
]))->render();
// Récupération du contenu actuel du fichier
$existing = File::get($pathname);
// Suppression d'une précédente génération
$existing = str_replace($content, '', $existing);
// Ajout à la fin du fichier
$new = preg_replace('/^(\}\);)$/m', $content . '});', $existing);
File::put($pathname, $new);
$this->comment('/Routes/api.php');
}
private function getResourceName()
{
return Str::studly($this->argument('resource'));
}
private function getModuleName()
{
return Str::studly($this->argument('module'));
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Modules\$MODULE$\Http\Requests\$MODEL$\$REQUEST_INDEX$;
use Modules\$MODULE$\Http\Requests\$MODEL$\$REQUEST_SHOW$;
use Modules\$MODULE$\Http\Requests\$MODEL$\$REQUEST_STORE$;
use Modules\$MODULE$\Http\Requests\$MODEL$\$REQUEST_UPDATE$;
use Modules\$MODULE$\Http\Requests\$MODEL$\$REQUEST_DESTROY$;
use Modules\$MODULE$\Http\Repositories\$REPOSITORY$;
class $CLASS$ extends Controller
{
private $repository;
public function __construct($REPOSITORY$ $repository)
{
$this->repository = $repository;
}
/**
* Display a listing of the resources.
* @return Response
*/
public function index($REQUEST_INDEX$ $request)
{
$sort = $request->get('sort', 'id');
$direction = $request->get('direction', 'asc');
$perpage = $request->get('perpage', 13);
$search = $request->get('search');
$filter = $request->get('filter');
$include = $request->get('include');
$resources = $this->repository->list($sort, $direction, $perpage, $search, $filter);
// Ajout des relations
if (!empty($include)) {
$resources->load($include);
}
return response()->json($resources);
}
/**
* Show the specified resource.
* @param int $id
* @return Response
*/
public function show($REQUEST_SHOW$ $request, $id)
{
$resources = $this->repository->findOrfail($id);
return response()->json($resources);
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Response
*/
public function store($REQUEST_STORE$ $request)
{
$data = $request->except(['_token']);
$resource = $this->repository->store($data);
return response()->json($resource);
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Response
*/
public function update($REQUEST_UPDATE$ $request, $id)
{
$data = $request->except(['_token']);
$resource = $this->repository->store($data, $id);
return response()->json($resource);
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Response
*/
public function destroy($REQUEST_DESTROY$ $request, $id)
{
$this->repository->destroy($id);
return response()->noContent();
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Routing\Controller;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Response;
use Modules\$MODULE$\Exports\$EXPORT$;
use Illuminate\Contracts\Support\Renderable;
use Modules\$MODULE$\Http\Requests\$MODEL$\$REQUEST_STORE$;
use Modules\$MODULE$\Http\Repositories\$REPOSITORY$;
class $CLASS$ extends Controller
{
private $repository;
public function __construct($REPOSITORY$ $repository)
{
$this->repository = $repository;
// Définition des permissions par méthode
$this->middleware('permission:$PERMISSION_PREFIX$-read')->only(['index']);
$this->middleware('permission:$PERMISSION_PREFIX$-create')->only(['create', 'duplicate']);
$this->middleware('permission:$PERMISSION_PREFIX$-update')->only(['edit']);
$this->middleware('permission:$PERMISSION_PREFIX$-delete')->only(['destroy']);
view()->share('route_prefix', "$ROUTE_PREFIX$");
}
/**
* Display a listing of the resources.
* @return Renderable
*/
public function index()
{
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODEL$') => null
);
return view('$VIEW_PREFIX$.index')->with([
'title' => '<i class="fa fa-asterisk mr-2"></i>' . __('$MODEL$'),
'subtitle' => 'Liste',
'breadcrumb' => $breadcrumb,
]);
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
$resource = $this->repository->new();
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODEL$') => route('$ROUTE_PREFIX$.index'),
__('Ajouter') => null
);
return view('$VIEW_PREFIX$.form')->with([
'title' => '<i class="fa fa-asterisk mr-2"></i>' . __('$MODEL$'),
'subtitle' => __('Nouveau'),
'breadcrumb' => $breadcrumb,
'item' => $resource
]);
}
/**
* Read the specified resource.
* @param int $id
* @return Renderable
*/
public function read($id)
{
$resource = $this->repository->findOrFail($id);
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODEL$') => route('$ROUTE_PREFIX$.index'),
__('Consulter') => null
);
return view('$VIEW_PREFIX$.show')->with([
'title' => '<i class="fa fa-asterisk mr-2"></i>' . __('$MODEL$'),
'subtitle' => __('Consultation'),
'breadcrumb' => $breadcrumb,
'item' => $resource
]);
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
$resource = $this->repository->findOrFail($id);
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODEL$') => route('$ROUTE_PREFIX$.index'),
__('Modifier') => null
);
return view('$VIEW_PREFIX$.form')->with([
'title' => '<i class="fa fa-asterisk mr-2"></i>' . __('$MODEL$'),
'subtitle' => __('Mise à jour'),
'breadcrumb' => $breadcrumb,
'item' => $resource
]);
}
/**
* Store a newly created resource in storage.
* @param $REQUEST_STORE$ $request
* @return Redirect
*/
public function store($REQUEST_STORE$ $request, $id = null)
{
return $this->update($request, $id);
}
/**
* Update the specified resource in storage.
* @param $REQUEST_STORE$ $request
* @param int $id
* @return Redirect
*/
public function update($REQUEST_STORE$ $request, $id)
{
$data = $request->except(['_token']);
$resource = $this->repository->store($data, $id);
Session::flash('success', __("Élément enregistré avec succès"));
return Redirect::route('$ROUTE_PREFIX$.index');
}
/**
* Duplicate the specified resource in storage
*
* @param int $id
* @return Redirect
*/
public function duplicate($id)
{
$this->repository->duplicate($id);
Session::flash('success', __("Élément dupliqué avec succès"));
return Redirect::route('$ROUTE_PREFIX$.index');
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Redirect
*/
public function destroy($id)
{
$this->repository->destroy($id);
Session::flash('success', __('Élément supprimé avec succès'));
return Redirect::route('$ROUTE_PREFIX$.index');
}
/**
* Exporte the resources
*
* @return Response
*/
public function export()
{
return Excel::download(new $EXPORT$, date('Ymd_His_') . 'export-$PERMISSION_PREFIX$.xlsx');
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Events\AfterSheet;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\BeforeExport;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Modules\$MODULE$\Http\Repositories\$REPOSITORY$;
class $CLASS$ implements FromCollection, WithHeadings, ShouldAutoSize, WithEvents
{
private $collection;
private $prop_title;
private $prop_description;
private $prop_author;
private $prop_subject;
private $prop_company;
private $sheet_columns;
public function __construct()
{
$this->prop_description = "Export des exemples du module $MODULE$";
$this->prop_title = "Liste des exemples";
$this->prop_author = "Sylvain";
$this->prop_subject = "Export";
$this->prop_company = "Goldenscarab";
$this->sheet_title = 'Clients';
$this->sheet_colums = array(
'id' => 'ID',
'name' => 'Nom',
'user.name' => 'Utilisateur',
'created_at' => 'Date'
);
}
/**
* Récupération des données depuis la BDD
* @return Collection La liste des données à exporter
*/
public function collection()
{
return app($REPOSITORY$::class)->all(array_keys($this->sheet_colums));
}
/**
* Ajout d'une ligne d'entêtes (les titres)
* @return array Les titres
*/
public function headings(): array
{
return array_values($this->sheet_colums);
}
/**
* Configuration de la feuille d'export
* @return array La config
*/
public function registerEvents(): array
{
return [
BeforeExport::class => function(BeforeExport $event) {
// Propriétées du tableau
$event->writer->getProperties()
->setCreator($this->prop_author)
->setLastModifiedBy($this->prop_author)
->setTitle($this->prop_title)
->setSubject($this->prop_subject)
->setCompany($this->prop_company)
->setDescription($this->prop_description);
},
AfterSheet::class => function(AfterSheet $event) {
// Calcul de la zone des titres
$title_end = chr(65 + count($this->sheet_colums) - 1);
$zone_title = sprintf('A1:%s1', $title_end);
// Style des titres
$event->sheet->getDelegate()->getStyle($zone_title)->getFont()->setBold(true);
// Filtre sur les titres
$event->sheet->setAutoFilter($zone_title);
// Volets verrouillés
$event->sheet->freezePane('A2');
// Titre de l'onglet
$event->sheet->setTitle($this->sheet_title);
},
];
}
}
<?php
namespace $NAMESPACE$;
use Modules\Belet\Models\$MODEL$;
use Illuminate\Database\Eloquent\Factories\Factory;
class $CLASS$ extends Factory
{
/**
* The name of the factory's corresponding model.
*
* @var string
*/
protected $model = $MODEL$::class;
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
//'name' => $this->faker->word(),
//'phone' => $this->faker->phoneNumber(),
//'description' => $this->faker->text(100),
];
}
/**
* Specific status
*
* @return \Illuminate\Database\Eloquent\Factories\Factory
*/
// public function status($status)
// {
// return $this->state(function (array $attributes) use ($status) {
// return [
// 'status' => $status,
// ];
// });
// }
}
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class $CLASS$ extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('$TABLE$', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
// TODO
// $table->unsignedInteger('example_id');
// $table->foreign('example_id')->references('id')->on('table_examples');
$table->timestamps();
//$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Schema::table('module_belet_customers', function (Blueprint $table) {
// $table->dropForeign(['example_id']);
// });
Schema::dropIfExists('$TABLE$');
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
//use Illuminate\Database\Eloquent\SoftDeletes;
use Goldenscarab\Modulus\App\Traits\ModelSortable;
use Goldenscarab\Modulus\App\Traits\ModelFilterable;
use Goldenscarab\Modulus\App\Traits\ModelSearchable;
class $CLASS$ extends Model
{
//use SoftDeletes;
use ModelSortable, ModelFilterable, ModelSearchable;
protected $table = '$TABLE$';
protected $fillable = [];
protected $dates = [];
protected $searchable = [];
protected $casts = [];
protected $appends = [];
/********************/
/* Relations */
/********************/
// public function examples()
// {
// return $this->hasMany(Example::class, 'example_id');
// }
/********************/
/* Attributs */
/********************/
// protected function getExampleAttribute()
// {
// return $this->attributes['example'];
// }
/********************/
/* Scopes */
/********************/
// public function scopeFilter(Builder $query, $value)
// {
// return $query->where('filter', $value);
// }
/********************/
/* Specific methods */
/********************/
}
<?php
namespace $NAMESPACE$;
use Modules\$MODULE$\Models\$MODEL$;
use Goldenscarab\Modulus\App\Http\Repositories\RepositoryInterface;
class $CLASS$ implements RepositoryInterface
{
public function all($columns = array('*'))
{
return $MODEL$::select($columns)->orderBy('id', 'asc')->get();
}
public function list($sorting, $direction = 'asc', $perpage = null, $search = "", $filter = null)
{
$query = $MODEL$::search($search)->filter($filter)->sortBy($sorting, $direction);
$resources = is_null($perpage) ? $query->get() : $query->paginate($perpage);
return $resources;
}
public function new()
{
return new $MODEL$;
}
public function store(array $data, $id = null)
{
if (is_null($id)) {
$resource = new $MODEL$;
} else {
$resource = $MODEL$::findOrFail($id);
}
$resource->name = data_get($data, 'name');
// $resource->example_id = data_get($data, 'example_id');
$resource->save();
return $resource;
}
public function find($id, $columns = array('*'))
{
return $MODEL$::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return $MODEL$::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return $MODEL$::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return $MODEL$::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return $MODEL$::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return $MODEL$::select($columns)->whereRaw($where)->get();
}
public function destroy($id)
{
$resource = $MODEL$::findOrFail($id);
return $resource->delete();
}
public function first()
{
return $MODEL$::first();
}
public function duplicate($id)
{
$resource = $MODEL$::findOrFail($id);
$clone = $resource->replicate();
$availables = ['title', 'name', 'label', 'slug'];
foreach ($availables as $available) {
if (isset($clone->{$available})) {
$clone->{$available} = $clone->{$available} . ' (copie)';
}
}
$clone->save();
return $clone;
}
public function truncate()
{
return $MODEL$::truncate();
}
private function calcNextPosition()
{
$resource = $MODEL$::orderBy('position', 'desc')->first();
if (is_null($resource)) {
return 1;
}
return $resource->position + 1;
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Foundation\Http\FormRequest;
class $CLASS$ extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
if (empty($this->route('id'))) {
return auth()->user()->can('$PERMISSION_PREFIX$-create');
} else {
return auth()->user()->can('$PERMISSION_PREFIX$-update');
}
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|max:191'
// TODO - Règles des champs
];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [
'name' => __('Nom')
// TODO - Nom des champs
];
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Foundation\Http\FormRequest;
class $CLASS$ extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth($GUARD$)->check() && auth($GUARD$)->user()->can('$PERMISSION_PREFIX$-delete');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [];
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Foundation\Http\FormRequest;
class $CLASS$ extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth($GUARD$)->check() && auth($GUARD$)->user()->can('$PERMISSION_PREFIX$-read');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'sort' => 'nullable|string',
'direction' => 'required_with:sort|string',
'perpage' => 'nullable|in:10,50,100,250,500',
'search' => 'nullable|string',
'filter' => 'nullable|string|regex:/^.*:.*$/',
'include' => 'nullable|array'
];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [
'sort' => __('Colonne'),
'direction' => __('Direction'),
'perpage' => __('Par page'),
'search' => __('Recherche'),
'filter' => __('Filtre'),
'include' => __('Relation')
];
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Foundation\Http\FormRequest;
class $CLASS$ extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth($GUARD$)->check() && auth($GUARD$)->user()->can('$PERMISSION_PREFIX$-read');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [];
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Foundation\Http\FormRequest;
class $CLASS$ extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth($GUARD$)->check() && auth($GUARD$)->user()->can('$PERMISSION_PREFIX$-create');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// TODO
];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [
// TODO
];
}
}
<?php
namespace $NAMESPACE$;
use Illuminate\Foundation\Http\FormRequest;
class $CLASS$ extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth($GUARD$)->check() && auth($GUARD$)->user()->can('$PERMISSION_PREFIX$-update');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
// TODO
];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [
// TODO
];
}
}
// $MODEL$
Route::resource('$ROUTE$', $CONTROLLER$::class);
// $MODEL$
Route::group(['prefix' => '$ROUTE$', 'as' => '$ROUTE$.'], function() {
Route::get('/', '$CONTROLLER$@index')->name('index');
Route::get('create', '$CONTROLLER$@create')->name('create');
Route::get('export', '$CONTROLLER$@export')->name('export');
Route::get('read/{id}', '$CONTROLLER$@read')->name('read');
Route::get('edit/{id}', '$CONTROLLER$@edit')->name('edit');
Route::get('duplicate/{id}', '$CONTROLLER$@duplicate')->name('duplicate');
Route::post('store/{id?}', '$CONTROLLER$@store')->name('store');
Route::get('destroy/{id}', '$CONTROLLER$@destroy')->name('destroy');
});
<?php
namespace $NAMESPACE$;
use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Model;
use Modules\$MODULE$\Database\factories\$FACTORY$;
class $CLASS$ extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
// Seeder fake
$FACTORY$::new()->count(20)->create();
// Seeder spécifique
// DB::table('$TABLE$')->insert([
// [
// 'name' => 'Custom name',
// 'example_id' => 1,
// 'created_at' => Carbon::now(),
// 'updated_at' => Carbon::now(),
// ]
// ]);
}
}
<?php
namespace $NAMESPACE$;
use Tests\TestCase;
use Illuminate\Support\Str;
use Modules\$MODULE$\Models\$MODEL$;
use Goldenscarab\Modulus\App\Models\User;
use Illuminate\Testing\Fluent\AssertableJson;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Modules\$MODULE$\Database\factories\$FACTORY$;
use Goldenscarab\Modulus\database\factories\UserFactory;
/**
* php artisan test Modules/$MODULE$/Tests/Unit/$CLASS$.php
*/
class $CLASS$ extends TestCase
{
use RefreshDatabase;
protected $seed = true;
/**
* Crée un utilisateur admin
*
* @return User
*/
private function createFakeUser($role = ['admin']): User
{
$user = UserFactory::new()->active(true)->create();
if (!empty($role)) {
$user->assignRole($role);
}
return $user;
}
private function createFakeResource(): Customer
{
$resource = $FACTORY$::new()->create(); // TODO - ajout de states (ex : category(1))
return $resource;
}
/**
* Retourne une connexion authentifiée
*
* @return TestCase
*/
private function auth($guard = 'web', $role = ['admin'])
{
return $this->actingAs($this->createFakeUser($role), $guard)->withSession(['banned' => false]);
}
/**
* Accès à la liste
*
* @return void
*/
public function testWebGetIndex()
{
$url = route('$ROUTE_PREFIX$.index');
$response = $this->auth()->get($url);
$this->assertEquals(200, $response->getStatusCode());
}
/**
* Accès au formulaire de création
*
* @return void
*/
public function testWebGetCreate()
{
$url = route('$route_prefix$.create');
$response = $this->auth()->get($url);
$this->assertEquals(200, $response->getStatusCode());
}
/**
* Post pour créaction
*
* @return void
*/
public function testWebPostCreateStore()
{
$url = route('$route_prefix$.store');
$data = $FACTORY$::new()->make()->toArray();
$response = $this->auth()->post($url, $data);
$this->assertEquals(302, $response->getStatusCode());
$response->assertSessionHasNoErrors();
$this->assertTrue($response->getSession()->has('success'));
$this->assertDatabaseHas('module_belet_customers', [
'field' => $data['field'],
// TODO - Ajout des champs à tester
]);
}
/**
* Post création avec erreur de validation
*
* @return void
*/
public function testWebPostCreateStoreFail()
{
$url = route('$route_prefix$.store');
// Utiliser le tableau du form request
$data = [
'field' => Str::random(192),
// TODO - Ajout des champs à tester
];
$response = $this->auth()->post($url, $data);
$this->assertEquals(302, $response->getStatusCode());
$response->assertSessionHasErrors();
$errors = $response->getSession()->get('errors')->toArray();
$this->assertEquals(array_keys($data), array_keys($errors));
}
/**
* Accès au formulaire de consultation
*
* @return void
*/
public function testWebGetRead()
{
$resource = $this->createFakeResource();
$url = route('$route_prefix$.read', $resource->id);
$response = $this->auth()->get($url);
$this->assertEquals(200, $response->getStatusCode());
}
/**
* Accès au formulaire de consultation avec élément inconnu
*
* @return void
*/
public function testWebGetReadFail()
{
$fakeId = 555;
$url = route('$route_prefix$.read', $fakeId);
$response = $this->auth()->get($url);
$this->assertEquals(404, $response->getStatusCode());
}
/**
* Accès au formulaire de modification
*
* @return void
*/
public function testWebGetUpdate()
{
$resource = $this->createFakeResource();
$url = route('$route_prefix$.edit', $resource->id);
$response = $this->auth()->get($url);
$this->assertEquals(200, $response->getStatusCode());
}
/**
* Post modification
*
* @return void
*/
public function testWebPostUpdateStore()
{
$resource = $this->createFakeResource();
$url = route('$route_prefix$.store', $resource->id);
$data = $FACTORY$::new()->make()->toArray();
$response = $this->auth()->post($url, $data);
$this->assertEquals(302, $response->getStatusCode());
$response->assertSessionHasNoErrors();
$this->assertTrue($response->getSession()->has('success'));
$this->assertDatabaseHas('module_belet_customers', [
'field' => $data['field'],
// TODO - Ajout des champs à tester
]);
$updated = Customer::findOrFail($resource->id);
$updated->setHidden(['id', 'updated_at', 'created_at', 'deleted_at']);
$this->assertEquals($data, $updated->toArray());
}
/**
* Duplication d'une resource
*
* @return void
*/
public function testWebGetDuplicate()
{
$compareField = 'rename_field'; // TODO - Modifier le champs qui sera renommé (copie)
$resource = $this->createFakeResource();
$url = route('$route_prefix$.duplicate', $resource->id);
$response = $this->auth()->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertTrue($response->getSession()->has('success'));
$copy = Customer::latest()->first();
$this->assertEquals($resource->{$compareField} . ' (copie)', $copy->{$compareField});
}
/**
* Suppression d'une resource
*
* @return void
*/
public function testWebGetDestroy()
{
$resource = $this->createFakeResource();
$url = route('$route_prefix$.destroy', $resource->id);
$response = $this->auth()->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertTrue($response->getSession()->has('success'));
}
/**
* Test d'accès en mode public
*
* @return void
*/
public function testWebPublicAccess()
{
$resource = $this->createFakeResource();
// Liste
$url = route('$route_prefix$.index');
$response = $this->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
// Formulaire de création
$url = route('$route_prefix$.create');
$response = $this->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
// Consultation
$url = route('$route_prefix$.read', $resource->id);
$response = $this->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
// Formulaire de modification
$url = route('$route_prefix$.edit', $resource->id);
$response = $this->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
// Formulaire de duplication
$url = route('$route_prefix$.duplicate', $resource->id);
$response = $this->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
// Enregistrement
$url = route('$route_prefix$.store', $resource->id);
$response = $this->post($url, []);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
// Suppression
$url = route('$route_prefix$.destroy', $resource->id);
$response = $this->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
}
/**
* Test d'accès sans permission
*
* @return void
*/
public function testWebWithoutPermission()
{
$resource = $this->createFakeResource();
// Liste
$url = route('$route_prefix$.index');
$response = $this->auth('web', [])->get($url);
$this->assertEquals(403, $response->getStatusCode());
// Formulaire de création
$url = route('$route_prefix$.create');
$response = $this->auth('web', [])->get($url);
$this->assertEquals(403, $response->getStatusCode());
// Consultation
$url = route('$route_prefix$.read', $resource->id);
$response = $this->auth('web', [])->get($url);
$this->assertEquals(403, $response->getStatusCode());
// Formulaire de modification
$url = route('$route_prefix$.edit', $resource->id);
$response = $this->auth('web', [])->get($url);
$this->assertEquals(403, $response->getStatusCode());
// Enregistrement
$url = route('$route_prefix$.store', $resource->id);
$response = $this->auth('web', [])->post($url, []);
$this->assertEquals(403, $response->getStatusCode());
// Suppression
$url = route('$route_prefix$.destroy', $resource->id);
$response = $this->auth('web', [])->get($url);
$this->assertEquals(403, $response->getStatusCode());
}
/**
* Accès à l'API liste
*
* @return void
*/
public function testApiIndex()
{
$FACTORY$::new()->count(1)->create();
$url = route('api.$route_prefix$.index');
$response = $this->auth('api')->get($url);
$this->assertEquals(200, $response->getStatusCode());
$response->assertJson(
fn (AssertableJson $json) =>
$json->has('data')
->missing('message')
->etc()
);
}
/**
* Accès à l'API liste en mode public
*
* @return void
*/
public function testApiPublicAccess()
{
$FACTORY$::new()->count(1)->create();
$url = route('api.$route_prefix$.index');
$response = $this->get($url);
$this->assertEquals(302, $response->getStatusCode());
$this->assertEquals($response->getTargetUrl(), route('login'));
}
/**
* Accès à l'API liste sans permission
*
* @return void
*/
public function testApiWithoutPermission()
{
$FACTORY$::new()->count(1)->create();
$url = route('api.$route_prefix$.index');
$response = $this->auth('api', [])->get($url);
$this->assertEquals(403, $response->getStatusCode());
}
}
@extends('modulus::layouts.app.form')
@section('fields')
<div class="card">
<div class="card-header">
<h3 class="card-title">Général</h3>
</div>
<div class="card-body">
<div class="form-row">
<div class="col-sm-6">
{!! Field2::select([
'label' => 'Propriétaire',
'name' => 'user_id',
'value' => $item->user_id,
'prefix' => '<i class="fa fa-user"></i>',
'attributes' => [
'required' => true,
],
'options' => [
'source' => [
'call' => 'Goldenscarab\Modulus\App\Http\Controllers\Api\UserController@index',
'params' => ['perpage' => 999],
'target' => 'data'
],
'default' => ['value' => '', 'label' => 'Choisir...'],
'value' => ':id',
'label' => ['template' => [
'format' => '%s (%s)',
'args' => [':name', ':company']
]]
]
]) !!}
</div>
</div>
<div class="form-row">
<div class="col">
{!! Field2::input([
'label' => 'Nom',
'name' => 'name',
'value' => $item->name,
'prefix' => '<i class="fa fa-bookmark"></i>',
'attributes' => [
'placeholder' => 'ex : Le nom',
'required' => true,
]
]) !!}
</div>
</div>
</div>
</div>
@endsection
@push('scripts')
<script>
document.addEventListener('DOMContentLoaded', function() {
// TODO
});
</script>
@endpush
@extends('modulus::layouts.app.adminlte')
@php
$can_prefix = '$PERMISSION_PREFIX$';
$url_prefix = route('$ROUTE_PREFIX$.index');
$am = new \Goldenscarab\Modulus\Helpers\ActionMenu($can_prefix, $url_prefix);
$params_actions = [
[
'button' => $am->make('[CREATE]', ['attributes.class' => 'btn-sm btn-success']),
]
];
$params_filter = [
// [
// 'name' => 'filter',
// 'prefix' => 'Filtre catégorie',
// 'size' => 'sm',
// 'options' => [
// 'source' => [
// 'url' => route('api.module.belet.customers.categories.index', ['perpage' => null]),
// 'method' => 'GET',
// 'target' => 'data'
// ],
// 'placeholder' => ['value' => '', 'label' => '-- Toutes --'],
// 'value' => ['template' => [
// 'format' => '%s:%s',
// 'args' => ['category_id', ':id']
// ]],
// 'label' => ':name'
// ]
// ]
];
$params_header = [
'actions' => $params_actions,
'filters' => $params_filter,
'search' => true
];
$params_list = [
'source' => route('api.$ROUTE_PREFIX$.index'),
'menu' => [
'button' => $am->make('[READ]', ['attributes' => ['class' => 'btn-sm btn-success']]),
'dropdown' => [
'size' => 'sm',
'attributes' => ['class' => 'dropdown-menu-right'],
'items' => [
$am->make('[EDIT]'),
$am->make('[DUPLICATE]'),
$am->make('[SEPARATOR]'),
$am->make('[DESTROY]')
]
]
],
'row' => [],
'columns' => array(
[
'label' => '#',
'value' => ':id',
'sortable' => 'id'
], [
'label' => 'Nom',
'value' => ':name',
'sortable' => 'name'
],
// [
// 'label' => 'Téléphone',
// 'value' => ':phone',
// 'sortable' => 'phone',
// ], [
// 'label' => 'Description',
// 'value' => ':description',
// 'sortable' => 'description',
// 'render' => 'limit(70)'
// ], [
// 'label' => 'Statut',
// 'value' => ':status',
// 'sortable' => 'status',
// 'render' => 'boolean_html'
/ ],
[
'label' => ['value' => 'Date', 'attributes' => ['class' => 'text-center']],
'value' => ':updated_at',
'sortable' => 'updated_at',
'render' => 'date_human_fr',
'attributes' => ['class' => 'text-center']
]
)
];
@endphp
@section('content')
<div id="app">
<glist
v-bind:header="{{ json_encode($params_header) }}"
v-bind:list="{{ json_encode($params_list) }}"
></glist>
</div>
@endsection
@extends('modulus::layouts.app.adminlte')
@section('content')
<div class="card card-success card-outline">
<div class="card-header">
<h3 class="card-title">Fiche</h3>
</div>
<div class="card-body">
<h4>
<span class="badge badge-info mr-2">{{ $item->name }}</span>
<span class="badge badge-success float-right">{{ $item->category->name }}</span>
</h4>
<div class="row mt-4">
<div class="col-sm-6">
<table class="table">
<tbody>
<tr>
<th>Description</th>
<td>{{ $item->description }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="form-action">
<a href="{{ route('$ROUTE_PREFIX$.index') }}" class="btn btn-warning">
<i class="fa fa-reply" aria-hidden="true"></i>
</a>
</div>
@endsection
......@@ -59,7 +59,7 @@ class ModuleController extends Controller
$modules = Module::toCollection();
// Désactiver les modules non installé
$modules->each(function(&$m, $key) {
$modules->each(function (&$m, $key) {
// Recherche de la config du module dans modulus
$module = $this->module_repo->findBy('slug', $m->getAlias());
......@@ -69,7 +69,7 @@ class ModuleController extends Controller
});
// On supprime de la liste les modules caché
$modules = $modules->filter(function($module, $key) {
$modules = $modules->filter(function ($module, $key) {
return $module->get('hidden') == false;
});
......@@ -78,13 +78,13 @@ class ModuleController extends Controller
'Modules' => null
);
return view('modulus::app.module.index')->with([
return view('modulus::app.module.index')->with([
'seo_title' => 'Module liste',
'title' => '<i class="fa fa-puzzle-piece mr-2"></i>Modules',
'subtitle' => 'Liste des modules disponibles',
'breadcrumb' => $breadcrumb,
'modules' => $modules
]);
]);
}
......@@ -115,7 +115,7 @@ class ModuleController extends Controller
'priority' => $module->get('priority')
);
$this->module_repo->store(collect($module_config));
$this->module_repo->store($module_config);
// Ajout des permissions d'accès au module
PermissionService::addPermissionsGroup('Module ' . $module->getName());
......@@ -165,11 +165,10 @@ class ModuleController extends Controller
'priority' => $module->get('priority')
);
$this->module_repo->store(collect($module_config));
$this->module_repo->store($module_config);
Session::flash('success', "Module mis à jour avec succès");
return Redirect::route('modulus.module.index');
}
}
......@@ -47,11 +47,11 @@ class PermissionController extends Controller
'Permissions' => null
);
return view('modulus::app.user.permission.list')->with([
return view('modulus::app.user.permission.list')->with([
'title' => '<i class="fa fa-unlock-alt mr-1" aria-hidden="true"></i>Permissions',
'breadcrumb' => $breadcrumb,
'permissions' => $permissions,
]);
]);
}
public function create()
......@@ -96,8 +96,7 @@ class PermissionController extends Controller
public function store(PermissionStoreRequest $request, $id = null)
{
$permission_data = collect($request->except(['_token']));
$permission_data = $request->except(['_token']);
if (is_null($id)) {
$base_name = $request->get('name');
......@@ -111,14 +110,14 @@ class PermissionController extends Controller
$name = $base_name . '-' . $suffix;
$perm = $this->permission_repo->findBy('name', $name);
$this->permission_repo->store(collect([
$this->permission_repo->store([
'name' => $request->get('name') . '-' . $suffix,
'display_name' => $request->get('display_name') . ' ' . ucfirst($suffix),
'description' => $request->get('description') . ' ' . $description,
]), data_get($perm, 'id'));
], data_get($perm, 'id'));
}
Session::flash('success', "Permission ". (is_null($id) ? 'créée' : 'modifiée') ." avec succès");
Session::flash('success', "Permission " . (is_null($id) ? 'créée' : 'modifiée') . " avec succès");
return Redirect::route('modulus.user.permission.index');
}
......@@ -138,5 +137,4 @@ class PermissionController extends Controller
return Redirect::route('modulus.user.permission.index');
}
}
......@@ -49,11 +49,11 @@ class RoleController extends Controller
'Rôles' => null
);
return view('modulus::app.user.role.list')->with([
'title' => '<i class="fa fa-tags mr-1" aria-hidden="true"></i>Rôles',
return view('modulus::app.user.role.list')->with([
'title' => '<i class="fa fa-tags mr-1" aria-hidden="true"></i>Rôles',
'breadcrumb' => $breadcrumb,
'roles' => $roles,
]);
'roles' => $roles,
]);
}
public function create()
......@@ -84,9 +84,14 @@ class RoleController extends Controller
{
$role = $this->role_repo->findOrFail($id);
$perms = $this->permission_repo->all();
$roles = $this->role_repo->findAllBy('name', $role->name);
$permissions = $this->formatPermissions($perms);
$role->perms = collect();
foreach ($roles as $r) {
$role->perms = $role->perms->merge($r->permissions);
}
$permissions = $this->formatPermissions($this->permission_repo->all());
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
......@@ -107,10 +112,10 @@ class RoleController extends Controller
private function formatPermissions($perms)
{
$permissions = [];
$permissions = [];
// Traitement sur les permissions
$perms->each(function($item, $key) use (&$permissions) {
// Traitement sur les permissions web
$perms->where('guard_name', 'web')->each(function ($item, $key) use (&$permissions) {
// Si la permission est conforme
if (preg_match('/-(.[^-]+)$/i', $item->name, $match)) {
......@@ -124,8 +129,25 @@ class RoleController extends Controller
$name = trim(str_ireplace($perm, '', $item->display_name));
$permissions[$name][$perm] = $item->id;
$permissions['web'][$name][$perm] = $item->id;
});
// Traitement sur les permissions api
$perms->where('guard_name', 'api')->each(function ($item, $key) use (&$permissions) {
// Si la permission est conforme
if (preg_match('/-(.[^-]+)$/i', $item->name, $match)) {
$group = str_replace($match[0], '', $item->name);
$perm = $match[1];
} else {
$group = $item->name;
$perm = 'other';
}
$name = trim(str_ireplace($perm, '', $item->display_name));
$permissions['api'][$name][$perm] = $item->id;
});
return $permissions;
......@@ -133,11 +155,11 @@ class RoleController extends Controller
public function store(RoleStoreRequest $request, $id = null)
{
$role_data = collect($request->except(['_token']));
$role_data = $request->except(['_token']);
$this->role_repo->store($role_data, $id);
Session::flash('success', "Rôle ". (is_null($id) ? 'crée' : 'modifié') ." avec succès");
Session::flash('success', "Rôle " . (is_null($id) ? 'crée' : 'modifié') . " avec succès");
return Redirect::route('modulus.user.role.index');
}
......@@ -150,5 +172,4 @@ class RoleController extends Controller
return Redirect::route('modulus.user.role.index');
}
}
......@@ -2,17 +2,17 @@
namespace Goldenscarab\Modulus\App\Http\Controllers\App;
use App\Http\Controllers\Controller;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Maatwebsite\Excel\Facades\Excel;
use Goldenscarab\Modulus\App\Mail\SendActiveAccountRequest;
use Goldenscarab\Modulus\App\Http\Requests\UserStoreRequest;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect;
use Goldenscarab\Modulus\App\Http\Requests\UserStoreRequest;
use Goldenscarab\Modulus\App\Mails\SendActiveAccountRequest;
use Goldenscarab\Modulus\App\Http\Repositories\RoleRepository;
use Goldenscarab\Modulus\App\Http\Repositories\UserRepository;
use Goldenscarab\Modulus\App\Http\Requests\ProfileStoreRequest;
......@@ -113,7 +113,7 @@ class UserController extends Controller
public function store(UserStoreRequest $request, $id = null)
{
// On récupère les données utilisateur
$user_data = collect($request->except(['_token']));
$user_data = $request->except(['_token']);
// On sauvegarde les données utilisateur
$user = $this->user_repo->store($user_data, $id);
......@@ -185,15 +185,15 @@ class UserController extends Controller
}
// Création du document Excel
Excel::create($file_name, function($excel) use ($datas_export) {
Excel::create($file_name, function ($excel) use ($datas_export) {
// Paramétrage du tableau Excel
$excel->setTitle("Export du ". date('d/m/Y H:i:s'));
$excel->setTitle("Export du " . date('d/m/Y H:i:s'));
$excel->setCreator('BMV Communication');
$excel->setDescription('');
// Création d'une nouvelle feuille de calcul
$excel->sheet('Utilisateur', function($sheet) use ($datas_export) {
$excel->sheet('Utilisateur', function ($sheet) use ($datas_export) {
// Mise en style de la feuille de calcul
$sheet->setFontFamily('Arial');
......@@ -203,11 +203,11 @@ class UserController extends Controller
$sheet->fromArray($datas_export, null, 'A1');
// Ajout d'une ligne d'entête
$sheet->prependRow(1, ["Export du ". date('d/m/Y H:i:s')]);
$sheet->prependRow(1, ["Export du " . date('d/m/Y H:i:s')]);
$sheet->prependRow(2, [""]);
// Mise à caractère gras des titres (ligne 3)
$sheet->row(3, function($row) {
$sheet->row(3, function ($row) {
$row->setFontWeight('bold');
});
......@@ -230,7 +230,7 @@ class UserController extends Controller
public function profilPost(ProfileStoreRequest $request)
{
$data = collect($request->except(['_token']));
$data = $request->except(['_token']);
$user = $this->user_repo->store($data, auth()->user()->id);
Session::flash('success', "Profil enregistré avec succès");
......@@ -273,5 +273,4 @@ class UserController extends Controller
// On envoi le mail de notification d'activation de compte
Mail::to($user->email)->queue(new SendActiveAccountRequest($user, $reset_token));
}
}
......@@ -7,120 +7,120 @@ use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
class ModuleRepository implements RepositoryInterface {
public function all($columns = array('*'))
{
return Module::select($columns)->get();
}
public function new()
{
return new Module;
}
public function published($columns = array('*'))
{
return false;
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{
return Module::search($search)->orderBy($filter, $sort)->paginate($per_page);
}
public function allByPosition()
{
return Module::orderBy('priority', 'desc')->get();
}
public function store(Collection $data, $id = null)
{
if (is_null($id)) {
$config = new Module;
} else {
$config = Module::findOrFail($id);
}
$config->name = $data->get('name');
$config->slug = $data->get('slug');
$config->menu = $data->get('menu');
$config->priority = $data->get('priority');
class ModuleRepository implements RepositoryInterface
{
public function all($columns = array('*'))
{
return Module::select($columns)->get();
}
public function new()
{
return new Module;
}
public function published($columns = array('*'))
{
return false;
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{
return Module::search($search)->orderBy($filter, $sort)->paginate($per_page);
}
public function allByPosition()
{
return Module::orderBy('priority', 'desc')->get();
}
public function store(array $data, $id = null)
{
if (is_null($id)) {
$config = new Module;
} else {
$config = Module::findOrFail($id);
}
$config->name = data_get($data, 'name');
$config->slug = data_get($data, 'slug');
$config->menu = data_get($data, 'menu');
$config->priority = data_get($data, 'priority');
$config->save();
Cache::forget('module.configs');
return $config;
}
public function find($id, $columns = array('*'))
{
return Module::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Module::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Module::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Module::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Module::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Module::select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return Module::search($search)->orderBy('position', 'asc')->get();
}
public function destroy($slug)
{
}
public function find($id, $columns = array('*'))
{
return Module::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Module::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Module::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Module::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Module::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Module::select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return Module::search($search)->orderBy('position', 'asc')->get();
}
public function destroy($slug)
{
$config = Module::where('slug', $slug)->delete();
Cache::forget('module.configs');
return false;
}
return false;
}
public function first()
{
return Module::first();
}
public function first()
{
return Module::first();
}
public function lasts($limit)
{
return Module::latest()->limit($limit)->get();
}
public function lasts($limit)
{
return Module::latest()->limit($limit)->get();
}
public function duplicate($id)
{
return false;
}
public function duplicate($id)
{
return false;
}
private function calcNextPosition()
{
$config = Module::orderBy('position', 'desc')->first();
private function calcNextPosition()
{
$config = Module::orderBy('position', 'desc')->first();
if (is_null($config)) {
return 1;
}
return $config->position + 1;
}
if (is_null($config)) {
return 1;
}
return $config->position + 1;
}
}
......@@ -6,108 +6,109 @@ use Goldenscarab\Modulus\App\Models\Permission;
use Illuminate\Support\Collection;
class PermissionRepository implements RepositoryInterface {
public function all($columns = array('*'))
{
return Permission::select($columns)->get();
}
public function new()
{
return new Permission;
}
public function published($columns = array('*'))
{
return false;
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{
return Permission::where(function($query) use ($search) {
if (!empty($search)) {
$query->where('name', 'LIKE','%' . $search . '%')
->orWhere('display_name', 'LIKE','%' . $search . '%')
->orWhere('description', 'LIKE','%' . $search . '%');
}
})->orderBy($filter, $sort)->paginate($per_page);
}
public function store(Collection $data, $id = null)
{
if (is_null($id)) {
$permission = new Permission;
} else {
$permission = Permission::findOrFail($id);
}
$permission->name = $data->get('name');
//$permission->guard_name = $data->get('guard_name');
$permission->display_name = $data->get('display_name');
$permission->description = $data->get('description');
$permission->save();
class PermissionRepository implements RepositoryInterface
{
public function all($columns = array('*'))
{
return Permission::select($columns)->get();
}
public function new()
{
return new Permission;
}
public function published($columns = array('*'))
{
return false;
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{
return Permission::where(function ($query) use ($search) {
if (!empty($search)) {
$query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('display_name', 'LIKE', '%' . $search . '%')
->orWhere('description', 'LIKE', '%' . $search . '%');
}
})->orderBy($filter, $sort)->paginate($per_page);
}
public function store(array $data, $id = null)
{
if (is_null($id)) {
$permission = new Permission;
} else {
$permission = Permission::findOrFail($id);
}
$permission->name = data_get($data, 'name');
$permission->guard_name = data_get($data, 'guard_name', 'web');
$permission->display_name = data_get($data, 'display_name');
$permission->description = data_get($data, 'description');
$permission->save();
return $permission;
}
public function find($id, $columns = array('*'))
{
return Permission::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Permission::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Permission::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Permission::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Permission::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Permission::select($columns)->whereRaw($where)->get();
}
public function destroy($id)
{
return Permission::findOrFail($id)->delete();
}
public function first()
{
return Permission::first();
}
public function lasts($limit)
{
return Permission::latest()->limit($limit)->get();
}
public function search($search)
{
return Permission::search($search)->get();
}
public function truncate()
{
return Permission::truncate();
}
public function duplicate($id)
{
return false;
}
}
public function find($id, $columns = array('*'))
{
return Permission::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Permission::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Permission::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Permission::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Permission::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Permission::select($columns)->whereRaw($where)->get();
}
public function destroy($id)
{
return Permission::findOrFail($id)->delete();
}
public function first()
{
return Permission::first();
}
public function lasts($limit)
{
return Permission::latest()->limit($limit)->get();
}
public function search($search)
{
return Permission::search($search)->get();
}
public function truncate()
{
return Permission::truncate();
}
public function duplicate($id)
{
return false;
}
}
......@@ -7,35 +7,29 @@ use Illuminate\Support\Collection;
interface RepositoryInterface
{
public function all($columns = array('*'));
public function all($columns = array('*'));
public function list($filter, $sort = 'asc', $per_page = 15, $search = "");
public function list($filter, $sort = 'asc', $per_page = 15, $search = "");
public function published($columns = array('*'));
public function new();
public function new();
public function store(array $data, $id);
public function store(Collection $data, $id);
public function find($id, $columns = array('*'));
public function find($id, $columns = array('*'));
public function findOrFail($id, $columns = array('*'));
public function findOrFail($id, $columns = array('*'));
public function findBy($field, $value, $columns = array('*'));
public function findBy($field, $value, $columns = array('*'));
public function findOrFailBy($field, $value, $columns = array('*'));
public function findOrFailBy($field, $value, $columns = array('*'));
public function findAllBy($field, $value, $columns = array('*'));
public function findAllBy($field, $value, $columns = array('*'));
public function findWhere($where, $columns = array('*'));
public function findWhere($where, $columns = array('*'));
public function first();
public function first();
public function duplicate($id);
public function lasts($limit);
public function search($search);
public function duplicate($id);
public function destroy($id);
public function destroy($id);
}
......@@ -6,116 +6,150 @@ use Spatie\Permission\Models\Role;
use Illuminate\Support\Collection;
class RoleRepository implements RepositoryInterface {
public function all($columns = array('*'))
{
return Role::select($columns)->get();
}
public function new()
{
return new Role;
}
public function published($columns = array('*'))
{
return false;
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{
return Role::where(function($query) use ($search) {
if (!empty($search)) {
$query->where('name', 'LIKE','%' . $search . '%')
->orWhere('display_name', 'LIKE','%' . $search . '%')
->orWhere('description', 'LIKE','%' . $search . '%');
}
})->orderBy($filter, $sort)->paginate($per_page);
}
public function store(Collection $data, $id)
{
if (is_null($id)) {
$role = new Role;
} else {
$role = Role::findOrFail($id);
}
$role->name = $data->get('name');
//$role->guard_name = $data->get('guard_name');
$role->display_name = $data->get('display_name');
$role->description = $data->get('description');
$role->save();
// Si il y a des permissions à activer
if ($data->has('permissions')) {
$role->syncPermissions($data->get('permissions'));
}
class RoleRepository implements RepositoryInterface
{
public function all($columns = array('*'))
{
return Role::select($columns)->get();
}
public function new()
{
return new Role;
}
public function published($columns = array('*'))
{
return false;
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{
return Role::where(function ($query) use ($search) {
if (!empty($search)) {
$query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('display_name', 'LIKE', '%' . $search . '%')
->orWhere('description', 'LIKE', '%' . $search . '%');
}
})->orderBy($filter, $sort)->get()->unique('name');
}
public function store(array $data, $id)
{
if (is_null($id)) {
$role = new Role;
$role->name = data_get($data, 'name');
$role->guard_name = 'web';
$role->display_name = data_get($data, 'display_name');
$role->description = data_get($data, 'description');
$role->save();
// Si il y a des permissions à activer
if (isset($data['permissions_web'])) {
$role->syncPermissions(data_get($data, 'permissions_web'));
}
$role = new Role;
$role->name = data_get($data, 'name');
$role->guard_name = 'api';
$role->display_name = data_get($data, 'display_name');
$role->description = data_get($data, 'description');
$role->save();
// Si il y a des permissions à activer
if (isset($data['permissions_api'])) {
$role->syncPermissions(data_get($data, 'permissions_api'));
}
} else {
$r = Role::findOrFail($id);
$roles = Role::where('name', $r->name)->get();
foreach($roles as $role) {
$role->name = data_get($data, 'name');
$role->display_name = data_get($data, 'display_name');
$role->description = data_get($data, 'description');
$role->save();
// Si il y a des permissions à activer
if ($role->guard_name == 'web' && isset($data['permissions_web'])) {
$role->syncPermissions(data_get($data, 'permissions_web'));
}
// Si il y a des permissions à activer
if ($role->guard_name == 'api' && isset($data['permissions_api'])) {
$role->syncPermissions(data_get($data, 'permissions_api'));
}
}
}
return $role;
}
public function find($id, $columns = array('*'))
{
return Role::with('perms')->select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Role::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Role::with('perms')->select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Role::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Role::with('perms')->select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Role::with('perms')->select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return Role::search($search)->get();
}
public function destroy($id)
{
return Role::findOrFail($id)->delete();
}
public function first()
{
return Role::first();
}
public function lasts($limit)
{
return Role::latest()->limit($limit)->get();
}
public function truncate()
{
return Role::truncate();
}
public function duplicate($id)
{
return false;
}
}
public function find($id, $columns = array('*'))
{
return Role::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Role::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Role::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Role::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Role::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Role::select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return Role::search($search)->get();
}
public function destroy($id)
{
return Role::findOrFail($id)->delete();
}
public function first()
{
return Role::first();
}
public function lasts($limit)
{
return Role::latest()->limit($limit)->get();
}
public function truncate()
{
return Role::truncate();
}
public function duplicate($id)
{
return false;
}
}
......@@ -6,142 +6,143 @@ use Goldenscarab\Modulus\App\Models\Tracker;
use Illuminate\Support\Collection;
class TrackerRepository implements RepositoryInterface {
public function all($columns = array('*'))
{
return Tracker::select($columns)->orderBy('id', 'desc')->get();
}
public function list($filter, $sort = 'asc', $per_tracker = 15, $search = "")
{
return Tracker::search($search)->orderBy($filter, $sort)->paginate($per_tracker);
}
public function published($columns = array('*'))
{
return Tracker::select($columns)->active()->orderBy('title', 'asc')->get();
}
public function new()
{
return new Tracker;
}
public function store(Collection $data, $id = null)
{
if (is_null($id)) {
$tracker = new Tracker;
} else {
$tracker = Tracker::findOrFail($id);
}
$tracker->ip = $data->get('ip');
$tracker->connected_user = $data->get('connected_user');
$tracker->request_uri = $data->get('request_uri');
$tracker->request_method = $data->get('request_method');
$tracker->http_user_agent = $data->get('http_user_agent');
$tracker->provider = $data->get('provider');
$tracker->zip_code = $data->get('zip_code');
$tracker->city = $data->get('city');
$tracker->region_name = $data->get('region_name');
$tracker->country_name = $data->get('country_name');
$tracker->latitude = $data->get('latitude');
$tracker->longitude = $data->get('longitude');
$tracker->screen_width = $data->get('screen_width');
$tracker->screen_height = $data->get('screen_height');
class TrackerRepository implements RepositoryInterface
{
public function all($columns = array('*'))
{
return Tracker::select($columns)->orderBy('id', 'desc')->get();
}
public function list($filter, $sort = 'asc', $per_tracker = 15, $search = "")
{
return Tracker::search($search)->orderBy($filter, $sort)->paginate($per_tracker);
}
public function published($columns = array('*'))
{
return Tracker::select($columns)->active()->orderBy('title', 'asc')->get();
}
public function new()
{
return new Tracker;
}
public function store(array $data, $id = null)
{
if (is_null($id)) {
$tracker = new Tracker;
} else {
$tracker = Tracker::findOrFail($id);
}
$tracker->ip = data_get($data, 'ip');
$tracker->connected_user = data_get($data, 'connected_user');
$tracker->request_uri = data_get($data, 'request_uri');
$tracker->request_method = data_get($data, 'request_method');
$tracker->http_user_agent = data_get($data, 'http_user_agent');
$tracker->provider = data_get($data, 'provider');
$tracker->zip_code = data_get($data, 'zip_code');
$tracker->city = data_get($data, 'city');
$tracker->region_name = data_get($data, 'region_name');
$tracker->country_name = data_get($data, 'country_name');
$tracker->latitude = data_get($data, 'latitude');
$tracker->longitude = data_get($data, 'longitude');
$tracker->screen_width = data_get($data, 'screen_width');
$tracker->screen_height = data_get($data, 'screen_height');
$tracker->save();
return $tracker;
}
public function find($id, $columns = array('*'))
{
return Tracker::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Tracker::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Tracker::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Tracker::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Tracker::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Tracker::select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return Tracker::search($search)->orderBy('lastname', 'asc')->get();
}
public function destroy($id)
{
return Tracker::findOrFail($id)->delete();
}
public function first()
{
return Tracker::first();
}
public function lasts($limit)
{
return Tracker::latest()->limit($limit)->get();
}
public function truncate()
{
return Tracker::truncate();
}
public function currentWeek($columns = array('*'))
{
return Tracker::select($columns)->currentWeek()->orderBy('id', 'desc')->get();
}
public function lastWeek($columns = array('*'))
{
return Tracker::select($columns)->lastWeek()->orderBy('id', 'desc')->get();
}
public function currentMonth($columns = array('*'))
{
return Tracker::select($columns)->currentMonth()->orderBy('id', 'asc')->get();
}
public function lastMonth($columns = array('*'))
{
return Tracker::select($columns)->lastMonth()->orderBy('id', 'asc')->get();
}
public function currentYear($columns = array('*'))
{
return Tracker::select($columns)->currentMonth()->orderBy('id', 'asc')->get();
}
public function lastYear($columns = array('*'))
{
return Tracker::select($columns)->lastMonth()->orderBy('id', 'asc')->get();
}
public function duplicate($id)
{
return false;
}
}
public function find($id, $columns = array('*'))
{
return Tracker::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Tracker::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Tracker::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Tracker::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Tracker::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Tracker::select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return Tracker::search($search)->orderBy('lastname', 'asc')->get();
}
public function destroy($id)
{
return Tracker::findOrFail($id)->delete();
}
public function first()
{
return Tracker::first();
}
public function lasts($limit)
{
return Tracker::latest()->limit($limit)->get();
}
public function truncate()
{
return Tracker::truncate();
}
public function currentWeek($columns = array('*'))
{
return Tracker::select($columns)->currentWeek()->orderBy('id', 'desc')->get();
}
public function lastWeek($columns = array('*'))
{
return Tracker::select($columns)->lastWeek()->orderBy('id', 'desc')->get();
}
public function currentMonth($columns = array('*'))
{
return Tracker::select($columns)->currentMonth()->orderBy('id', 'asc')->get();
}
public function lastMonth($columns = array('*'))
{
return Tracker::select($columns)->lastMonth()->orderBy('id', 'asc')->get();
}
public function currentYear($columns = array('*'))
{
return Tracker::select($columns)->currentMonth()->orderBy('id', 'asc')->get();
}
public function lastYear($columns = array('*'))
{
return Tracker::select($columns)->lastMonth()->orderBy('id', 'asc')->get();
}
public function duplicate($id)
{
return false;
}
}
......@@ -7,138 +7,138 @@ use Illuminate\Support\Str;
use Illuminate\Support\Collection;
class UserRepository implements RepositoryInterface {
public function all($columns = array('*'))
{
return User::with('roles')->select($columns)->orderBy('lastname', 'asc')->get();
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "", $role_id = null)
{
if ($role_id) {
return User::whereHas('roles', function($query) use ($role_id) {
$query->where('role_id', $role_id);
})->search($search)->orderBy($filter, $sort)->paginate($per_page);
}
return User::with('roles')->search($search)->orderBy($filter, $sort)->paginate($per_page);
}
public function published($columns = array('*'))
{
return User::active()->select($columns)->orderBy('lastname', 'asc')->get();
}
public function new()
{
return new User;
}
public function store(Collection $data, $id)
{
if (is_null($id)) {
class UserRepository implements RepositoryInterface
{
public function all($columns = array('*'))
{
return User::with('roles')->select($columns)->orderBy('lastname', 'asc')->get();
}
public function list($filter, $sort = 'asc', $per_page = 15, $search = "", $role_id = null)
{
if ($role_id) {
return User::whereHas('roles', function ($query) use ($role_id) {
$query->where('role_id', $role_id);
})->search($search)->orderBy($filter, $sort)->paginate($per_page);
}
return User::with('roles')->search($search)->orderBy($filter, $sort)->paginate($per_page);
}
public function published($columns = array('*'))
{
return User::active()->select($columns)->orderBy('lastname', 'asc')->get();
}
public function new()
{
return new User;
}
public function store(array $data, $id)
{
if (is_null($id)) {
$user = new User;
} else {
$user = User::findOrFail($id);
}
} else {
$user = User::findOrFail($id);
}
$user->api_token = Str::random(60);
$user->avatar = $data->get('avatar');
$user->lastname = $data->get('lastname');
$user->firstname = $data->get('firstname');
$user->email = $data->get('email');
$user->comment = $data->get('comment');
$user->company = $data->get('company');
$user->activity = $data->get('activity');
$user->telephone = $data->get('telephone');
$user->address = $data->get('address');
$user->zipcode = $data->get('zipcode');
$user->city = $data->get('city');
// Si le champs active est donné
if ($data->has('active')) {
$user->active = $data->get('active');
}
// Si le mot de passe est changé
if (!is_null($data->get('password'))) {
$user->password = bcrypt($data->get('password'));
$user->avatar = data_get($data, 'avatar');
$user->lastname = data_get($data, 'lastname');
$user->firstname = data_get($data, 'firstname');
$user->email = data_get($data, 'email');
$user->comment = data_get($data, 'comment');
$user->company = data_get($data, 'company');
$user->activity = data_get($data, 'activity');
$user->telephone = data_get($data, 'telephone');
$user->address = data_get($data, 'address');
$user->zipcode = data_get($data, 'zipcode');
$user->city = data_get($data, 'city');
// Si le champs active est donné
if (isset($data['active'])) {
$user->active = data_get($data, 'active');
}
// Si le mot de passe est changé
if (isset($data['password'])) {
$user->password = bcrypt(data_get($data, 'password'));
}
$user->save();
// Changement du role de l'utilisateur
if ($data->has('role')) {
$user->syncRoles($data->get('role'));
if (isset($data['role'])) {
$user->syncRoles(data_get($data, 'role'));
}
return $user;
}
public function find($id, $columns = array('*'))
{
return User::with('roles')->select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return User::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return User::with('roles')->select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return User::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return User::with('roles')->select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return User::with('roles')->select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return User::search($search)->orderBy('lastname', 'asc')->get();
}
public function destroy($id)
{
return User::findOrFail($id)->delete();
}
public function first()
{
return User::first();
}
public function lasts($limit)
{
return User::latest()->limit($limit)->get();
}
public function truncate()
{
return User::truncate();
}
public function duplicate($id)
{
return false;
}
public function getAvatars()
{
return User::getAvatars();
}
}
public function find($id, $columns = array('*'))
{
return User::with('roles')->select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return User::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return User::with('roles')->select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return User::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return User::with('roles')->select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return User::with('roles')->select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return User::search($search)->orderBy('lastname', 'asc')->get();
}
public function destroy($id)
{
return User::findOrFail($id)->delete();
}
public function first()
{
return User::first();
}
public function lasts($limit)
{
return User::latest()->limit($limit)->get();
}
public function truncate()
{
return User::truncate();
}
public function duplicate($id)
{
return false;
}
public function getAvatars()
{
return User::getAvatars();
}
}
<?php
namespace Goldenscarab\Modulus\App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ApiIndexRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'sort' => 'nullable|string',
'direction' => 'required_with:sort|string',
'perpage' => 'nullable|in:10,50,100,250,500',
'search' => 'nullable|string',
'filter' => 'nullable|string|regex:/^.*:.*$/',
'include' => 'nullable|array'
];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes()
{
return [];
}
}
......@@ -29,7 +29,7 @@ class RoleStoreRequest extends FormRequest
{
return [
'name' => 'required|max:254|string|unique:roles,name,' . $this->route('id'),
'name' => 'required|max:254|string',
'display_name' => 'required|max:254|string',
'description' => 'nullable|max:254|string',
];
......
......@@ -10,80 +10,87 @@ use Goldenscarab\Modulus\App\Http\Repositories\PermissionRepository;
class PermissionService
{
private $perm_repo;
private $role_repo;
private $types = array(
'read' => 'Lire',
'create' => 'Ajouter',
'update' => 'Modifier',
'delete' => 'Supprimer'
);
public function __construct(PermissionRepository $permission)
{
$this->perm_repo = $permission;
$this->role_repo = new RoleRepository;
}
public function addPermissionsGroup($display_name)
{
$name = Str::slug($display_name);
// On vérifie que la permission n'existe pas déja
$perm = $this->perm_repo->findBy('name', $name . '-read');
if($perm) {
return false;
}
// On récupère le role admin pour associer les nouvelles permission
$role = $this->role_repo->findOrFailBy('name', 'admin');
// Pour chaque élements du groupe
foreach ($this->types as $type => $human_type) {
$data = collect([
'name' => $name . '-' . $type,
'display_name' => $display_name . ' ' . ucfirst($type),
'description' => $human_type . ' ' . $display_name
]);
// Création de la permission
$perm = $this->perm_repo->store($data);
// Ajout de la permission au role admin
if ($perm) {
$role->givePermissionTo($perm);
}
}
return true;
}
public function deletePermissionsGroup($display_name)
{
private $perm_repo;
private $role_repo;
private $types = array(
'read' => 'Lire',
'create' => 'Ajouter',
'update' => 'Modifier',
'delete' => 'Supprimer'
);
public function __construct(PermissionRepository $permission)
{
$this->perm_repo = $permission;
$this->role_repo = new RoleRepository;
}
public function addPermissionsGroup($display_name)
{
$name = Str::slug($display_name);
// On vérifie que la permission n'existe pas déja
$perm = $this->perm_repo->findBy('name', $name . '-read');
if ($perm) {
return false;
}
// On récupère le role admin pour associer les nouvelles permission
$role_web = $this->role_repo->findWhere("name = 'admin' AND guard_name = 'web'")->first();
$role_api = $this->role_repo->findWhere("name = 'admin' AND guard_name = 'api'")->first();
// Pour chaque élements du groupe
foreach ($this->types as $type => $human_type) {
$data = [
'name' => $name . '-' . $type,
'guard_name' => 'web',
'display_name' => $display_name . ' ' . ucfirst($type),
'description' => $human_type . ' ' . $display_name
];
// Création de la permission web
$perm_web = $this->perm_repo->store($data);
// Création de la permission api
$data['guard_name'] = 'api';
$perm_api = $this->perm_repo->store($data);
// Ajout de la permission au role admin
if ($perm_web && $perm_api) {
$role_web->givePermissionTo($perm_web);
$role_api->givePermissionTo($perm_api);
}
}
return true;
}
public function deletePermissionsGroup($display_name)
{
// On récupère le role admin pour supprimer les permissions
$role_admin = $this->role_repo->findOrFailBy('name', 'admin');
//$role_edit = $this->role_repo->findOrFailBy('name', 'editeur');
$role_admin = $this->role_repo->findOrFailBy('name', 'admin');
//$role_edit = $this->role_repo->findOrFailBy('name', 'editeur');
// Pour chaque élements du groupe
foreach ($this->types as $type => $human_type) {
// Pour chaque élements du groupe
foreach ($this->types as $type => $human_type) {
// Construction du nom de la permission
$name = Str::slug($display_name) . '-' . $type;
// Récupération de la permission
$perm = $this->perm_repo->findBy('name', $name);
// Construction du nom de la permission
$name = Str::slug($display_name) . '-' . $type;
// Récupération de la permission
$perms = $this->perm_repo->findAllBy('name', $name);
// Si la permission est trouvée, alors on la supprime
if($perm) {
$role_admin->revokePermissionTo($perm);
$perm->delete();
}
// Si des permissions sont trouvées, alors on les supprimes
if ($perms->isNotEmpty()) {
}
return true;
}
foreach($perms as $perm) {
$role_admin->revokePermissionTo($perm);
$perm->delete();
}
}
}
return true;
}
}
......@@ -2,10 +2,9 @@
namespace Goldenscarab\Modulus\App\Providers;
use Goldenscarab\Modulus\App\Console\Modulus\EmailTest;
use Illuminate\Support\ServiceProvider;
use Goldenscarab\Modulus\App\Console\Modulus\EmailTestCommand;
use Goldenscarab\Modulus\App\Console\Modulus\MakeResourceCommand;
class LoadServiceProvider extends ServiceProvider
{
......@@ -18,12 +17,13 @@ class LoadServiceProvider extends ServiceProvider
{
if ($this->app->runningInConsole()) {
$this->commands([
EmailTest::class,
EmailTestCommand::class,
MakeResourceCommand::class
]);
}
//$this->loadMigrationsFrom(__DIR__.'/../../database/migrations');
$this->loadTranslationsFrom(__DIR__.'/../../resources/lang', 'modulus');
$this->loadViewsFrom(__DIR__.'/../../resources/views', 'modulus');
$this->loadTranslationsFrom(__DIR__ . '/../../resources/lang', 'modulus');
$this->loadViewsFrom(__DIR__ . '/../../resources/views', 'modulus');
}
}
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Decimal implements Rule
{
private $precision;
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct($precision = 3)
{
$this->precision = $precision;
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('#^-?[0-9 ]+([.,][0-9]{0,'. $this->precision .'})?$#', $value) === 1;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return "Le champs :attribute doit être de type décimal. ex : 1234," . str_pad(1, $this->precision, 1);
}
}
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Period implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('/^(0[1-9]|[12][0-9]|3[01])[\/-](0[1-9]|1[0-2])[\/-]\d{4}\s-\s(0[1-9]|[12][0-9]|3[01])[\/-](0[1-9]|1[0-2])[\/-]\d{4}$/', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'La valeur du champs :attribute ne contient pas une période valide. ex: dd/mm/YY - dd/mm/YY';
}
}
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Siren implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('#^[0-9]{3}\s?[0-9]{3}\s?[0-9]{3}$#', $value) === 1;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return "Le champs :attribute doit être de type SIREN. ex : 123 123 123";
}
}
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Siret implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('#^[0-9]{3}\s?[0-9]{3}\s?[0-9]{3}\s?[0-9]{5,6}$#', $value) === 1;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return "Le champs :attribute doit être de type SIRET. ex : 123 123 123 00012";
}
}
......@@ -25,7 +25,7 @@ class Telephone implements Rule
*/
public function passes($attribute, $value)
{
return preg_match('/^(\+\d{2}|0)(\d|\s\d){1}([\s|\-|\.]{0,1}[\d]{2}){4}$/', $value);
return preg_match('/^(\+\d{2}|0)(\d|\s\d|\s\(0\)\d){1}([\s|\-|\.]{0,1}[\d]{2}){4}$/', $value);
}
/**
......
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Time implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('/^([0-1]?[0-9]|2[0-3]):[0-5][0-9]$/', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'La valeur du champs :attribute ne contient pas une heure valide. ex: HH:ii';
}
}
\ No newline at end of file
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class ZipcodeFr implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return preg_match('#^[0-9]{5}$#', $value) === 1;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return "Le champs :attribute doit être de type code postal. ex : 12345";
}
}
<?php
namespace Goldenscarab\Modulus\App\Support;
class Stub
{
/**
* The stub path.
*
* @var string
*/
protected $path;
/**
* The base path of stub file.
*
* @var null|string
*/
protected static $basePath = null;
/**
* The replacements array.
*
* @var array
*/
protected $replaces = [];
/**
* The contructor.
*
* @param string $path
* @param array $replaces
*/
public function __construct($path, array $replaces = [])
{
$this->path = $path;
$this->replaces = $replaces;
}
/**
* Create new self instance.
*
* @param string $path
* @param array $replaces
*
* @return self
*/
public static function create($path, array $replaces = [])
{
return new static($path, $replaces);
}
/**
* Set stub path.
*
* @param string $path
*
* @return self
*/
public function setPath($path)
{
$this->path = $path;
return $this;
}
/**
* Get stub path.
*
* @return string
*/
public function getPath()
{
$path = static::getBasePath() . $this->path;
return file_exists($path) ? $path : __DIR__ . '/../Console/Modulus/stubs/' . $this->path;
}
/**
* Set base path.
*
* @param string $path
*/
public static function setBasePath($path)
{
static::$basePath = $path;
}
/**
* Get base path.
*
* @return string|null
*/
public static function getBasePath()
{
return static::$basePath;
}
/**
* Get stub contents.
*
* @return mixed|string
*/
public function getContents()
{
$contents = file_get_contents($this->getPath());
foreach ($this->replaces as $search => $replace) {
$contents = str_replace('$' . strtoupper($search) . '$', $replace, $contents);
}
return $contents;
}
/**
* Get stub contents.
*
* @return string
*/
public function render()
{
return $this->getContents();
}
/**
* Save stub to specific path.
*
* @param string $path
* @param string $filename
*
* @return bool
*/
public function saveTo($path, $filename)
{
return file_put_contents($path . '/' . $filename, $this->getContents());
}
/**
* Set replacements array.
*
* @param array $replaces
*
* @return $this
*/
public function replace(array $replaces = [])
{
$this->replaces = $replaces;
return $this;
}
/**
* Get replacements.
*
* @return array
*/
public function getReplaces()
{
return $this->replaces;
}
/**
* Handle magic method __toString.
*
* @return string
*/
public function __toString()
{
return $this->render();
}
}
<?php
namespace Goldenscarab\Modulus\App\Traits;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Builder;
trait ModelFilterable
{
/**
* Filtre depuis une colonne
* TODO - Ajout de sécurité (paramètre $filterable, dans le modèle)
*
* Syntax : [relation].[colonne]|[operator]|[value]
*
* Exemples :
* - $query->filter('colonne|=|value')->get();
* - $query->filter('relation.colonne|!=|value')->get();
* - $query->filter('relation1.relation2.colonne|>|value')->get();
*
* @param Builder $query
* @param string $filter
* @return Builder
*/
public function scopeFilter(Builder $query, $filter = null)
{
if (is_null($filter) || !Str::contains($filter, '|')) {
return $query;
}
$splited = explode('|', $filter);
$column = $splited[0];
$operator = $splited[1];
$value = $splited[2];
if (Str::contains($column, '.')) {
$this->relationFilter($query, $column, $operator, $value);
} else {
return $query->where($column, $operator, $value);
}
}
private function relationFilter(Builder $query, $column, $operator, $value)
{
preg_match('/([^.]*)\.(.*)/', $column, $match);
$relation = $match[1];
$target = $match[2];
$_this = $this;
$query->whereHas($relation, function ($query) use ($target, $value, &$_this, $operator) {
if (Str::contains($target, '.')) {
$_this->relationFilter($query, $target, $operator, $value);
} else {
$table = $query->getModel()->getTable();
$query->where($table . '.' . $target, $operator, $value);
}
});
}
}
<?php
namespace Goldenscarab\Modulus\App\Traits;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Builder;
trait ModelSearchable
{
/**
* Recherche dans colonne
*
* @param Builder $query
* @param String $search
* @return Builder
*/
public function scopeSearch(Builder $query, $search)
{
if (is_null($search)) return $query;
// Pour rechercher tous les mots d'une phrase dans le champs
$search = str_replace(' ', '%', $search);
$_this = $this;
foreach ($this->searchable as $key => $column) {
$method = $key == 0 ? 'where' : 'orWhere';
if (Str::contains($column, '.')) {
$query->{$method}(function ($query) use (&$_this, $column, $search) {
$_this->relationSearch($query, $column, $search);
});
} else {
$query->{$method}($column, 'LIKE', '%' . $search . '%');
}
}
return $query;
}
private function relationSearch(Builder $query, $column, $search)
{
preg_match('/([^.]*)\.(.*)/', $column, $match);
$relation = $match[1];
$target = $match[2];
$_this = $this;
$query->whereHas($relation, function ($query) use ($target, $search, &$_this) {
if (Str::contains($target, '.')) {
$_this->relationSearch($query, $target, $search);
} else {
$table = $query->getModel()->getTable();
$query->where($table . '.' . $target, 'LIKE', '%' . $search . '%');
}
});
}
}
<?php
namespace Goldenscarab\Modulus\App\Traits;
use Exception;
use Illuminate\Support\Str;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
trait ModelSortable
{
public function scopeSortBy(Builder $builder, $column_rel, $direction = 'asc')
{
$current_model = $this->getModel();
$table = $current_model->getTable();
$builder->select($table . '.*');
// Test si relation(s)
if (Str::contains($column_rel, ',')) {
if (preg_match('/^(.*),(.*)$/', $column_rel, $matches)) {
$relations = explode('.', $matches[1]);
$column = $matches[2];
foreach ($relations as $relation) {
$current_database = $current_model->getConnection()->getDatabaseName();
$current_table = $current_model->getTable();
$rel = $current_model->$relation();
$foreign_key = $rel->getForeignKeyName();
$owner_key = $rel->getOwnerKeyName();
$current_model = $rel->getRelated(); // Le model pour la prochaine itération
$relation_database = $current_model->getConnection()->getDatabaseName();
$relation_table = $current_model->getTable();
// En fonction du type de relation
if ($rel instanceof BelongsTo) {
// Création de la relation avec « join »
$builder->join(
vsprintf('%s.%s', [$relation_database, $relation_table]),
vsprintf('%s.%s.%s', [$relation_database, $relation_table, $owner_key]),
'=',
vsprintf('%s.%s.%s', [$current_database, $current_table, $foreign_key])
);
} else if ($rel instanceof HasMany) {
//$local_key = $rel->getLocalKeyName();
// $builder->join(
// $_table = vsprintf('%s.%s', [$relation_database, $relation_table]),
// $_first = vsprintf('%s.%s.%s', [$relation_database, $relation_table, $foreign_key]),
// $_operator = '=',
// $_second = vsprintf('%s.%s.%s', [$current_database, $current_table, $local_key])
// );
// TODO - Revoir la possibilité d'ajouter des conditions dans le comptage
// $builder->orderByRaw(vsprintf('SELECT COUNT(*) FROM %s WHERE ', [$relation_database, $relation_table, $column]), $direction);
// dd($_table, $_first, $_operator, $_second);
if ($column == 'count') {
$builder->withCount($relation)->orderBy($relation . '_count', $direction);
}
} else {
// TODO les autres relations au besoin
throw new Exception('Type de relation non reconnu');
}
// On applique le tri
$builder->orderBy(vsprintf('%s.%s.%s', [$relation_database, $relation_table, $column]), $direction);
}
}
} else if (!empty($column_rel)) {
$builder->orderBy($column_rel, $direction);
}
return $builder;
}
}
<?php
namespace Goldenscarab\Modulus\database\factories;
use Illuminate\Support\Str;
use Goldenscarab\Modulus\App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class UserFactory extends Factory
{
protected $model = User::class;
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition()
{
return [
'avatar' => fake()->randomElement(['/images/modulus/man.svg', '/images/modulus/women.svg']),
'lastname' => fake()->lastName(),
'firstname' => fake()->firstName(),
'email' => fake()->safeEmail(),
'email_verified_at' => now(),
'api_token' => Str::random(60),
'company' => fake()->company(),
'comment' => fake()->sentence(),
'active' => fake()->boolean(),
'password' => bcrypt(fake()->bothify('??###?#???##')),
'remember_token' => Str::random(10),
];
}
/**
* Indicate that the model's email address should be unverified.
*
* @return static
*/
public function unverified()
{
return $this->state(function (array $attributes) {
return [
'email_verified_at' => null,
];
});
}
public function active($active)
{
return $this->state(function (array $attributes) use ($active) {
return [
'active' => $active,
];
});
}
}
......@@ -63,8 +63,73 @@
<i class="fa fa-check marfin-r-10" aria-hidden="true"></i>
Choisir les permissions associées au rôle
</div>
<h4>Permissions Web</h4>
<table class="table table-sm table-hover table-striped table-sortable table-responsive-md">
<table class="table table-sm table-hover table-striped table-sortable table-responsive-md">
<thead>
<tr>
<th width="200"></th>
<th width="80" class="text-center">Lire</th>
<th width="80" class="text-center">Ajouter</th>
<th width="80" class="text-center">Modifier</th>
<th width="80" class="text-center">Supprimer</th>
<th></th>
</tr>
</thead>
<tbody>
@forelse ($permissions['web'] as $name => $perm)
<tr>
<td>
{{ $name }}
</td>
<td class="text-center">
@php
$id_perm = data_get($perm, 'read');
@endphp
<input type="checkbox" name="permissions_web[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions_web.'.$id_perm) == data_get($perm, 'read') ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td class="text-center">
@php
$id_perm = data_get($perm, 'create');
@endphp
<input type="checkbox" name="permissions_web[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions_web.'.$id_perm) == data_get($perm, 'create') ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td class="text-center">
@php
$id_perm = data_get($perm, 'update');
@endphp
<input type="checkbox" name="permissions_web[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions_web.'.$id_perm) == data_get($perm, 'update') ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td class="text-center">
@php
$id_perm = data_get($perm, 'delete');
@endphp
<input type="checkbox" name="permissions_web[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions_web.'.$id_perm) == data_get($perm, 'delete') ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td>
</td>
</tr>
@empty
Aucune permissions n'est disponible
@endforelse
</tbody>
</table>
<h4>Permissions Api</h4>
<table class="table table-sm table-hover table-striped table-sortable table-responsive-md">
<thead>
<tr>
......@@ -78,43 +143,43 @@
</thead>
<tbody>
@forelse ($permissions as $name => $perm)
@forelse ($permissions['api'] as $name => $perm)
<tr>
<td>
{{ $name }}
</td>
<td class="text-center">
@php
$id_perm = collect($perm)->get('read');
$id_perm = data_get($perm, 'read');
@endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}>
<input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ !empty(old('permissions_api.'.$id_perm)) ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td class="text-center">
@php
$id_perm = collect($perm)->get('create');
$id_perm = data_get($perm, 'create');
@endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}>
<input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ !empty(old('permissions_api.'.$id_perm)) ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td class="text-center">
@php
$id_perm = collect($perm)->get('update');
$id_perm = data_get($perm, 'update');
@endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}>
<input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ !empty(old('permissions_api.'.$id_perm)) ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td class="text-center">
@php
$id_perm = collect($perm)->get('delete');
$id_perm = data_get($perm, 'delete');
@endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}>
<input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ !empty(old('permissions_api.'.$id_perm)) ||
$item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td>
<td>
......@@ -127,6 +192,7 @@
</tbody>
</table>
</div>
</div>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment