Update Crud

This commit is contained in:
Jérémy Munsch 2021-06-28 16:04:52 +02:00
parent 68649dd6e3
commit 901c550990
10 changed files with 96 additions and 13 deletions

View file

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

View file

@ -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
*

View file

@ -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:' .

View file

@ -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;
},

View file

@ -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
*

View file

@ -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">

View file

@ -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">

View file

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

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

View file

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