Commit 8e947ec6 authored by Goldenscarab's avatar Goldenscarab

Update global

parent 44a604c3
......@@ -38,7 +38,7 @@ Replace `require('./bootstrap')` in file resources/js/app.js by
require('./modulus.js')
```
Add in file resources/scss/app.js (create file if necessary)
Add in file resources/scss/app.scss (create file if necessary)
```css
@import "./modulus.scss"
......@@ -48,6 +48,10 @@ Update your `webpack.mix.js` with
```javascript
// Modulus
mix.alias({
'@modulus': 'vendor/goldenscarab/modulus'
});
mix.js('resources/js/app.js', 'public/js/app.js').vue()
.sass('resources/sass/app.scss', 'public/css/app.css');
......@@ -166,9 +170,9 @@ Ajouter au fichier `app/Http/Kernel.php`, dans la variable `$routeMiddleware`, l
```php
/* Middlewares ajoutés */
'auth.active' => \Goldenscarab\Modulus\App\Http\Middleware\RedirectIfNotActive::class,
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'auth.active' => \Goldenscarab\Modulus\App\Http\Middleware\RedirectIfNotActive::class,
'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
```
......@@ -201,6 +205,17 @@ Pour permettre l'auto-chargement des classes des modules, il est néccessaire le
}
```
Pour dupliquer le module exemple :
```sh
cd Modules/
bash duplicate.sh Small [ModuleName]
````
Vous pouvez ensuite ajouter des resources dans le module à l'aide de la commande :
`php artisan modulus:make-resource [MyResource] [ModuleName]`
## Security
If you discover any security related issues, please email contact@goldenscarab.fr instead of using the issue tracker.
......
......@@ -9,6 +9,7 @@ GIT_BASE_PATH=$(dirname $0)
# Dépendance Modulus
npm install
npm install --save axios@0.27.2
npm install --save ace-builds@1.4.12
npm install --save admin-lte@3.0.5
npm install --save air-datepicker@2.2.3
......
......@@ -7,6 +7,14 @@ return [
'menu' => [
'icon' => 'fa fa-magic',
'label' => 'Small',
'route' => 'module.small.index',
'route' => '#',
'childs' => [
[
'icon' => 'fa fa-handshake-o',
'label' => 'Item 1',
'route' => '#'
],
]
]
];
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateModuleSmallTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('module_smalls', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->unsignedInteger('user_id');
$table->timestamps();
// Contraintes
$table->foreign('user_id')->references('id')->on('users');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('module_smalls', function (Blueprint $table) {
$table->dropForeign(['user_id']);
});
Schema::dropIfExists('module_smalls');
}
}
......@@ -16,6 +16,5 @@ class SmallDatabaseSeeder extends Seeder
{
Model::unguard();
$this->call(ConfigTableSeeder::class);
$this->call(SmallsTableSeeder::class);
}
}
<?php
namespace Modules\Small\Database\Seeders;
use Illuminate\Support\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Model;
class SmallsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
DB::table('module_smalls')->insert([
[
'name' => 'Small 1',
'user_id' => 1,
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
],
[
'name' => 'Small 2',
'user_id' => 1,
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
],
[
'name' => 'Small 3',
'user_id' => 1,
'created_at' => Carbon::now(),
'updated_at' => Carbon::now(),
]
]);
}
}
<?php
namespace Modules\Small\Exports;
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\Small\Http\Repositories\SmallRepository;
class SmallExport 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 exemple du module Exemple";
$this->prop_title = "Liste des exemples";
$this->prop_author = "Sylvain";
$this->prop_subject = "Export";
$this->prop_company = "Goldenscarab";
$this->sheet_title = 'Smalls';
$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()
{
$small_repo = new SmallRepository;
return $small_repo->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 Modules\Small\Http\Controllers\Api;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Crypt;
use Modules\Small\Models\Small;
use Modules\Small\Http\Repositories\SmallRepository;
class SmallController extends Controller
{
private $repository;
public function __construct(SmallRepository $repository)
{
$this->repository = $repository;
}
/**
* Display a listing of the resource.
* @return Response
*/
public function index(Request $request)
{
$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');
$resources = $this->repository->list($sort, $direction, $perpage, $search, $filter);
// Ajout des relations
if (!empty($include)) {
$resources->load($include);
}
return response()->json($resources);
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
//
}
/**
* Show the specified resource.
* @param int $id
* @return Response
*/
public function show(Request $request, $public_id)
{
$resource = $this->repository->findOrfail($public_id);
// Retourne avec un cache en secondes
return response()->json($resource);
}
/**
* Update the specified resource in storage.
* @param Request $request
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Response
*/
public function destroy($id)
{
//
}
}
<?php
namespace Modules\Small\Http\Controllers\App;
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\Http\Requests\SmallStoreRequest;
use Modules\Small\Http\Repositories\SmallRepository;
class SmallController extends Controller
{
private $repository;
public function __construct(SmallRepository $small)
{
$this->repository = $small;
// Définition des permissions par méthode
$this->middleware('permission:module-small-read')->only(['index']);
$this->middleware('permission:module-small-create')->only(['create', 'duplicate']);
$this->middleware('permission:module-small-update')->only(['edit']);
$this->middleware('permission:module-small-delete')->only(['destroy']);
view()->share('route_prefix', "module.small");
}
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index()
{
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
'Exemples' => null
);
return view('small::small.index')->with([
'title' => '<i class="fa fa-magic mr-2" aria-hidden="true"></i>Exemples',
'breadcrumb' => $breadcrumb,
]);
}
/**
* Show the form for creating a new resource.
* @return Renderable
*/
public function create()
{
$small = $this->repository->new();
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
'Exemples' => route('module.small.index'),
'Ajouter' => null
);
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
]);
}
/**
* Show the form for editing the specified resource.
* @param int $id
* @return Renderable
*/
public function edit($id)
{
$small = $this->repository->findOrFail($id);
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
'Exemples' => route('module.small.index'),
'Modifier' => null
);
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
]);
}
/**
* Store a newly created resource in storage.
* @param SmallStoreRequest $request
* @return Renderable
*/
public function store(SmallStoreRequest $request, $id = null)
{
return $this->update($request, $id);
}
/**
* Show the specified resource.
* @param int $id
* @return Renderable
*/
public function show(Request $request, $id)
{
$small = $this->repository->findOrFail($id);
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
'Exemples' => route('module.small.index'),
'Voir' => null
);
return view('small::small.show')->with([
'title' => '<i class="fa fa-magic mr-2"></i>Exemples',
'subtitle' => $small->name,
'breadcrumb' => $breadcrumb,
'item' => $small
]);
}
/**
* Update the specified resource in storage.
* @param SmallStoreRequest $request
* @param int $id
* @return Redirect
*/
public function update(SmallStoreRequest $request, $id)
{
$small_data = collect($request->except(['_token']));
$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->repository->duplicate($id);
Session::flash('success', "Exemple dupliqué avec succès");
return Redirect::route('module.small.index');
}
/**
* Remove the specified resource from storage.
* @param int $id
* @return Redirect
*/
public function destroy($id)
{
$this->checkPermissionAccess($id);
$this->repository->destroy($id);
Session::flash('success', 'Exemple supprimé avec succès');
return Redirect::route('module.small.index');
}
/**
* Exporte les données de la exemple
*
* @param int $id
* @return Response
*/
public function export()
{
return Excel::download(new SmallExport, date('Ymd_His_') . 'export-module-small.xlsx');
}
}
<?php
namespace Modules\Small\Http\Repositories;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
use Modules\Small\Models\Small;
use Goldenscarab\Modulus\App\Http\Repositories\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 = "", $filter = null)
{
return Small::search($search)->filter($filter)->sortBy($sorting, $direction)->paginate($perpage);
}
public function published($columns = array('*'))
{
return Small::select($columns)->active()->orderBy('title', 'asc')->get();
}
public function new()
{
return new Small;
}
public function store(Collection $data, $id = null)
{
if (is_null($id)) {
$resource = new Small;
} else {
$resource = Small::findOrFail($id);
}
$resource->name = $data->get('name');
$resource->user_id = $data->get('user_id');
$resource->save();
return $resource;
}
public function find($id, $columns = array('*'))
{
return Small::select($columns)->find($id);
}
public function findOrFail($id, $columns = array('*'))
{
return Small::select($columns)->findOrFail($id);
}
public function findBy($field, $value, $columns = array('*'))
{
return Small::select($columns)->where($field, '=', $value)->first();
}
public function findOrFailBy($field, $value, $columns = array('*'))
{
return Small::select($columns)->where($field, '=', $value)->firstOrFail();
}
public function findAllBy($field, $value, $columns = array('*'))
{
return Small::select($columns)->where($field, '=', $value)->get();
}
public function findWhere($where, $columns = array('*'))
{
return Small::select($columns)->whereRaw($where)->get();
}
public function search($search)
{
return Small::search($search)->get();
}
public function destroy($id)
{
$item = Small::findOrFail($id);
return $item->delete();
}
public function first()
{
return Small::first();
}
public function lasts($limit)
{
return Small::latest()->limit($limit)->get();
}
public function duplicate($id)
{
$resource = Small::findOrFail($id);
$clone = $resource->replicate();
$availables = ['title', 'name', 'label', 'slug'];
foreach ($availables as $available) {
if (isset($clone->{$available})) {
$clone->{$available} = $clone->{$available} . ' (copie)';
}
}
$clone->start_at = null;
$clone->end_at = null;
$clone->save();
return $clone;
}
public function truncate()
{
return Small::truncate();
}
private function calcNextPosition()
{
$resource = Small::orderBy('position', 'desc')->first();
if (is_null($resource)) {
return 1;
}
return $resource->position + 1;
}
}
<?php
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 = [];
protected $dates = [];
protected $searchable = ['name'];
protected $casts = [];
protected $appends = [];
/* Relations */
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
/* Attributs */
protected function getNameUpperAttribute()
{
return strtoupper($this->attributes['name']);
}
/* Scopes */
public function scopeSearch(Builder $request, $search)
{
if (is_null($search)) return $request;
// Pour rechercher tous les mots d'une phrase dans le champs
$search = str_replace(' ', '%', $search);
foreach ($this->searchable as $key => $column) {
if ($key == 0) {
$request->where($column, 'LIKE', '%' . $search . '%');
} else {
$request->orWhere($column, 'LIKE', '%' . $search . '%');
}
}
return $request;
}
public function scopeUser(Builder $query, $user_id)
{
if (is_null($user_id)) return $query;
return $query->where('user_id', $user_id);
}
/* Spécifique méthodes */
public function smallMethod()
{
return 'Small';
}
}
// Pour la compatibilité avec Vue 2, exécuter la commande suivante
// npm i -D @vue/composition-api
Vue.component('loader', require('./components/Loader').default);
Vue.component('collector', require('./components/Collector').default);
@extends('modulus::layouts.app.form')
@section('fields')
<div class="card">
<div class="card-header">
@isset ($action)
<h3 class="card-title">{!! $action !!}</h3>
@endisset
</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() {
});
</script>
@endpush
@extends('modulus::layouts.app.adminlte')
@php
$can_prefix = 'module-small';
$url_prefix = route('module.small.index');
$am = new \Goldenscarab\Modulus\Helpers\ActionMenu($can_prefix, $url_prefix);
$params_actions = [
[
'button' => $am->make('[CREATE]', ['attributes.class' => 'btn-sm btn-success']),
]
];
if (auth()->user()->hasRole('admin'))
$params_filter = [
[
'name' => 'user',
'prefix' => 'Filtre utilisateur',
'size' => 'sm',
'options' => [
'source' => [
'url' => route('api.users.index', ['perpage' => 999]),
'method' => 'GET',
'target' => 'data'
],
'placeholder' => ['value' => '', 'label' => '-- Tous les utilisateurs --'],
'value' => ':id',
'label' => ':name'
]
]
];
else {
$params_filter = [];
}
$params_header = [
'actions' => $params_actions,
'filters' => $params_filter,
'search' => true
];
$params_list = [
'source' => route('api.module.small.index', ['include' => ['user']),
'menu' => [
'button' => $am->make('[READ]', ['attributes' => ['class' => 'btn-sm btn-success']]),
'dropdown' => [
'size' => 'sm',
'attributes' => ['class' => 'dropdown-menu-right'],
'items' => [
$am->make('[UPDATE]'),
$am->make('[DUPLICATE]'),
$am->make('[SEPARATOR]'),
$am->make('[DESTROY]')
]
]
],
'row' => [],
'columns' => array(
[
'label' => '#',
'value' => ':id',
'sortable' => 'id'
], [
'label' => 'Nom',
'value' => ':name',
'sortable' => 'name'
], [
'label' => 'Utilisateur',
'value' => ':user.name',
'sortable' => 'users.lastname',
'render' => 'badge(badge-success)',
], [
'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">
<div class="card-body">
{{ $item->name }}
</div>
</div>
<div class="form-action">
<a href="{{ route('module.small.index') }}" class="btn btn-warning">
<i class="fa fa-reply" aria-hidden="true"></i>
</a>
</div>
@endsection
......@@ -18,8 +18,8 @@ use Illuminate\Support\Facades\Route;
Route::group([
'middleware' => ['auth:api', 'auth.active', 'role:admin|client|visitor'],
'namespace' => 'Api',
'prefix' => 'backend/module/',
'as' => 'api.module.'
'prefix' => 'backend/module/small/',
'as' => 'api.module.small.'
], function() {
Route::resource('small', SmallController::class);
// TODO
});
......@@ -17,27 +17,15 @@ use Illuminate\Support\Facades\Route;
Route::group([
'middleware' => ['auth', 'auth.active', 'role:admin'],
'namespace' => 'App',
'prefix' => config('modulus.url_prefix') . 'module/',
'as' => 'module.'
'prefix' => config('modulus.url_prefix') . 'module/small/',
'as' => 'module.small.'
], function() {
/* Configuration */
Route::group(['prefix' => 'small/config', 'as' => 'small.config.'], function() {
// Configuration
Route::group(['prefix' => 'config', 'as' => 'config.'], function() {
Route::get('/', 'ConfigController@index')->name('form');
Route::post('/', 'ConfigController@store')->name('post');
});
// Small
Route::group(['prefix' => 'small', 'as' => 'small.'], function() {
Route::get('/', 'SmallController@index')->name('index');
Route::get('create', 'SmallController@create')->name('create');
Route::get('read/{id}', 'SmallController@show')->name('show');
Route::get('edit/{id}', 'SmallController@edit')->name('edit');
Route::get('export/{id}', 'SmallController@export')->name('export');
Route::post('store/{id?}', 'SmallController@store')->name('store');
Route::get('destroy/{id}', 'SmallController@destroy')->name('destroy');
Route::get('duplicate/{id}', 'SmallController@duplicate')->name('duplicate');
});
});
......@@ -53,6 +53,9 @@ class MakeResourceCommand extends Command
if ($this->confirm('Voulez-vous continuer ?')) {
$this->info("Vérifications : ");
$this->checkModulePaths();
$this->info("Création des fichiers : ");
$this->putMigrationFile();
......@@ -80,6 +83,30 @@ class MakeResourceCommand extends Command
}
}
private function checkModulePaths()
{
$paths = [
module_path($this->getModuleName()) . $this->createMigrationPathName(),
module_path($this->getModuleName()) . $this->createFactoryPathName(),
module_path($this->getModuleName()) . $this->createSeederPathName(),
module_path($this->getModuleName()) . $this->createModelPathName(),
module_path($this->getModuleName()) . $this->createRepositoryPathName(),
module_path($this->getModuleName()) . $this->createExportPathName(),
module_path($this->getModuleName()) . $this->createAppControllerPathName(),
module_path($this->getModuleName()) . $this->createApiControllerPathName(),
module_path($this->getModuleName()) . $this->createTestPathName(),
module_path($this->getModuleName()) . $this->createViewFolderPath(),
];
foreach($paths as $path) {
$dir = Str::of($path)->dirname();
if (!File::isWritable($dir)) {
$this->error("Abandon : Impossible d'écrire dans le dossier : " . $dir);
exit;
}
}
}
private function createUrlPath()
{
return vsprintf('%s/%s', [
......@@ -149,14 +176,14 @@ class MakeResourceCommand extends Command
private function createFactoryPathName()
{
return vsprintf('/Database/factories/%s.php', [
return vsprintf('/Database/Factories/%s.php', [
$this->createFactoryClassName()
]);
}
private function createSeederClassName()
{
$class = sprintf('%sSeeder', $this->createModelClassName());
$class = sprintf('%sTableSeeder', $this->createModelClassName());
return $class;
}
......@@ -526,7 +553,7 @@ class MakeResourceCommand extends Command
$type = 'store';
$pathname = module_path($this->getModuleName()) . $this->createRequestWebPathName($type);
$content = (new Stub('requests/' . $type . '.stub', [
$content = (new Stub('requests/web.stub', [
'NAMESPACE' => $this->createNamespaceFromPath($this->createRequestWebPathName($type)),
'CLASS' => $this->createRequestWebClassName($type),
'GUARD' => "",
......@@ -614,6 +641,7 @@ class MakeResourceCommand extends Command
'MODEL' => $this->createModelClassName(),
'FACTORY' => $this->createFactoryClassName(),
'ROUTE_PREFIX' => $this->createRoutePrefix(),
'TABLE' => $this->createTableName(),
]))->render();
File::put($pathname, $content);
......
......@@ -24,6 +24,7 @@ class $CLASS$ extends Controller
/**
* Display a listing of the resources.
* @param $REQUEST_INDEX$ $request
* @return Response
*/
public function index($REQUEST_INDEX$ $request)
......@@ -32,34 +33,37 @@ class $CLASS$ extends Controller
$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);
$filters = $request->get('filters');
$includes = $request->get('includes');
$appends = $request->get('appends');
// Ajout des relations
if (!empty($include)) {
$resources->load($include);
}
$resources = $this->repository->list($sort, $direction, $perpage, $search, $filters, $includes, $appends);
return response()->json($resources);
}
/**
* Show the specified resource.
* @param $REQUEST_SHOW$ $request
* @param int $id
* @return Response
*/
public function show($REQUEST_SHOW$ $request, $id)
{
$resources = $this->repository->findOrfail($id);
$include = $request->get('include');
return response()->json($resources);
$resource = $this->repository->findOrfail($id);
if (!empty($include)) {
$resource->load($include);
}
return response()->json($resource);
}
/**
* Store a newly created resource in storage.
* @param Request $request
* @param $REQUEST_STORE$ $request
* @return Response
*/
public function store($REQUEST_STORE$ $request)
......@@ -73,7 +77,7 @@ class $CLASS$ extends Controller
/**
* Update the specified resource in storage.
* @param Request $request
* @param $REQUEST_UPDATE$ $request
* @param int $id
* @return Response
*/
......@@ -88,6 +92,7 @@ class $CLASS$ extends Controller
/**
* Remove the specified resource from storage.
* @param $REQUEST_DESTROY$ $request
* @param int $id
* @return Response
*/
......
......@@ -40,6 +40,7 @@ class $CLASS$ extends Controller
{
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODULE$') => null,
__('$MODEL$') => null
);
......@@ -60,6 +61,7 @@ class $CLASS$ extends Controller
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODULE$') => null,
__('$MODEL$') => route('$ROUTE_PREFIX$.index'),
__('Ajouter') => null
);
......@@ -83,6 +85,7 @@ class $CLASS$ extends Controller
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODULE$') => null,
__('$MODEL$') => route('$ROUTE_PREFIX$.index'),
__('Consulter') => null
);
......@@ -106,6 +109,7 @@ class $CLASS$ extends Controller
$breadcrumb = array(
__('Accueil') => route('modulus.dashboard'),
__('$MODULE$') => null,
__('$MODEL$') => route('$ROUTE_PREFIX$.index'),
__('Modifier') => null
);
......
......@@ -2,7 +2,7 @@
namespace $NAMESPACE$;
use Modules\Belet\Models\$MODEL$;
use Modules\$MODULE$\Models\$MODEL$;
use Illuminate\Database\Eloquent\Factories\Factory;
class $CLASS$ extends Factory
......@@ -33,11 +33,11 @@ class $CLASS$ extends Factory
*
* @return \Illuminate\Database\Eloquent\Factories\Factory
*/
// public function status($status)
// public function status($value)
// {
// return $this->state(function (array $attributes) use ($status) {
// return $this->state(function (array $attributes) use ($value) {
// return [
// 'status' => $status,
// 'status' => $value,
// ];
// });
// }
......
......@@ -31,7 +31,7 @@ class $CLASS$ extends Migration
*/
public function down()
{
// Schema::table('module_belet_customers', function (Blueprint $table) {
// Schema::table('$TABLE$', function (Blueprint $table) {
// $table->dropForeign(['example_id']);
// });
Schema::dropIfExists('$TABLE$');
......
......@@ -14,12 +14,24 @@ class $CLASS$ implements RepositoryInterface
return $MODEL$::select($columns)->orderBy('id', 'asc')->get();
}
public function list($sorting, $direction = 'asc', $perpage = null, $search = "", $filter = null)
public function list($sorting, $direction = 'asc', $perpage = null, $search = "", $filters = null, array $includes = null, array $appends = null)
{
$query = $MODEL$::search($search)->filter($filter)->sortBy($sorting, $direction);
$query = $MODEL$::search($search)->filter($filters)->sortBy($sorting, $direction);
$resources = is_null($perpage) ? $query->get() : $query->paginate($perpage);
// Ajout des relations
if (!empty($includes)) {
$resources->load($includes);
}
// Ajout de nouveaux attributs
if (!empty($appends)) {
foreach ($appends as $append) {
$resources->append($append);
}
}
return $resources;
}
......
......@@ -2,6 +2,7 @@
namespace $NAMESPACE$;
use Goldenscarab\Modulus\App\Rules\Filter;
use Illuminate\Foundation\Http\FormRequest;
class $CLASS$ extends FormRequest
......@@ -13,7 +14,8 @@ class $CLASS$ extends FormRequest
*/
public function authorize()
{
return auth($GUARD$)->check() && auth($GUARD$)->user()->can('$PERMISSION_PREFIX$-read');
return auth($GUARD$)->check() && auth($GUARD$)->user()->can('$PERMISSION_PREFIX$-read') ||
auth()->check() && auth()->user()->can('$PERMISSION_PREFIX$-read');
}
/**
......@@ -25,10 +27,10 @@ class $CLASS$ extends FormRequest
{
return [
'sort' => 'nullable|string',
'direction' => 'required_with:sort|string',
'perpage' => 'nullable|in:10,50,100,250,500',
'direction' => 'nullable|in:asc,desc',
'perpage' => 'nullable|integer',
'search' => 'nullable|string',
'filter' => 'nullable|string|regex:/^.*:.*$/',
'filter' => ['nullable', new Filter],
'include' => 'nullable|array'
];
}
......
......@@ -25,6 +25,7 @@ class $CLASS$ extends FormRequest
{
return [
// TODO
// 'name' => 'required|max:191',
];
}
......@@ -37,6 +38,7 @@ class $CLASS$ extends FormRequest
{
return [
// TODO
// 'name' => __('Nom'),
];
}
}
<?php
namespace Modules\Small\Http\Requests;
namespace $NAMESPACE$;
use Illuminate\Foundation\Http\FormRequest;
class SmallStoreRequest extends FormRequest
class $CLASS$ extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
......@@ -13,13 +13,10 @@ class SmallStoreRequest extends FormRequest
*/
public function authorize()
{
if (empty($this->route('id'))) {
return auth()->user()->can('module-small-create');
if (empty($this->id)) {
return auth()->check() && auth()->user()->can('$PERMISSION_PREFIX$-create');
} else {
return auth()->user()->can('module-small-update');
return auth()->check() && auth()->user()->can('$PERMISSION_PREFIX$-update');
}
}
......@@ -31,8 +28,8 @@ class SmallStoreRequest extends FormRequest
public function rules()
{
return [
'name' => 'required|max:255',
'user_id' => 'required|exists:users,id'
// TODO
// 'name' => 'required|max:191',
];
}
......@@ -44,8 +41,8 @@ class SmallStoreRequest extends FormRequest
public function attributes()
{
return [
'name' => 'Nom',
'user_id' => 'Utilisateur',
// TODO
// 'name' => __('Nom'),
];
}
}
......@@ -6,7 +6,7 @@ use Carbon\Carbon;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Model;
use Modules\$MODULE$\Database\factories\$FACTORY$;
use Modules\$MODULE$\Database\Factories\$FACTORY$;
class $CLASS$ extends Seeder
{
......
This diff is collapsed.
......@@ -6,15 +6,15 @@
$am = new \Goldenscarab\Modulus\Helpers\ActionMenu($can_prefix, $url_prefix);
$params_actions = [
$param_actions = [
[
'button' => $am->make('[CREATE]', ['attributes.class' => 'btn-sm btn-success']),
]
];
$params_filter = [
$param_filters = [
// [
// 'name' => 'filter',
// 'name' => 'filters[]',
// 'prefix' => 'Filtre catégorie',
// 'size' => 'sm',
// 'options' => [
......@@ -25,7 +25,7 @@
// ],
// 'placeholder' => ['value' => '', 'label' => '-- Toutes --'],
// 'value' => ['template' => [
// 'format' => '%s:%s',
// 'format' => '%s|=|%s',
// 'args' => ['category_id', ':id']
// ]],
// 'label' => ':name'
......@@ -34,15 +34,15 @@
];
$params_header = [
'actions' => $params_actions,
'filters' => $params_filter,
'actions' => $param_actions,
'filters' => $param_filters,
'search' => true
];
$params_list = [
'source' => route('api.$ROUTE_PREFIX$.index'),
'source' => route('api.$ROUTE_PREFIX$.index', ['includes' => [], 'appends' => []]),
'menu' => [
'button' => $am->make('[READ]', ['attributes' => ['class' => 'btn-sm btn-success']]),
'button' => $am->make('[READ]', ['attributes.class' => 'btn-sm btn-success']),
'dropdown' => [
'size' => 'sm',
'attributes' => ['class' => 'dropdown-menu-right'],
......@@ -79,7 +79,7 @@
// 'value' => ':status',
// 'sortable' => 'status',
// 'render' => 'boolean_html'
/ ],
// ],
[
'label' => ['value' => 'Date', 'attributes' => ['class' => 'text-center']],
'value' => ':updated_at',
......
......@@ -29,7 +29,7 @@
</div>
</div>
<div class="form-action">
<a href="{{ route('$ROUTE_PREFIX$.index') }}" class="btn btn-warning">
<a href="{{ route('$ROUTE_PREFIX$.index', $route_param ?? null) }}" class="btn btn-warning">
<i class="fa fa-reply" aria-hidden="true"></i>
</a>
</div>
......
......@@ -2,16 +2,12 @@
namespace Goldenscarab\Modulus\App\Http\Controllers\App;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Nwidart\Modules\Facades\Module;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Response;
use Goldenscarab\Modulus\App\Http\Repositories\ModuleRepository;
use Goldenscarab\Modulus\App\Http\Services\Permission\Facade\PermissionService;
......@@ -60,8 +56,9 @@ class ModuleController extends Controller
// Désactiver les modules non installé
$modules->each(function (&$m, $key) {
// Recherche de la config du module dans modulus
$module = $this->module_repo->findBy('slug', $m->getAlias());
$module = $this->module_repo->findBy('slug', $m->getSnakeName());
if (is_null($module)) {
$m->disable();
......@@ -88,15 +85,14 @@ class ModuleController extends Controller
}
public function install($alias)
public function install($name)
{
$module = Module::findOrFail($alias);
$module = Module::findOrFail($name);
// Le module n'est pas activé on recharge pour prendre en compte la config du module
if ($module->isStatus(0)) {
$module->enable();
return Redirect::route('modulus.module.install', $alias);
return Redirect::route('modulus.module.install', $name);
}
// On recherche les autoloads
......@@ -110,33 +106,34 @@ class ModuleController extends Controller
// Configuration dans Modulus
$module_config = array(
'name' => $module->getName(),
'slug' => $module->getAlias(),
'menu' => config($module->getAlias() . '.menu'),
'slug' => $module->getSnakeName(),
'menu' => config($module->getSnakeName() . '.menu'),
'priority' => $module->get('priority')
);
$this->module_repo->store($module_config);
// Ajout des permissions d'accès au module
PermissionService::addPermissionsGroup('Module ' . $module->getName());
PermissionService::addPermissionsGroup('Module ' . $module->getSnakeName());
Session::flash('success', "Module installé avec succès");
return Redirect::route('modulus.module.index');
}
public function uninstall($alias)
public function uninstall($name)
{
// Récupération du module
$module = Module::findOrFail($alias);
$module = Module::findOrFail($name);
// Suppression des migrations des tables du module
Artisan::call('module:migrate-rollback', ['module' => $module->getName()]);
// Suppression de la configuration back office
$this->module_repo->destroy($module->getAlias());
$this->module_repo->destroy($module->getSnakeName());
// Suppression des permissions d'accès au module
PermissionService::deletePermissionsGroup('Module ' . $module->getName());
PermissionService::deletePermissionsGroup('Module ' . $module->getSnakeName());
// On désactive le module
$module->disable();
......@@ -148,20 +145,20 @@ class ModuleController extends Controller
return Redirect::route('modulus.module.index');
}
public function refresh($alias)
public function refresh($name)
{
$module = Module::findOrFail($alias);
$module = Module::findOrFail($name);
//system('composer dump-autoload -d ' . base_path());
Artisan::call('config:clear');
// Suppression de la configuration back office
$this->module_repo->destroy($module->getAlias());
$this->module_repo->destroy($module->getSnakeName());
$module_config = array(
'name' => $module->getName(),
'slug' => $module->getAlias(),
'menu' => config($module->getAlias() . '.menu'),
'slug' => $module->getSnakeName(),
'menu' => config($module->getSnakeName() . '.menu'),
'priority' => $module->get('priority')
);
......
......@@ -70,7 +70,7 @@ class UserController extends Controller
{
$user = $this->user_repo->new();
$avatars = $this->user_repo->getAvatars();
$roles = $this->role_repo->all();
$roles = $this->role_repo->all()->unique('name');
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
......@@ -92,7 +92,7 @@ class UserController extends Controller
{
$user = $this->user_repo->findOrfail($id);
$avatars = $this->user_repo->getAvatars();
$roles = $this->role_repo->all();
$roles = $this->role_repo->all()->unique('name');
$breadcrumb = array(
'Accueil' => route('modulus.dashboard'),
......@@ -113,10 +113,10 @@ class UserController extends Controller
public function store(UserStoreRequest $request, $id = null)
{
// On récupère les données utilisateur
$user_data = $request->except(['_token']);
$data = $request->except(['_token']);
// On sauvegarde les données utilisateur
$user = $this->user_repo->store($user_data, $id);
$user = $this->user_repo->store($data, $id);
// Cas d'une création
if (is_null($id)) {
......
......@@ -2,9 +2,10 @@
namespace Goldenscarab\Modulus\App\Http\Repositories;
use Goldenscarab\Modulus\App\Models\User;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
use Spatie\Permission\Models\Role;
use Goldenscarab\Modulus\App\Models\User;
class UserRepository implements RepositoryInterface
......@@ -71,7 +72,10 @@ class UserRepository implements RepositoryInterface
// Changement du role de l'utilisateur
if (isset($data['role'])) {
$user->syncRoles(data_get($data, 'role'));
$roles = Role::whereIn('name', data_get($data, 'role'))->get();
$user->syncRoles($roles);
}
return $user;
......
......@@ -27,7 +27,7 @@ class ApiIndexRequest extends FormRequest
return [
'sort' => 'nullable|string',
'direction' => 'required_with:sort|string',
'perpage' => 'nullable|in:10,50,100,250,500',
'perpage' => 'nullable|integer',
'search' => 'nullable|string',
'filter' => 'nullable|string|regex:/^.*:.*$/',
'include' => 'nullable|array'
......
......@@ -64,7 +64,7 @@ class User extends Authenticatable
protected function getRoleHtmlAttribute()
{
$roles = $this->getRoleNames();
$roles = $this->getRoleNames()->unique();
$html = '';
......@@ -77,7 +77,7 @@ class User extends Authenticatable
$html .= '<span class="badge badge-warning mr-1">Editeur</span>' ;
break;
default:
$html .= '<span class="badge badge-secondary mr-1">' . ucfirst($role) . '</span>' ;
$html .= '<span class="badge badge-secondary mr-1">' . ucfirst((string) $role) . '</span>' ;
break;
}
}
......
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class ColorHex 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-9abcdef]{6,8}$/', $value);
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return __('La valeur du champs :attribute ne contient pas une couleur au format hexadecimal');
}
}
<?php
namespace Goldenscarab\Modulus\App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Filter 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)
{
if (is_iterable($value)) {
$is_valid = true;
foreach ($value as $filter) {
if (!preg_match('/^.*\|(=|>=|<=|<|>|!=)\|.*$/', $filter)) {
$is_valid = false;
}
}
return $is_valid;
} else {
return preg_match('/^.*\|(=|>=|<=|<|>|!=)\|.*$/', $value);
}
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return __('La valeur du champs :attribute ne contient pas un format de filtre conforme. Ex : field|=|value');
}
}
......@@ -25,7 +25,7 @@ class GPSCoordinate implements Rule
*/
public function passes($attribute, $value)
{
return preg_match('#^(-?\d{1,3}\.\d{6,7})$#', $value) === 1;
return preg_match('#^(-?\d{1,3}\.\d{5,7})$#', $value) === 1;
}
/**
......
......@@ -12,37 +12,50 @@ trait ModelFilterable
* Filtre depuis une colonne
* TODO - Ajout de sécurité (paramètre $filterable, dans le modèle)
*
* Syntax : [relation].[colonne]|[operator]|[value]
* Syntax : [relation].[colonne]|[operator (=, <=, >=, <, >, !=)]|[value]
*
* Exemples :
* - $query->filter('colonne|=|value')->get();
* - $query->filter('relation.colonne|!=|value')->get();
* - $query->filter('relation1.relation2.colonne|>|value')->get();
*
* Avec plusieurs filtres :
* - $query->filter(['relation1.relation2.colonne|=|value', 'relation3.relation4.colonne|>=|value'])->get();
*
* @param Builder $query
* @param string $filter
* @return Builder
*/
public function scopeFilter(Builder $query, $filter = null)
public function scopeFilter(Builder $query, $value = null)
{
if (is_null($filter) || !Str::contains($filter, '|')) {
return $query;
if (is_array($value)) {
$filters = $value;
} else {
$filters = [$value];
}
$splited = explode('|', $filter);
$column = $splited[0];
$operator = $splited[1];
$value = $splited[2];
foreach($filters as $filter) {
if (Str::contains($column, '.')) {
$this->relationFilter($query, $column, $operator, $value);
} else {
return $query->where($column, $operator, $value);
if (is_null($filter) || !Str::contains($filter, '|')) {
continue;
}
$splited = explode('|', $filter);
$column = $splited[0];
$operator = $splited[1];
$value = $splited[2];
if (Str::contains($column, '.')) {
$this->relationFilter($query, $column, $operator, $value);
} else {
$query->where($column, $operator, $value);
}
}
return $query;
}
private function relationFilter(Builder $query, $column, $operator, $value)
private function relationFilter(Builder &$query, $column, $operator, $value)
{
preg_match('/([^.]*)\.(.*)/', $column, $match);
......
......@@ -43,55 +43,78 @@ class PermissionsTablesSeeder extends Seeder
);
// Création des permissions
$guards = ['web', 'api'];
$names = [
'read' => 'Voir',
'create' => 'Créer',
'update' => 'Modifier',
'delete' => 'Supprimer'
];
foreach ($permissions as $permission) {
$perm = new Permission;
$perm->name = $permission . '-read';
$perm->display_name = ucfirst($permission) . ' Read';
$perm->description = 'Voir';
$perm->save();
$perm = new Permission;
$perm->name = $permission . '-create';
$perm->display_name = ucfirst($permission) . ' Create';
$perm->description = 'Créer';
$perm->save();
$perm = new Permission;
$perm->name = $permission . '-update';
$perm->display_name = ucfirst($permission) . ' update';
$perm->description = 'Modifier';
$perm->save();
$perm = new Permission;
$perm->name = $permission . '-delete';
$perm->display_name = ucfirst($permission) . ' Delete';
$perm->description = 'Supprimer';
$perm->save();
foreach ($names as $name => $description) {
foreach ($guards as $guard) {
$perm = new Permission;
$perm->name = $permission . '-' . $name;
$perm->guard_name = $guard;
$perm->display_name = ucfirst($permission) . ' ' . ucfirst($name);
$perm->description = $description;
$perm->save();
}
}
}
// Création des rôles et association des permissions
$role = new Role;
$role->name = 'admin';
$role->display_name = 'Admin';
$role->description = 'Super utilisateur';
$role->save();
$role->givePermissionTo(Permission::all());
$role = new Role;
$role->name = 'client';
$role->display_name = 'Client';
$role->description = 'Utilisateur classique';
$role->save();
$role->givePermissionTo([]);
$role = new Role;
$role->name = 'visitor';
$role->display_name = 'Visiteur';
$role->description = 'Utilisateur visiteur';
$role->save();
$role->givePermissionTo([]);
$role_admin_web = new Role;
$role_admin_web->name = 'admin';
$role_admin_web->guard_name = 'web';
$role_admin_web->display_name = 'Admin';
$role_admin_web->description = 'Super utilisateur';
$role_admin_web->save();
$role_admin_web->givePermissionTo(Permission::where('guard_name', 'web')->get());
$role_admin_api = new Role;
$role_admin_api->name = 'admin';
$role_admin_api->guard_name = 'api';
$role_admin_api->display_name = 'Admin';
$role_admin_api->description = 'Super utilisateur';
$role_admin_api->save();
$role_admin_api->givePermissionTo(Permission::where('guard_name', 'api')->get());
$role_utilisateur_web = new Role;
$role_utilisateur_web->name = 'utilisateur';
$role_utilisateur_web->guard_name = 'web';
$role_utilisateur_web->display_name = 'Utilisateur';
$role_utilisateur_web->description = 'Utilisateur classique';
$role_utilisateur_web->save();
$role_utilisateur_web->givePermissionTo([]);
$role_utilisateur_api = new Role;
$role_utilisateur_api->name = 'utilisateur';
$role_utilisateur_api->guard_name = 'api';
$role_utilisateur_api->display_name = 'Utilisateur';
$role_utilisateur_api->description = 'Utilisateur classique';
$role_utilisateur_api->save();
$role_utilisateur_api->givePermissionTo([]);
$role_visiteur_web = new Role;
$role_visiteur_web->name = 'visitor';
$role_visiteur_web->guard_name = 'web';
$role_visiteur_web->display_name = 'Visiteur';
$role_visiteur_web->description = 'Utilisateur visiteur';
$role_visiteur_web->save();
$role_visiteur_web->givePermissionTo([]);
$role_visiteur_api = new Role;
$role_visiteur_api->name = 'visitor';
$role_visiteur_api->guard_name = 'api';
$role_visiteur_api->display_name = 'Visiteur';
$role_visiteur_api->description = 'Utilisateur visiteur';
$role_visiteur_api->save();
$role_visiteur_api->givePermissionTo([]);
$user = User::findOrfail(1);
$user->assignRole(['admin']);
$user->assignRole([$role_admin_web, $role_admin_api]);
}
}
......@@ -10,7 +10,7 @@ require('./simply-beautiful.js');
* @type {Any}
*/
var attr = $.extend({
}, opts);
/**
......@@ -21,7 +21,7 @@ require('./simply-beautiful.js');
Self.init = function(el) {
Self.setAceJs(el, attr);
};
Self.setAceJs = function(el, attr) {
......@@ -68,7 +68,7 @@ require('./simply-beautiful.js');
if (language == 'html') {
var $html = $($(env.renderer.container.dataset.target).val());
// Parcours des images dans le html
$html.find('img').each(function (i, img) {
......@@ -100,6 +100,7 @@ require('./simply-beautiful.js');
editor.getSession().on('change', function(e) {
$($(el).attr('data-target')).val(editor.getValue());
document.querySelector($(el).attr('data-target')).dispatchEvent(new Event('input'));
});
}
......
......@@ -23,6 +23,12 @@ var Modulus = {
theme: "bootstrap4",
});
$('.select2').on('select2:select', function(e) {
console.log($(this).val());
$(this).trigger('input');
});
// Selecteur de date
// $('.datepicker').datepicker({
// language: 'fr',
......
// Vue JS
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
window.axios.defaults.headers.common["X-CSRF-TOKEN"] = window.Laravel.csrfToken;
window.axios.defaults.headers.common["Authorization"] = 'Bearer ' + window.Laravel.api_token;
require('./Helpers/helpers');
window.Vue = require('vue').default;
......@@ -9,6 +13,8 @@ Vue.component('glist', require('./components/glist/Glist').default);
Vue.component('bt4-button', require('./components/bootstrap-4/Button').default);
Vue.component('bt4-input', require('./components/bootstrap-4/Input').default);
Vue.component('loader', require('./components/divers/Loader').default);
// Lancement de Vue.js
if (document.getElementById('app')) {
......
......@@ -468,3 +468,14 @@ div.form-action {
font-weight: 400 !important;
}
}
.opaver {
opacity: 0.3;
color: #2F2F2F;
}
.opaver:hover {
opacity: 0.7;
text-decoration: none;
}
......@@ -44,7 +44,7 @@
'value' => ':isStatus(0)',
'true' => ['url' => [
'route' => $route_prefix . '.install',
'args' => [':getAlias()']
'args' => [':getSnakeName()']
]],
'false' => ['condition' => [
'value' => ':get("config")',
......@@ -52,7 +52,7 @@
'true' => ['url' => [
'route' => ['template' => [
'format' => 'module.%s.config.form',
'args' => ':getAlias()'
'args' => ':getSnakeName()'
]],
'args' => []
]],
......@@ -75,7 +75,7 @@
'value' => ':isStatus(1)',
'true' => ['url' => [
'route' => $route_prefix . '.uninstall',
'args' => [':getAlias()']
'args' => [':getSnakeName()']
]],
]],
],[
......@@ -90,7 +90,7 @@
'value' => ':isStatus(1)',
'true' => ['url' => [
'route' => $route_prefix . '.refresh',
'args' => [':getAlias()']
'args' => [':getSnakeName()']
]],
]],
],[
......@@ -99,7 +99,7 @@
'title' => 'Met à jour le module depuis son dépot Git',
'href' => ['url' => [
'route' => $route_prefix . '.update',
'args' => [':getAlias()']
'args' => [':getSnakeName()']
]],
]
]]
......
......@@ -171,7 +171,7 @@
'label' => 'Rôle',
'name' => 'role',
'class' => 'select2',
'values' => $item->getRoleNames()->toArray(),
'values' => $item->getRoleNames()->unique()->toArray(),
'is_multiple' => true,
'is_required' => true,
'options' => [
......
......@@ -93,7 +93,7 @@
'placeholder' => '-- Rôles --',
'attributes' => ['onchange' => "document.getElementById('filter-form').submit();"],
'options' => [
'collect' => $roles,
'collect' => $roles->unique('name'),
'value' => 'id',
'text' => 'display_name',
]
......
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