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