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; ...@@ -14,12 +14,12 @@ use Modules\Small\Http\Repositories\SmallRepository;
class SmallController extends Controller 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;
} }
/** /**
...@@ -30,13 +30,19 @@ class SmallController extends Controller ...@@ -30,13 +30,19 @@ class SmallController extends Controller
{ {
$sort = $request->get('sort', 'id'); $sort = $request->get('sort', 'id');
$direction = $request->get('direction', 'asc'); $direction = $request->get('direction', 'asc');
$persmall = $request->get('perpage', 15); $perpage = $request->get('perpage', 15);
$search = $request->get('search'); $search = $request->get('search');
$filter = $request->get('filter');
$include = $request->get('include');
$smalls = $this->small_repo->list($sort, $direction, $persmall, $search); $resources = $this->repository->list($sort, $direction, $perpage, $search, $filter);
$smalls->load('user');
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 ...@@ -56,10 +62,10 @@ class SmallController extends Controller
*/ */
public function show(Request $request, $public_id) 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 // 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 ...@@ -24,7 +24,7 @@ class ConfigController extends Controller
'config' => null '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', 'title' => '<i class="fa fa-cogs mr-2" aria-hidden="true"></i>Module Small',
'subtitle' => 'Configuration', 'subtitle' => 'Configuration',
'config' => $config, 'config' => $config,
......
...@@ -7,21 +7,22 @@ use Illuminate\Http\Request; ...@@ -7,21 +7,22 @@ use Illuminate\Http\Request;
use Illuminate\Routing\Controller; use Illuminate\Routing\Controller;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use Modules\Small\Exports\SmallExport;
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect; use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Response;
use Illuminate\Contracts\Support\Renderable; use Illuminate\Contracts\Support\Renderable;
use Modules\Small\Exports\SmallExport;
use Modules\Small\Http\Requests\SmallStoreRequest; use Modules\Small\Http\Requests\SmallStoreRequest;
use Modules\Small\Http\Repositories\SmallRepository; use Modules\Small\Http\Repositories\SmallRepository;
class SmallController extends Controller class SmallController extends Controller
{ {
private $small_repo; private $repository;
public function __construct(SmallRepository $small) public function __construct(SmallRepository $small)
{ {
$this->small_repo = $small; $this->repository = $small;
// Définition des permissions par méthode // Définition des permissions par méthode
$this->middleware('permission:module-small-read')->only(['index']); $this->middleware('permission:module-small-read')->only(['index']);
...@@ -43,8 +44,8 @@ class SmallController extends Controller ...@@ -43,8 +44,8 @@ class SmallController extends Controller
'Exemples' => null 'Exemples' => null
); );
return view('small::app.small.index')->with([ return view('small::small.index')->with([
'title' => '<i class="fa fa-magic mr-1" aria-hidden="true"></i>Exemples', 'title' => '<i class="fa fa-magic mr-2" aria-hidden="true"></i>Exemples',
'breadcrumb' => $breadcrumb, 'breadcrumb' => $breadcrumb,
]); ]);
} }
...@@ -55,7 +56,7 @@ class SmallController extends Controller ...@@ -55,7 +56,7 @@ class SmallController extends Controller
*/ */
public function create() public function create()
{ {
$small = $this->small_repo->new(); $small = $this->repository->new();
$breadcrumb = array( $breadcrumb = array(
'Accueil' => route('modulus.dashboard'), 'Accueil' => route('modulus.dashboard'),
...@@ -63,8 +64,8 @@ class SmallController extends Controller ...@@ -63,8 +64,8 @@ class SmallController extends Controller
'Ajouter' => null 'Ajouter' => null
); );
return view('small::app.small.form')->with([ return view('small::small.form')->with([
'title' => '<i class="fa fa-magic mr-1" aria-hidden="true"></i>Exemples', 'title' => '<i class="fa fa-magic mr-2" aria-hidden="true"></i>Exemples',
'action' => '<i class="fa fa-plus mr-2"></i>Création', 'action' => '<i class="fa fa-plus mr-2"></i>Création',
'breadcrumb' => $breadcrumb, 'breadcrumb' => $breadcrumb,
'item' => $small 'item' => $small
...@@ -78,7 +79,7 @@ class SmallController extends Controller ...@@ -78,7 +79,7 @@ class SmallController extends Controller
*/ */
public function edit($id) public function edit($id)
{ {
$small = $this->small_repo->findOrFail($id); $small = $this->repository->findOrFail($id);
$breadcrumb = array( $breadcrumb = array(
...@@ -87,8 +88,8 @@ class SmallController extends Controller ...@@ -87,8 +88,8 @@ class SmallController extends Controller
'Modifier' => null 'Modifier' => null
); );
return view('small::app.small.form')->with([ return view('small::small.form')->with([
'title' => '<i class="fa fa-magic mr-1"></i>Exemples', 'title' => '<i class="fa fa-magic mr-2"></i>Exemples',
'action' => '<i class="fa fa-plus mr-2"></i>Modification', 'action' => '<i class="fa fa-plus mr-2"></i>Modification',
'breadcrumb' => $breadcrumb, 'breadcrumb' => $breadcrumb,
'item' => $small 'item' => $small
...@@ -113,7 +114,7 @@ class SmallController extends Controller ...@@ -113,7 +114,7 @@ class SmallController extends Controller
*/ */
public function show(Request $request, $id) public function show(Request $request, $id)
{ {
$small = $this->small_repo->findOrFail($id); $small = $this->repository->findOrFail($id);
$breadcrumb = array( $breadcrumb = array(
'Accueil' => route('modulus.dashboard'), 'Accueil' => route('modulus.dashboard'),
...@@ -121,8 +122,8 @@ class SmallController extends Controller ...@@ -121,8 +122,8 @@ class SmallController extends Controller
'Voir' => null 'Voir' => null
); );
return view('small::app.small.show')->with([ return view('small::small.show')->with([
'title' => '<i class="fa fa-magic mr-1"></i>Exemples', 'title' => '<i class="fa fa-magic mr-2"></i>Exemples',
'subtitle' => $small->name, 'subtitle' => $small->name,
'breadcrumb' => $breadcrumb, 'breadcrumb' => $breadcrumb,
'item' => $small 'item' => $small
...@@ -133,24 +134,30 @@ class SmallController extends Controller ...@@ -133,24 +134,30 @@ class SmallController extends Controller
* Update the specified resource in storage. * Update the specified resource in storage.
* @param SmallStoreRequest $request * @param SmallStoreRequest $request
* @param int $id * @param int $id
* @return Renderable * @return Redirect
*/ */
public function update(SmallStoreRequest $request, $id) public function update(SmallStoreRequest $request, $id)
{ {
$small_data = collect($request->except(['_token'])); $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"); Session::flash('success', "Exemple ". (is_null($id) ? 'créé' : 'modifié') . " avec succès");
return Redirect::route('module.small.index'); return Redirect::route('module.small.index');
} }
/**
* Duplicate the specified resource in storage
*
* @param int $id
* @return Redirect
*/
public function duplicate($id) public function duplicate($id)
{ {
$this->checkPermissionAccess($id); $this->checkPermissionAccess($id);
$this->small_repo->duplicate($id); $this->repository->duplicate($id);
Session::flash('success', "Exemple dupliqué avec succès"); Session::flash('success', "Exemple dupliqué avec succès");
...@@ -160,13 +167,13 @@ class SmallController extends Controller ...@@ -160,13 +167,13 @@ class SmallController extends Controller
/** /**
* Remove the specified resource from storage. * Remove the specified resource from storage.
* @param int $id * @param int $id
* @return Renderable * @return Redirect
*/ */
public function destroy($id) public function destroy($id)
{ {
$this->checkPermissionAccess($id); $this->checkPermissionAccess($id);
$this->small_repo->destroy($id); $this->repository->destroy($id);
Session::flash('success', 'Exemple supprimé avec succès'); Session::flash('success', 'Exemple supprimé avec succès');
...@@ -177,7 +184,7 @@ class SmallController extends Controller ...@@ -177,7 +184,7 @@ class SmallController extends Controller
* Exporte les données de la exemple * Exporte les données de la exemple
* *
* @param int $id * @param int $id
* @return void * @return Response
*/ */
public function export() public function export()
{ {
......
...@@ -8,35 +8,17 @@ use Modules\Small\Models\Small; ...@@ -8,35 +8,17 @@ use Modules\Small\Models\Small;
use Goldenscarab\Modulus\App\Http\Repositories\RepositoryInterface; use Goldenscarab\Modulus\App\Http\Repositories\RepositoryInterface;
class SmallRepository implements RepositoryInterface { class SmallRepository implements RepositoryInterface
{
public function all($columns = array('*')) public function all($columns = array('*'))
{ {
return Small::select($columns)->orderBy('id', 'asc')->get(); 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 return Small::search($search)->filter($filter)->sortBy($sorting, $direction)->paginate($perpage);
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;
} }
public function published($columns = array('*')) public function published($columns = array('*'))
...@@ -52,17 +34,17 @@ class SmallRepository implements RepositoryInterface { ...@@ -52,17 +34,17 @@ class SmallRepository implements RepositoryInterface {
public function store(Collection $data, $id = null) public function store(Collection $data, $id = null)
{ {
if (is_null($id)) { if (is_null($id)) {
$small = new Small; $resource = new Small;
} else { } else {
$small = Small::findOrFail($id); $resource = Small::findOrFail($id);
} }
$small->name = $data->get('name'); $resource->name = $data->get('name');
$small->user_id = $data->get('user_id'); $resource->user_id = $data->get('user_id');
$small->save(); $resource->save();
return $small; return $resource;
} }
public function find($id, $columns = array('*')) public function find($id, $columns = array('*'))
...@@ -118,8 +100,8 @@ class SmallRepository implements RepositoryInterface { ...@@ -118,8 +100,8 @@ class SmallRepository implements RepositoryInterface {
public function duplicate($id) public function duplicate($id)
{ {
$item = Small::findOrFail($id); $resource = Small::findOrFail($id);
$clone = $item->replicate(); $clone = $resource->replicate();
$availables = ['title', 'name', 'label', 'slug']; $availables = ['title', 'name', 'label', 'slug'];
...@@ -144,13 +126,13 @@ class SmallRepository implements RepositoryInterface { ...@@ -144,13 +126,13 @@ class SmallRepository implements RepositoryInterface {
private function calcNextPosition() 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 1;
} }
return $item->position + 1; return $resource->position + 1;
} }
} }
...@@ -2,14 +2,18 @@ ...@@ -2,14 +2,18 @@
namespace Modules\Small\Models; namespace Modules\Small\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Goldenscarab\Modulus\App\Models\User; use Goldenscarab\Modulus\App\Models\User;
use Illuminate\Database\Eloquent\Builder; 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 class Small extends Model
{ {
use ModelSortable, ModelFilterable, ModelSearchable;
protected $table = 'module_smalls'; protected $table = 'module_smalls';
protected $fillable = []; protected $fillable = [];
...@@ -23,7 +27,7 @@ class Small extends Model ...@@ -23,7 +27,7 @@ class Small extends Model
protected $appends = []; protected $appends = [];
/* Relation */ /* Relations */
public function user() public function user()
{ {
return $this->belongsTo(User::class, 'user_id'); return $this->belongsTo(User::class, 'user_id');
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
]; ];
$params_list = [ $params_list = [
'source' => route('api.module.small.index'), 'source' => route('api.module.small.index', ['include' => ['user']),
'menu' => [ 'menu' => [
'button' => $am->make('[READ]', ['attributes' => ['class' => 'btn-sm btn-success']]), 'button' => $am->make('[READ]', ['attributes' => ['class' => 'btn-sm btn-success']]),
'dropdown' => [ 'dropdown' => [
......
...@@ -5,7 +5,7 @@ namespace Goldenscarab\Modulus\App\Console\Modulus; ...@@ -5,7 +5,7 @@ namespace Goldenscarab\Modulus\App\Console\Modulus;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
class EmailTest extends Command class EmailTestCommand extends Command
{ {
/** /**
* The name and signature of the console command. * The name and signature of the console command.
...@@ -42,7 +42,7 @@ class EmailTest extends 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(vsprintf('Expéditeur: %s <%s>', [config('mail.from.name'), config('mail.from.address')]));
$this->line(sprintf('Destinataire: %s', $this->argument('email'))); $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'); $msg->to($this->argument('email'))->subject('Modulus Test Email');
}); });
......
This diff is collapsed.
<?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(),
// ]
// ]);
}
}
This diff is collapsed.
@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 ...@@ -59,7 +59,7 @@ class ModuleController extends Controller
$modules = Module::toCollection(); $modules = Module::toCollection();
// Désactiver les modules non installé // Désactiver les modules non installé
$modules->each(function(&$m, $key) { $modules->each(function (&$m, $key) {
// Recherche de la config du module dans modulus // Recherche de la config du module dans modulus
$module = $this->module_repo->findBy('slug', $m->getAlias()); $module = $this->module_repo->findBy('slug', $m->getAlias());
...@@ -69,7 +69,7 @@ class ModuleController extends Controller ...@@ -69,7 +69,7 @@ class ModuleController extends Controller
}); });
// On supprime de la liste les modules caché // 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; return $module->get('hidden') == false;
}); });
...@@ -115,7 +115,7 @@ class ModuleController extends Controller ...@@ -115,7 +115,7 @@ class ModuleController extends Controller
'priority' => $module->get('priority') '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 // Ajout des permissions d'accès au module
PermissionService::addPermissionsGroup('Module ' . $module->getName()); PermissionService::addPermissionsGroup('Module ' . $module->getName());
...@@ -165,11 +165,10 @@ class ModuleController extends Controller ...@@ -165,11 +165,10 @@ class ModuleController extends Controller
'priority' => $module->get('priority') '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"); Session::flash('success', "Module mis à jour avec succès");
return Redirect::route('modulus.module.index'); return Redirect::route('modulus.module.index');
} }
} }
...@@ -96,8 +96,7 @@ class PermissionController extends Controller ...@@ -96,8 +96,7 @@ class PermissionController extends Controller
public function store(PermissionStoreRequest $request, $id = null) public function store(PermissionStoreRequest $request, $id = null)
{ {
$permission_data = collect($request->except(['_token'])); $permission_data = $request->except(['_token']);
if (is_null($id)) { if (is_null($id)) {
$base_name = $request->get('name'); $base_name = $request->get('name');
...@@ -111,14 +110,14 @@ class PermissionController extends Controller ...@@ -111,14 +110,14 @@ class PermissionController extends Controller
$name = $base_name . '-' . $suffix; $name = $base_name . '-' . $suffix;
$perm = $this->permission_repo->findBy('name', $name); $perm = $this->permission_repo->findBy('name', $name);
$this->permission_repo->store(collect([ $this->permission_repo->store([
'name' => $request->get('name') . '-' . $suffix, 'name' => $request->get('name') . '-' . $suffix,
'display_name' => $request->get('display_name') . ' ' . ucfirst($suffix), 'display_name' => $request->get('display_name') . ' ' . ucfirst($suffix),
'description' => $request->get('description') . ' ' . $description, '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'); return Redirect::route('modulus.user.permission.index');
} }
...@@ -138,5 +137,4 @@ class PermissionController extends Controller ...@@ -138,5 +137,4 @@ class PermissionController extends Controller
return Redirect::route('modulus.user.permission.index'); return Redirect::route('modulus.user.permission.index');
} }
} }
...@@ -84,9 +84,14 @@ class RoleController extends Controller ...@@ -84,9 +84,14 @@ class RoleController extends Controller
{ {
$role = $this->role_repo->findOrFail($id); $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( $breadcrumb = array(
'Accueil' => route('modulus.dashboard'), 'Accueil' => route('modulus.dashboard'),
...@@ -109,8 +114,8 @@ class RoleController extends Controller ...@@ -109,8 +114,8 @@ class RoleController extends Controller
{ {
$permissions = []; $permissions = [];
// Traitement sur les permissions // Traitement sur les permissions web
$perms->each(function($item, $key) use (&$permissions) { $perms->where('guard_name', 'web')->each(function ($item, $key) use (&$permissions) {
// Si la permission est conforme // Si la permission est conforme
if (preg_match('/-(.[^-]+)$/i', $item->name, $match)) { if (preg_match('/-(.[^-]+)$/i', $item->name, $match)) {
...@@ -124,8 +129,25 @@ class RoleController extends Controller ...@@ -124,8 +129,25 @@ class RoleController extends Controller
$name = trim(str_ireplace($perm, '', $item->display_name)); $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; return $permissions;
...@@ -133,11 +155,11 @@ class RoleController extends Controller ...@@ -133,11 +155,11 @@ class RoleController extends Controller
public function store(RoleStoreRequest $request, $id = null) 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); $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'); return Redirect::route('modulus.user.role.index');
} }
...@@ -150,5 +172,4 @@ class RoleController extends Controller ...@@ -150,5 +172,4 @@ class RoleController extends Controller
return Redirect::route('modulus.user.role.index'); return Redirect::route('modulus.user.role.index');
} }
} }
...@@ -2,17 +2,17 @@ ...@@ -2,17 +2,17 @@
namespace Goldenscarab\Modulus\App\Http\Controllers\App; namespace Goldenscarab\Modulus\App\Http\Controllers\App;
use App\Http\Controllers\Controller;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Mail;
use Maatwebsite\Excel\Facades\Excel; 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\Session;
use Illuminate\Support\Facades\Redirect; 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\RoleRepository;
use Goldenscarab\Modulus\App\Http\Repositories\UserRepository; use Goldenscarab\Modulus\App\Http\Repositories\UserRepository;
use Goldenscarab\Modulus\App\Http\Requests\ProfileStoreRequest; use Goldenscarab\Modulus\App\Http\Requests\ProfileStoreRequest;
...@@ -113,7 +113,7 @@ class UserController extends Controller ...@@ -113,7 +113,7 @@ class UserController extends Controller
public function store(UserStoreRequest $request, $id = null) public function store(UserStoreRequest $request, $id = null)
{ {
// On récupère les données utilisateur // 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 // On sauvegarde les données utilisateur
$user = $this->user_repo->store($user_data, $id); $user = $this->user_repo->store($user_data, $id);
...@@ -185,15 +185,15 @@ class UserController extends Controller ...@@ -185,15 +185,15 @@ class UserController extends Controller
} }
// Création du document Excel // 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 // 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->setCreator('BMV Communication');
$excel->setDescription(''); $excel->setDescription('');
// Création d'une nouvelle feuille de calcul // 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 // Mise en style de la feuille de calcul
$sheet->setFontFamily('Arial'); $sheet->setFontFamily('Arial');
...@@ -203,11 +203,11 @@ class UserController extends Controller ...@@ -203,11 +203,11 @@ class UserController extends Controller
$sheet->fromArray($datas_export, null, 'A1'); $sheet->fromArray($datas_export, null, 'A1');
// Ajout d'une ligne d'entête // 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, [""]); $sheet->prependRow(2, [""]);
// Mise à caractère gras des titres (ligne 3) // Mise à caractère gras des titres (ligne 3)
$sheet->row(3, function($row) { $sheet->row(3, function ($row) {
$row->setFontWeight('bold'); $row->setFontWeight('bold');
}); });
...@@ -230,7 +230,7 @@ class UserController extends Controller ...@@ -230,7 +230,7 @@ class UserController extends Controller
public function profilPost(ProfileStoreRequest $request) public function profilPost(ProfileStoreRequest $request)
{ {
$data = collect($request->except(['_token'])); $data = $request->except(['_token']);
$user = $this->user_repo->store($data, auth()->user()->id); $user = $this->user_repo->store($data, auth()->user()->id);
Session::flash('success', "Profil enregistré avec succès"); Session::flash('success', "Profil enregistré avec succès");
...@@ -273,5 +273,4 @@ class UserController extends Controller ...@@ -273,5 +273,4 @@ class UserController extends Controller
// On envoi le mail de notification d'activation de compte // On envoi le mail de notification d'activation de compte
Mail::to($user->email)->queue(new SendActiveAccountRequest($user, $reset_token)); Mail::to($user->email)->queue(new SendActiveAccountRequest($user, $reset_token));
} }
} }
...@@ -7,7 +7,8 @@ use Illuminate\Support\Collection; ...@@ -7,7 +7,8 @@ use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
class ModuleRepository implements RepositoryInterface { class ModuleRepository implements RepositoryInterface
{
public function all($columns = array('*')) public function all($columns = array('*'))
{ {
...@@ -34,7 +35,7 @@ class ModuleRepository implements RepositoryInterface { ...@@ -34,7 +35,7 @@ class ModuleRepository implements RepositoryInterface {
return Module::orderBy('priority', 'desc')->get(); return Module::orderBy('priority', 'desc')->get();
} }
public function store(Collection $data, $id = null) public function store(array $data, $id = null)
{ {
if (is_null($id)) { if (is_null($id)) {
$config = new Module; $config = new Module;
...@@ -42,10 +43,10 @@ class ModuleRepository implements RepositoryInterface { ...@@ -42,10 +43,10 @@ class ModuleRepository implements RepositoryInterface {
$config = Module::findOrFail($id); $config = Module::findOrFail($id);
} }
$config->name = $data->get('name'); $config->name = data_get($data, 'name');
$config->slug = $data->get('slug'); $config->slug = data_get($data, 'slug');
$config->menu = $data->get('menu'); $config->menu = data_get($data, 'menu');
$config->priority = $data->get('priority'); $config->priority = data_get($data, 'priority');
$config->save(); $config->save();
...@@ -122,5 +123,4 @@ class ModuleRepository implements RepositoryInterface { ...@@ -122,5 +123,4 @@ class ModuleRepository implements RepositoryInterface {
return $config->position + 1; return $config->position + 1;
} }
} }
...@@ -6,7 +6,8 @@ use Goldenscarab\Modulus\App\Models\Permission; ...@@ -6,7 +6,8 @@ use Goldenscarab\Modulus\App\Models\Permission;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
class PermissionRepository implements RepositoryInterface { class PermissionRepository implements RepositoryInterface
{
public function all($columns = array('*')) public function all($columns = array('*'))
{ {
...@@ -25,16 +26,16 @@ class PermissionRepository implements RepositoryInterface { ...@@ -25,16 +26,16 @@ class PermissionRepository implements RepositoryInterface {
public function list($filter, $sort = 'asc', $per_page = 15, $search = "") public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{ {
return Permission::where(function($query) use ($search) { return Permission::where(function ($query) use ($search) {
if (!empty($search)) { if (!empty($search)) {
$query->where('name', 'LIKE','%' . $search . '%') $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('display_name', 'LIKE','%' . $search . '%') ->orWhere('display_name', 'LIKE', '%' . $search . '%')
->orWhere('description', 'LIKE','%' . $search . '%'); ->orWhere('description', 'LIKE', '%' . $search . '%');
} }
})->orderBy($filter, $sort)->paginate($per_page); })->orderBy($filter, $sort)->paginate($per_page);
} }
public function store(Collection $data, $id = null) public function store(array $data, $id = null)
{ {
if (is_null($id)) { if (is_null($id)) {
$permission = new Permission; $permission = new Permission;
...@@ -42,10 +43,10 @@ class PermissionRepository implements RepositoryInterface { ...@@ -42,10 +43,10 @@ class PermissionRepository implements RepositoryInterface {
$permission = Permission::findOrFail($id); $permission = Permission::findOrFail($id);
} }
$permission->name = $data->get('name'); $permission->name = data_get($data, 'name');
//$permission->guard_name = $data->get('guard_name'); $permission->guard_name = data_get($data, 'guard_name', 'web');
$permission->display_name = $data->get('display_name'); $permission->display_name = data_get($data, 'display_name');
$permission->description = $data->get('description'); $permission->description = data_get($data, 'description');
$permission->save(); $permission->save();
return $permission; return $permission;
......
...@@ -11,11 +11,9 @@ interface RepositoryInterface ...@@ -11,11 +11,9 @@ interface RepositoryInterface
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(Collection $data, $id); public function store(array $data, $id);
public function find($id, $columns = array('*')); public function find($id, $columns = array('*'));
...@@ -31,10 +29,6 @@ interface RepositoryInterface ...@@ -31,10 +29,6 @@ interface RepositoryInterface
public function first(); public function first();
public function lasts($limit);
public function search($search);
public function duplicate($id); public function duplicate($id);
public function destroy($id); public function destroy($id);
......
...@@ -6,7 +6,8 @@ use Spatie\Permission\Models\Role; ...@@ -6,7 +6,8 @@ use Spatie\Permission\Models\Role;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
class RoleRepository implements RepositoryInterface { class RoleRepository implements RepositoryInterface
{
public function all($columns = array('*')) public function all($columns = array('*'))
{ {
...@@ -25,34 +26,68 @@ class RoleRepository implements RepositoryInterface { ...@@ -25,34 +26,68 @@ class RoleRepository implements RepositoryInterface {
public function list($filter, $sort = 'asc', $per_page = 15, $search = "") public function list($filter, $sort = 'asc', $per_page = 15, $search = "")
{ {
return Role::where(function($query) use ($search) { return Role::where(function ($query) use ($search) {
if (!empty($search)) { if (!empty($search)) {
$query->where('name', 'LIKE','%' . $search . '%') $query->where('name', 'LIKE', '%' . $search . '%')
->orWhere('display_name', 'LIKE','%' . $search . '%') ->orWhere('display_name', 'LIKE', '%' . $search . '%')
->orWhere('description', 'LIKE','%' . $search . '%'); ->orWhere('description', 'LIKE', '%' . $search . '%');
} }
})->orderBy($filter, $sort)->paginate($per_page); })->orderBy($filter, $sort)->get()->unique('name');
} }
public function store(Collection $data, $id) public function store(array $data, $id)
{ {
if (is_null($id)) { if (is_null($id)) {
$role = new Role; $role = new Role;
} else {
$role = Role::findOrFail($id); $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('name'); $role->name = data_get($data, 'name');
//$role->guard_name = $data->get('guard_name'); $role->display_name = data_get($data, 'display_name');
$role->display_name = $data->get('display_name'); $role->description = data_get($data, 'description');
$role->description = $data->get('description');
$role->save(); $role->save();
// Si il y a des permissions à activer // Si il y a des permissions à activer
if ($data->has('permissions')) { if ($role->guard_name == 'web' && isset($data['permissions_web'])) {
$role->syncPermissions(data_get($data, 'permissions_web'));
}
$role->syncPermissions($data->get('permissions')); // 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; return $role;
...@@ -60,7 +95,7 @@ class RoleRepository implements RepositoryInterface { ...@@ -60,7 +95,7 @@ class RoleRepository implements RepositoryInterface {
public function find($id, $columns = array('*')) public function find($id, $columns = array('*'))
{ {
return Role::with('perms')->select($columns)->find($id); return Role::select($columns)->find($id);
} }
public function findOrFail($id, $columns = array('*')) public function findOrFail($id, $columns = array('*'))
...@@ -70,7 +105,7 @@ class RoleRepository implements RepositoryInterface { ...@@ -70,7 +105,7 @@ class RoleRepository implements RepositoryInterface {
public function findBy($field, $value, $columns = array('*')) public function findBy($field, $value, $columns = array('*'))
{ {
return Role::with('perms')->select($columns)->where($field, '=', $value)->first(); return Role::select($columns)->where($field, '=', $value)->first();
} }
public function findOrFailBy($field, $value, $columns = array('*')) public function findOrFailBy($field, $value, $columns = array('*'))
...@@ -80,12 +115,12 @@ class RoleRepository implements RepositoryInterface { ...@@ -80,12 +115,12 @@ class RoleRepository implements RepositoryInterface {
public function findAllBy($field, $value, $columns = array('*')) public function findAllBy($field, $value, $columns = array('*'))
{ {
return Role::with('perms')->select($columns)->where($field, '=', $value)->get(); return Role::select($columns)->where($field, '=', $value)->get();
} }
public function findWhere($where, $columns = array('*')) public function findWhere($where, $columns = array('*'))
{ {
return Role::with('perms')->select($columns)->whereRaw($where)->get(); return Role::select($columns)->whereRaw($where)->get();
} }
public function search($search) public function search($search)
...@@ -117,5 +152,4 @@ class RoleRepository implements RepositoryInterface { ...@@ -117,5 +152,4 @@ class RoleRepository implements RepositoryInterface {
{ {
return false; return false;
} }
} }
...@@ -6,7 +6,8 @@ use Goldenscarab\Modulus\App\Models\Tracker; ...@@ -6,7 +6,8 @@ use Goldenscarab\Modulus\App\Models\Tracker;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
class TrackerRepository implements RepositoryInterface { class TrackerRepository implements RepositoryInterface
{
public function all($columns = array('*')) public function all($columns = array('*'))
{ {
...@@ -28,7 +29,7 @@ class TrackerRepository implements RepositoryInterface { ...@@ -28,7 +29,7 @@ class TrackerRepository implements RepositoryInterface {
return new Tracker; return new Tracker;
} }
public function store(Collection $data, $id = null) public function store(array $data, $id = null)
{ {
if (is_null($id)) { if (is_null($id)) {
$tracker = new Tracker; $tracker = new Tracker;
...@@ -36,20 +37,20 @@ class TrackerRepository implements RepositoryInterface { ...@@ -36,20 +37,20 @@ class TrackerRepository implements RepositoryInterface {
$tracker = Tracker::findOrFail($id); $tracker = Tracker::findOrFail($id);
} }
$tracker->ip = $data->get('ip'); $tracker->ip = data_get($data, 'ip');
$tracker->connected_user = $data->get('connected_user'); $tracker->connected_user = data_get($data, 'connected_user');
$tracker->request_uri = $data->get('request_uri'); $tracker->request_uri = data_get($data, 'request_uri');
$tracker->request_method = $data->get('request_method'); $tracker->request_method = data_get($data, 'request_method');
$tracker->http_user_agent = $data->get('http_user_agent'); $tracker->http_user_agent = data_get($data, 'http_user_agent');
$tracker->provider = $data->get('provider'); $tracker->provider = data_get($data, 'provider');
$tracker->zip_code = $data->get('zip_code'); $tracker->zip_code = data_get($data, 'zip_code');
$tracker->city = $data->get('city'); $tracker->city = data_get($data, 'city');
$tracker->region_name = $data->get('region_name'); $tracker->region_name = data_get($data, 'region_name');
$tracker->country_name = $data->get('country_name'); $tracker->country_name = data_get($data, 'country_name');
$tracker->latitude = $data->get('latitude'); $tracker->latitude = data_get($data, 'latitude');
$tracker->longitude = $data->get('longitude'); $tracker->longitude = data_get($data, 'longitude');
$tracker->screen_width = $data->get('screen_width'); $tracker->screen_width = data_get($data, 'screen_width');
$tracker->screen_height = $data->get('screen_height'); $tracker->screen_height = data_get($data, 'screen_height');
$tracker->save(); $tracker->save();
return $tracker; return $tracker;
......
...@@ -7,7 +7,8 @@ use Illuminate\Support\Str; ...@@ -7,7 +7,8 @@ use Illuminate\Support\Str;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
class UserRepository implements RepositoryInterface { class UserRepository implements RepositoryInterface
{
public function all($columns = array('*')) public function all($columns = array('*'))
{ {
...@@ -18,7 +19,7 @@ class UserRepository implements RepositoryInterface { ...@@ -18,7 +19,7 @@ class UserRepository implements RepositoryInterface {
{ {
if ($role_id) { if ($role_id) {
return User::whereHas('roles', function($query) use ($role_id) { return User::whereHas('roles', function ($query) use ($role_id) {
$query->where('role_id', $role_id); $query->where('role_id', $role_id);
})->search($search)->orderBy($filter, $sort)->paginate($per_page); })->search($search)->orderBy($filter, $sort)->paginate($per_page);
} }
...@@ -36,7 +37,7 @@ class UserRepository implements RepositoryInterface { ...@@ -36,7 +37,7 @@ class UserRepository implements RepositoryInterface {
return new User; return new User;
} }
public function store(Collection $data, $id) public function store(array $data, $id)
{ {
if (is_null($id)) { if (is_null($id)) {
$user = new User; $user = new User;
...@@ -44,33 +45,33 @@ class UserRepository implements RepositoryInterface { ...@@ -44,33 +45,33 @@ class UserRepository implements RepositoryInterface {
$user = User::findOrFail($id); $user = User::findOrFail($id);
} }
$user->api_token = Str::random(60); $user->api_token = Str::random(60);
$user->avatar = $data->get('avatar'); $user->avatar = data_get($data, 'avatar');
$user->lastname = $data->get('lastname'); $user->lastname = data_get($data, 'lastname');
$user->firstname = $data->get('firstname'); $user->firstname = data_get($data, 'firstname');
$user->email = $data->get('email'); $user->email = data_get($data, 'email');
$user->comment = $data->get('comment'); $user->comment = data_get($data, 'comment');
$user->company = $data->get('company'); $user->company = data_get($data, 'company');
$user->activity = $data->get('activity'); $user->activity = data_get($data, 'activity');
$user->telephone = $data->get('telephone'); $user->telephone = data_get($data, 'telephone');
$user->address = $data->get('address'); $user->address = data_get($data, 'address');
$user->zipcode = $data->get('zipcode'); $user->zipcode = data_get($data, 'zipcode');
$user->city = $data->get('city'); $user->city = data_get($data, 'city');
// Si le champs active est donné // Si le champs active est donné
if ($data->has('active')) { if (isset($data['active'])) {
$user->active = $data->get('active'); $user->active = data_get($data, 'active');
} }
// Si le mot de passe est changé // Si le mot de passe est changé
if (!is_null($data->get('password'))) { if (isset($data['password'])) {
$user->password = bcrypt($data->get('password')); $user->password = bcrypt(data_get($data, 'password'));
} }
$user->save(); $user->save();
// Changement du role de l'utilisateur // Changement du role de l'utilisateur
if ($data->has('role')) { if (isset($data['role'])) {
$user->syncRoles($data->get('role')); $user->syncRoles(data_get($data, 'role'));
} }
return $user; return $user;
...@@ -140,5 +141,4 @@ class UserRepository implements RepositoryInterface { ...@@ -140,5 +141,4 @@ class UserRepository implements RepositoryInterface {
{ {
return User::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 ...@@ -29,7 +29,7 @@ class RoleStoreRequest extends FormRequest
{ {
return [ return [
'name' => 'required|max:254|string|unique:roles,name,' . $this->route('id'), 'name' => 'required|max:254|string',
'display_name' => 'required|max:254|string', 'display_name' => 'required|max:254|string',
'description' => 'nullable|max:254|string', 'description' => 'nullable|max:254|string',
]; ];
......
...@@ -33,29 +33,35 @@ class PermissionService ...@@ -33,29 +33,35 @@ class PermissionService
// On vérifie que la permission n'existe pas déja // On vérifie que la permission n'existe pas déja
$perm = $this->perm_repo->findBy('name', $name . '-read'); $perm = $this->perm_repo->findBy('name', $name . '-read');
if($perm) { if ($perm) {
return false; return false;
} }
// On récupère le role admin pour associer les nouvelles permission // On récupère le role admin pour associer les nouvelles permission
$role = $this->role_repo->findOrFailBy('name', 'admin'); $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 // Pour chaque élements du groupe
foreach ($this->types as $type => $human_type) { foreach ($this->types as $type => $human_type) {
$data = collect([ $data = [
'name' => $name . '-' . $type, 'name' => $name . '-' . $type,
'guard_name' => 'web',
'display_name' => $display_name . ' ' . ucfirst($type), 'display_name' => $display_name . ' ' . ucfirst($type),
'description' => $human_type . ' ' . $display_name 'description' => $human_type . ' ' . $display_name
]); ];
// Création de la permission web
$perm_web = $this->perm_repo->store($data);
// Création de la permission // Création de la permission api
$perm = $this->perm_repo->store($data); $data['guard_name'] = 'api';
$perm_api = $this->perm_repo->store($data);
// Ajout de la permission au role admin // Ajout de la permission au role admin
if ($perm) { if ($perm_web && $perm_api) {
$role->givePermissionTo($perm); $role_web->givePermissionTo($perm_web);
$role_api->givePermissionTo($perm_api);
} }
} }
return true; return true;
...@@ -73,17 +79,18 @@ class PermissionService ...@@ -73,17 +79,18 @@ class PermissionService
// Construction du nom de la permission // Construction du nom de la permission
$name = Str::slug($display_name) . '-' . $type; $name = Str::slug($display_name) . '-' . $type;
// Récupération de la permission // Récupération de la permission
$perm = $this->perm_repo->findBy('name', $name); $perms = $this->perm_repo->findAllBy('name', $name);
// Si la permission est trouvée, alors on la supprime // Si des permissions sont trouvées, alors on les supprimes
if($perm) { if ($perms->isNotEmpty()) {
foreach($perms as $perm) {
$role_admin->revokePermissionTo($perm); $role_admin->revokePermissionTo($perm);
$perm->delete(); $perm->delete();
} }
}
} }
return true; return true;
} }
} }
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
namespace Goldenscarab\Modulus\App\Providers; namespace Goldenscarab\Modulus\App\Providers;
use Goldenscarab\Modulus\App\Console\Modulus\EmailTest;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
use Goldenscarab\Modulus\App\Console\Modulus\EmailTestCommand;
use Goldenscarab\Modulus\App\Console\Modulus\MakeResourceCommand;
class LoadServiceProvider extends ServiceProvider class LoadServiceProvider extends ServiceProvider
{ {
...@@ -18,12 +17,13 @@ class LoadServiceProvider extends ServiceProvider ...@@ -18,12 +17,13 @@ class LoadServiceProvider extends ServiceProvider
{ {
if ($this->app->runningInConsole()) { if ($this->app->runningInConsole()) {
$this->commands([ $this->commands([
EmailTest::class, EmailTestCommand::class,
MakeResourceCommand::class
]); ]);
} }
//$this->loadMigrationsFrom(__DIR__.'/../../database/migrations'); //$this->loadMigrationsFrom(__DIR__.'/../../database/migrations');
$this->loadTranslationsFrom(__DIR__.'/../../resources/lang', 'modulus'); $this->loadTranslationsFrom(__DIR__ . '/../../resources/lang', 'modulus');
$this->loadViewsFrom(__DIR__.'/../../resources/views', '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 ...@@ -25,7 +25,7 @@ class Telephone implements Rule
*/ */
public function passes($attribute, $value) 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,7 +63,72 @@ ...@@ -63,7 +63,72 @@
<i class="fa fa-check marfin-r-10" aria-hidden="true"></i> <i class="fa fa-check marfin-r-10" aria-hidden="true"></i>
Choisir les permissions associées au rôle Choisir les permissions associées au rôle
</div> </div>
<h4>Permissions Web</h4>
<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"> <table class="table table-sm table-hover table-striped table-sortable table-responsive-md">
<thead> <thead>
...@@ -78,43 +143,43 @@ ...@@ -78,43 +143,43 @@
</thead> </thead>
<tbody> <tbody>
@forelse ($permissions as $name => $perm) @forelse ($permissions['api'] as $name => $perm)
<tr> <tr>
<td> <td>
{{ $name }} {{ $name }}
</td> </td>
<td class="text-center"> <td class="text-center">
@php @php
$id_perm = collect($perm)->get('read'); $id_perm = data_get($perm, 'read');
@endphp @endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}" <input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') || {{ !empty(old('permissions_api.'.$id_perm)) ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}> $item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td> </td>
<td class="text-center"> <td class="text-center">
@php @php
$id_perm = collect($perm)->get('create'); $id_perm = data_get($perm, 'create');
@endphp @endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}" <input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') || {{ !empty(old('permissions_api.'.$id_perm)) ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}> $item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td> </td>
<td class="text-center"> <td class="text-center">
@php @php
$id_perm = collect($perm)->get('update'); $id_perm = data_get($perm, 'update');
@endphp @endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}" <input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') || {{ !empty(old('permissions_api.'.$id_perm)) ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}> $item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td> </td>
<td class="text-center"> <td class="text-center">
@php @php
$id_perm = collect($perm)->get('delete'); $id_perm = data_get($perm, 'delete');
@endphp @endphp
<input type="checkbox" name="permissions[{{ $id_perm }}]" value="{{ $id_perm }}" <input type="checkbox" name="permissions_api[{{ $id_perm }}]" value="{{ $id_perm }}"
{{ old('permissions.'.$id_perm) == collect($perm)->get('read') || {{ !empty(old('permissions_api.'.$id_perm)) ||
$item->permissions->contains($id_perm) ? 'checked' : '' }}> $item->perms->where('id', $id_perm)->isNotEmpty() ? 'checked' : '' }}>
</td> </td>
<td> <td>
...@@ -127,6 +192,7 @@ ...@@ -127,6 +192,7 @@
</tbody> </tbody>
</table> </table>
</div> </div>
</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