Update Crud
This commit is contained in:
parent
68649dd6e3
commit
901c550990
10 changed files with 96 additions and 13 deletions
|
|
@ -10,6 +10,7 @@ use Kwaadpepper\Enum\BaseEnum;
|
|||
* @method static self string()
|
||||
* @method static self text()
|
||||
* @method static self json()
|
||||
* @method static self image()
|
||||
* @method static self email()
|
||||
* @method static self password()
|
||||
* @method static self float()
|
||||
|
|
@ -28,12 +29,13 @@ class CrudType extends BaseEnum
|
|||
'string' => 2,
|
||||
'text' => 3,
|
||||
'json' => 4,
|
||||
'email' => 5,
|
||||
'password' => 6,
|
||||
'float' => 7,
|
||||
'enum' => 8,
|
||||
'belongsTo' => 9,
|
||||
'belongsToMany' => 10
|
||||
'image' => 5,
|
||||
'email' => 6,
|
||||
'password' => 7,
|
||||
'float' => 8,
|
||||
'enum' => 9,
|
||||
'belongsTo' => 10,
|
||||
'belongsToMany' => 11
|
||||
];
|
||||
}
|
||||
|
||||
|
|
@ -45,6 +47,7 @@ class CrudType extends BaseEnum
|
|||
'string' => trans('Chaîne de charactères simple'),
|
||||
'text' => trans('Texte'),
|
||||
'json' => trans('Json'),
|
||||
'image' => trans('Image'),
|
||||
'email' => trans('Chaîne de charactères email'),
|
||||
'password' => trans('Mot de passe'),
|
||||
'float' => trans('Nombre à virgule flotante'),
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Enums\CrudType;
|
||||
use App\Exceptions\CrudException;
|
||||
use App\Http\Requests\CrudIndexRequest;
|
||||
use App\Http\Requests\StoreCrudModel;
|
||||
|
|
@ -67,6 +68,7 @@ class CrudController extends Controller
|
|||
if (!request()->ajax() and !app()->runningInConsole()) {
|
||||
self::shareCrudModelsClassesToView();
|
||||
$this->shareModelClassToView();
|
||||
$this->shareModelHasImageToView();
|
||||
$this->shareModelTableToView();
|
||||
$this->shareModelPropsToView();
|
||||
}
|
||||
|
|
@ -142,7 +144,7 @@ class CrudController extends Controller
|
|||
$model->saveRelations($request);
|
||||
$this->storedModel($model);
|
||||
return \redirect()->route(sprintf('%s.edit', $model->getTable()), $model)
|
||||
->with('success', trans(':model à bien été enregisté.', ['model' => $model->getModelName()]));
|
||||
->with('success', trans(':model a bien été enregisté.', ['model' => $model->getModelName()]));
|
||||
}
|
||||
|
||||
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClass
|
||||
|
|
@ -159,7 +161,7 @@ class CrudController extends Controller
|
|||
$model->saveRelations($request);
|
||||
$this->updatedModel($model);
|
||||
return \redirect()->route(sprintf('%s.edit', $model->getTable()), $model)
|
||||
->with('success', trans(':model à bien été enregisté.', ['model' => $model->getModelName()]));
|
||||
->with('success', trans(':model a bien été enregisté.', ['model' => $model->getModelName()]));
|
||||
}
|
||||
|
||||
public function destroy(Model $model)
|
||||
|
|
@ -176,7 +178,7 @@ class CrudController extends Controller
|
|||
}
|
||||
if ($model->delete()) {
|
||||
return \redirect()->route(sprintf('%s.index', $model->getTable()))
|
||||
->with('warning', trans(':model à bien été supprimé.', ['model' => $model->getModelName()]));
|
||||
->with('warning', trans(':model a bien été supprimé.', ['model' => $model->getModelName()]));
|
||||
} else {
|
||||
return redirect()->back()
|
||||
->with('error', trans(':model n\'as pas pu être supprimé', ['model' => $model->getModelName()]));
|
||||
|
|
@ -215,6 +217,21 @@ class CrudController extends Controller
|
|||
View::share('modelClass', static::$modelClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current model class
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function shareModelHasImageToView(): void
|
||||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Model $model */
|
||||
$model = static::$modelClass;
|
||||
|
||||
View::share('hasImage', (bool)collect((new $model())->getEditableProperties())->filter(function ($prop) {
|
||||
return $prop['type']->equals(CrudType::image());
|
||||
})->count());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current model table
|
||||
*
|
||||
|
|
|
|||
|
|
@ -6,9 +6,8 @@ use App\Enums\CrudAction;
|
|||
use App\Enums\CrudType;
|
||||
use App\Exceptions\CrudException;
|
||||
use App\Http\Controllers\CrudController;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use App\Traits\IsCrudModel;
|
||||
|
||||
class CrudRequest extends FormRequest
|
||||
{
|
||||
|
|
@ -24,6 +23,7 @@ class CrudRequest extends FormRequest
|
|||
*/
|
||||
public function getRulesForAction(CrudAction $action): array
|
||||
{
|
||||
$model = $this->getCurrentModel();
|
||||
$props = $this->getCurrentModel()::getEditableProperties();
|
||||
$propsRules = [];
|
||||
foreach ($this->getCurrentModel()::getRules() as $k => $rules) {
|
||||
|
|
@ -48,6 +48,14 @@ class CrudRequest extends FormRequest
|
|||
if ($props[$k]['type']->equals(CrudType::boolean())) {
|
||||
$this->merge([$k => $this->{$k} ? 1 : 0]);
|
||||
}
|
||||
// handle image
|
||||
if ($props[$k]['type']->equals(CrudType::image())) {
|
||||
$tableName = Str::singular((new $model())->getTable());
|
||||
if ($this->{$tableName}) {
|
||||
$i = array_search('required', $propsRules[$k]);
|
||||
unset($propsRules[$k][$i]);
|
||||
}
|
||||
}
|
||||
// handle belongsToMany
|
||||
if ($props[$k]['type']->equals(CrudType::belongsToMany())) {
|
||||
$propsRules["$k.*"][0] = 'exists:' .
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ class User extends Authenticatable
|
|||
'type' => CrudType::belongsToMany(),
|
||||
'belongsToMany' => Project::class,
|
||||
'belongsToManyLabel' => 'name',
|
||||
'nullable' => true,
|
||||
'readonly' => function () {
|
||||
return auth()->user()->role->equals(Role::admin()) ? false : true;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use App\Enums\CrudType;
|
|||
use App\Exceptions\CrudException;
|
||||
use App\Http\Requests\CrudRequest;
|
||||
use Illuminate\Database\Eloquent\Relations\Relation;
|
||||
use Illuminate\Http\UploadedFile;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
use Kwaadpepper\Enum\BaseEnum;
|
||||
|
|
@ -69,6 +70,9 @@ trait IsCrudModel
|
|||
) {
|
||||
$this->{$k} = $attribute;
|
||||
}
|
||||
if (\is_object($this->{$k}) and \get_class($this->{$k}) === UploadedFile::class) {
|
||||
$this->moveUploadedFile($k, $this->{$k});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -175,6 +179,9 @@ trait IsCrudModel
|
|||
case CrudType::boolean():
|
||||
$defaultRules[] = 'boolean';
|
||||
break;
|
||||
case CrudType::image():
|
||||
$defaultRules[] = 'file';
|
||||
break;
|
||||
case CrudType::email():
|
||||
$defaultRules[] = 'email:rfc,dns';
|
||||
break;
|
||||
|
|
@ -212,6 +219,15 @@ trait IsCrudModel
|
|||
return class_basename(get_class($this));
|
||||
}
|
||||
|
||||
private function moveUploadedFile(string $propName, UploadedFile &$file): void
|
||||
{
|
||||
$this->{$propName} = $file->storePubliclyAs(
|
||||
$this->getTable(),
|
||||
$file->hashName(),
|
||||
['disk' => 'public']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Editable Properties
|
||||
*
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
@endcan
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route("$modelTable.store") }}" method="POST">
|
||||
<form action="{{ route("$modelTable.store") }}" method="POST" @if($hasImage) enctype="multipart/form-data" @endif>
|
||||
@csrf
|
||||
<table class="table table-sm table-bordered border-primary align-middle table-striped text-center">
|
||||
<thead class="thead-dark">
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form action="{{ route("$modelTable.update", $model) }}" method="POST">
|
||||
<form action="{{ route("$modelTable.update", $model) }}" method="POST" @if($hasImage) enctype="multipart/form-data" @endif>
|
||||
@method('put')
|
||||
@csrf
|
||||
<table class="table table-sm table-bordered border-primary align-middle table-striped text-center">
|
||||
|
|
|
|||
|
|
@ -23,6 +23,9 @@ $readonly = is_callable($prop['readonly']) ? $prop['readonly']() : $prop['readon
|
|||
@case(CrudType::json())
|
||||
@include('crud.formfields.json')
|
||||
@break
|
||||
@case(CrudType::image())
|
||||
@include('crud.formfields.image')
|
||||
@break
|
||||
@case(CrudType::enum())
|
||||
@include('crud.formfields.enum')
|
||||
@break
|
||||
|
|
|
|||
26
resources/views/crud/formfields/image.blade.php
Normal file
26
resources/views/crud/formfields/image.blade.php
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
<td>
|
||||
<label for="{{ $fieldName }}" class="form-label">{{ $prop['label'] }}</label>
|
||||
</td>
|
||||
<td>
|
||||
@if(strlen($prop['placeholder']))
|
||||
<div class="form-floating">
|
||||
@endif
|
||||
<input
|
||||
id="{{ $fieldName }}"
|
||||
name="{{ $fieldName }}"
|
||||
type="file"
|
||||
class="form-control"
|
||||
value="{{ old($fieldName) ?? $model->{$fieldName} ?? '' }}"
|
||||
@if(isset($prop['rules']['max']))maxlength="{{ $prop['rules']['max'] }}"@endif
|
||||
@if(isset($prop['rules']['min']))minlength="{{ $prop['rules']['min'] }}"@endif
|
||||
@if($prop['disabled'])disabled @endif
|
||||
@if($readonly)readonly @endif
|
||||
@if(($prop['required'] or (!$prop['required'] and !$prop['nullable'])) and !(isset($model) and $model->{$fieldName}))required @endif>
|
||||
@if(strlen($prop['placeholder']))
|
||||
<label for="{{ $fieldName }}" class="form-label">{{ __('ex: :placeholder', ['placeholder' => $prop['placeholder']]) }}</label>
|
||||
</div>
|
||||
@endif
|
||||
@if(isset($model) and $model->{$fieldName})
|
||||
<img class="img-responsive" src="{{ sprintf('/storage/%s', $model->{$fieldName}) }}" alt="{{ sprintf('/storage/%s', $model->{$fieldName}) }}">
|
||||
@endif
|
||||
</td>
|
||||
|
|
@ -16,6 +16,9 @@
|
|||
@case(CrudType::boolean())
|
||||
@if($model->{$fieldName})OUI @else NON @endif
|
||||
@break
|
||||
@case(CrudType::image())
|
||||
<img class="img-responsive" src="{{ sprintf('/storage/%s', $model->{$fieldName}) }}" alt="{{ sprintf('/storage/%s', $model->{$fieldName}) }}">
|
||||
@break
|
||||
@default
|
||||
{{ $field }}
|
||||
@endswitch
|
||||
|
|
@ -29,9 +32,15 @@
|
|||
@case(CrudType::enum())
|
||||
{{ $model->{$fieldName}->label }}
|
||||
@break
|
||||
@case(CrudType::json())
|
||||
@json($field)
|
||||
@break
|
||||
@case(CrudType::boolean())
|
||||
@if($model->{$fieldName})OUI @else NON @endif
|
||||
@break
|
||||
@case(CrudType::image())
|
||||
<img class="img-responsive" src="{{ sprintf('/storage/%s', $model->{$fieldName}) }}" alt="{{ sprintf('/storage/%s', $model->{$fieldName}) }}">
|
||||
@break
|
||||
@case(CrudType::belongsTo())
|
||||
{{ $prop['belongsTo']::find($model->{$fieldName})->{$model->crudLabelColumn} }}
|
||||
@break
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue