From 901c5509903d5f35d732a2faf356905eb6375f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Mon, 28 Jun 2021 16:04:52 +0200 Subject: [PATCH] Update Crud --- app/Enums/CrudType.php | 15 ++++++----- app/Http/Controllers/CrudController.php | 23 +++++++++++++--- app/Http/Requests/CrudRequest.php | 12 +++++++-- app/Models/User.php | 1 + app/Traits/IsCrudModel.php | 16 ++++++++++++ resources/views/crud/create.blade.php | 2 +- resources/views/crud/edit.blade.php | 2 +- resources/views/crud/formfield.blade.php | 3 +++ .../views/crud/formfields/image.blade.php | 26 +++++++++++++++++++ resources/views/crud/printfield.blade.php | 9 +++++++ 10 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 resources/views/crud/formfields/image.blade.php diff --git a/app/Enums/CrudType.php b/app/Enums/CrudType.php index b5f8301..f0b8a1f 100644 --- a/app/Enums/CrudType.php +++ b/app/Enums/CrudType.php @@ -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'), diff --git a/app/Http/Controllers/CrudController.php b/app/Http/Controllers/CrudController.php index 238af0e..8eb8e1b 100644 --- a/app/Http/Controllers/CrudController.php +++ b/app/Http/Controllers/CrudController.php @@ -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 * diff --git a/app/Http/Requests/CrudRequest.php b/app/Http/Requests/CrudRequest.php index f2d06f8..3ee5fd7 100644 --- a/app/Http/Requests/CrudRequest.php +++ b/app/Http/Requests/CrudRequest.php @@ -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:' . diff --git a/app/Models/User.php b/app/Models/User.php index 76df3d3..7f85d51 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -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; }, diff --git a/app/Traits/IsCrudModel.php b/app/Traits/IsCrudModel.php index 3dcf992..70ccd5b 100644 --- a/app/Traits/IsCrudModel.php +++ b/app/Traits/IsCrudModel.php @@ -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 * diff --git a/resources/views/crud/create.blade.php b/resources/views/crud/create.blade.php index ba950ff..9e17cea 100644 --- a/resources/views/crud/create.blade.php +++ b/resources/views/crud/create.blade.php @@ -18,7 +18,7 @@ @endcan
-
+ @csrf diff --git a/resources/views/crud/edit.blade.php b/resources/views/crud/edit.blade.php index 1698c41..c154980 100644 --- a/resources/views/crud/edit.blade.php +++ b/resources/views/crud/edit.blade.php @@ -30,7 +30,7 @@
- + @method('put') @csrf
diff --git a/resources/views/crud/formfield.blade.php b/resources/views/crud/formfield.blade.php index 5ec65d1..d38ead4 100644 --- a/resources/views/crud/formfield.blade.php +++ b/resources/views/crud/formfield.blade.php @@ -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 diff --git a/resources/views/crud/formfields/image.blade.php b/resources/views/crud/formfields/image.blade.php new file mode 100644 index 0000000..6362773 --- /dev/null +++ b/resources/views/crud/formfields/image.blade.php @@ -0,0 +1,26 @@ + + diff --git a/resources/views/crud/printfield.blade.php b/resources/views/crud/printfield.blade.php index 0975095..a9aff63 100644 --- a/resources/views/crud/printfield.blade.php +++ b/resources/views/crud/printfield.blade.php @@ -16,6 +16,9 @@ @case(CrudType::boolean()) @if($model->{$fieldName})OUI @else NON @endif @break + @case(CrudType::image()) + {{ 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()) + {{ sprintf('/storage/%s', $model->{$fieldName}) }} + @break @case(CrudType::belongsTo()) {{ $prop['belongsTo']::find($model->{$fieldName})->{$model->crudLabelColumn} }} @break
+ + + @if(strlen($prop['placeholder'])) +
+ @endif + {$fieldName}))required @endif> + @if(strlen($prop['placeholder'])) + +
+ @endif + @if(isset($model) and $model->{$fieldName}) + {{ sprintf('/storage/%s', $model->{$fieldName}) }} + @endif +