From 0982ac1601c10f0bd890fe34f696dbc3a05bc880 Mon Sep 17 00:00:00 2001 From: "Christopher C. Wells" Date: Sat, 17 Apr 2021 07:32:46 -0700 Subject: [PATCH] Improve Food validation feedback --- app/Http/Controllers/FoodController.php | 26 +++----------- app/Http/Requests/UpdateFoodRequest.php | 35 +++++++++++++++++++ .../views/components/inputs/input.blade.php | 21 +++++++++-- resources/views/foods/edit.blade.php | 7 ++-- 4 files changed, 64 insertions(+), 25 deletions(-) create mode 100644 app/Http/Requests/UpdateFoodRequest.php diff --git a/app/Http/Controllers/FoodController.php b/app/Http/Controllers/FoodController.php index 176b604..20c53d2 100644 --- a/app/Http/Controllers/FoodController.php +++ b/app/Http/Controllers/FoodController.php @@ -2,13 +2,12 @@ namespace App\Http\Controllers; +use App\Http\Requests\UpdateFoodRequest; use App\Models\Food; -use App\Rules\StringIsDecimalOrFraction; use App\Support\Number; use App\Support\Nutrients; use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; -use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\Support\Str; @@ -35,7 +34,7 @@ class FoodController extends Controller /** * Store a newly created resource in storage. */ - public function store(Request $request): RedirectResponse + public function store(UpdateFoodRequest $request): RedirectResponse { return $this->update($request, new Food()); } @@ -72,25 +71,10 @@ class FoodController extends Controller /** * Update the specified resource in storage. */ - public function update(Request $request, Food $food): RedirectResponse + public function update(UpdateFoodRequest $request, Food $food): RedirectResponse { - $attributes = $request->validate([ - 'name' => 'required|string', - 'detail' => 'nullable|string', - 'brand' => 'nullable|string', - 'source' => 'nullable|string', - 'notes' => 'nullable|string', - 'serving_size' => ['required', new StringIsDecimalOrFraction], - 'serving_unit' => 'nullable|string', - 'serving_unit_name' => 'nullable|string', - 'serving_weight' => 'required|numeric', - 'calories' => 'nullable|numeric', - 'fat' => 'nullable|numeric', - 'cholesterol' => 'nullable|numeric', - 'sodium' => 'nullable|numeric', - 'carbohydrates' => 'nullable|numeric', - 'protein' => 'nullable|numeric', - ]); + $attributes = $request->validated(); + $attributes['serving_size'] = Number::floatFromString($attributes['serving_size']); $attributes['name'] = Str::lower($attributes['name']); diff --git a/app/Http/Requests/UpdateFoodRequest.php b/app/Http/Requests/UpdateFoodRequest.php new file mode 100644 index 0000000..b449a0c --- /dev/null +++ b/app/Http/Requests/UpdateFoodRequest.php @@ -0,0 +1,35 @@ + ['required', 'string'], + 'detail' => ['nullable', 'string'], + 'brand' => ['nullable', 'string'], + 'source' => ['nullable', 'string'], + 'notes' => ['nullable', 'string'], + 'serving_size' => ['required', new StringIsDecimalOrFraction], + 'serving_unit' => ['nullable', 'string'], + 'serving_unit_name' => ['nullable', 'string'], + 'serving_weight' => ['required', 'numeric', 'min:0'], + 'calories' => ['nullable', 'numeric', 'min:0'], + 'fat' => ['nullable', 'numeric', 'min:0'], + 'cholesterol' => ['nullable', 'numeric', 'min:0'], + 'sodium' => ['nullable', 'numeric', 'min:0'], + 'carbohydrates' => ['nullable', 'numeric', 'min:0'], + 'protein' => ['nullable', 'numeric', 'min:0'], + ]; + } + +} diff --git a/resources/views/components/inputs/input.blade.php b/resources/views/components/inputs/input.blade.php index d6d857b..df84ab1 100644 --- a/resources/views/components/inputs/input.blade.php +++ b/resources/views/components/inputs/input.blade.php @@ -1,3 +1,20 @@ -@props(['disabled' => false]) +@props(['disabled' => false, 'hasError' => false]) -merge(['class' => 'rounded-md shadow-sm border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50']) !!}> +@php + $classes = [ + 'rounded-md', + 'shadow-sm', + 'border-gray-300', + 'focus:border-indigo-300', + 'focus:ring', + 'focus:ring-indigo-200', + 'focus:ring-opacity-50' + ]; + if ($hasError) { + $classes[] = 'border-red-600'; + } +@endphp + +merge(['class' => implode(' ', $classes)]) !!}> diff --git a/resources/views/foods/edit.blade.php b/resources/views/foods/edit.blade.php index 6045373..2f8bd06 100644 --- a/resources/views/foods/edit.blade.php +++ b/resources/views/foods/edit.blade.php @@ -18,7 +18,7 @@ class="block mt-1 w-full" autocapitalize="none" :value="old('name', $food->name)" - required/> + :hasError="$errors->has('name')"/> @@ -53,6 +53,7 @@ class="block mt-1 w-full" size="10" :value="old('serving_size', $food->serving_size_formatted)" + :hasError="$errors->has('serving_size')" required/> @@ -91,6 +92,7 @@ class="block mt-1 w-full" size="10" :value="old('serving_weight', $food->serving_weight)" + :hasError="$errors->has('serving_weight')" required/> @@ -106,7 +108,8 @@ type="number" step="any" class="block w-full mt-1 md:w-5/6" - :value="old($nutrient['value'], $food->{$nutrient['value']})"/> + :value="old($nutrient['value'], $food->{$nutrient['value']})" + :hasError="$errors->has($nutrient['value'])"/> @endforeach