Handle meals form

This commit is contained in:
Christopher C. Wells 2021-05-29 13:32:54 -07:00
parent eca41e89db
commit 8ab11d5456
5 changed files with 36 additions and 13 deletions

View File

@ -2,9 +2,11 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Rules\ArrayNotEmpty;
use App\Support\ArrayFormat;
use Illuminate\Contracts\View\View; use Illuminate\Contracts\View\View;
use Illuminate\Http\Client\Request;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
class MealsController extends Controller class MealsController extends Controller
@ -23,8 +25,17 @@ class MealsController extends Controller
*/ */
public function update(Request $request): RedirectResponse public function update(Request $request): RedirectResponse
{ {
// @todo Handle meals update request. $attributes = $request->validate([
Auth::user()->refresh(); 'meal' => ['required', new ArrayNotEmpty],
'meal.value.*' => ['required', 'numeric'],
'meal.weight.*' => ['required', 'numeric'],
'meal.label.*' => ['nullable', 'string'],
'meal.enabled.*' => ['required', 'boolean'],
]);
$user = Auth::user();
$user->meals = ArrayFormat::flipTwoDimensionalKeys($attributes['meal']);
$user->save();
session()->flash('message', "Meals customizations updated!"); session()->flash('message', "Meals customizations updated!");
return redirect()->route('meals.edit'); return redirect()->route('meals.edit');
} }

View File

@ -100,7 +100,7 @@ final class User extends Authenticatable implements HasMedia
'value' => $i, 'value' => $i,
'label' => 'Meal ' . ($i + 1), 'label' => 'Meal ' . ($i + 1),
'weight' => $i, 'weight' => $i,
'active' => $i < 3, 'enabled' => $i < 3,
]); ]);
} }
return $meals; return $meals;

2
public/css/app.css vendored

File diff suppressed because one or more lines are too long

View File

@ -135,7 +135,7 @@
</section> </section>
</div> </div>
<div class="w-full sm:w-3/5 md:w-2/3 lg:w-3/4 flex flex-col space-y-4"> <div class="w-full sm:w-3/5 md:w-2/3 lg:w-3/4 flex flex-col space-y-4">
@foreach(\Illuminate\Support\Facades\Auth::user()->meals->where('active')->sortBy('weight') as $meal) @foreach(\Illuminate\Support\Facades\Auth::user()->meals->where('enabled')->sortBy('weight') as $meal)
<div> <div>
<h3 class="font-semibold text-lg text-gray-800"> <h3 class="font-semibold text-lg text-gray-800">
<div class="flex items-center"> <div class="flex items-center">

View File

@ -7,24 +7,36 @@
@method('put') @method('put')
@csrf @csrf
<div class="flex flex-col space-y-4"> <div class="flex flex-col space-y-4">
<div class="flex flex-row space-x-4 w-full items-center bg-gray-200 text-gray-600 uppercase text-sm leading-normal font-bold">
<div class="w-1/6 sm:w-1/12 p-2">&nbsp;</div>
<div class="w-4/6 sm:w-5/6 p-2">Meal name</div>
<div class="w-1/6 sm:w-1/12 p-2 text-center">Active</div>
</div>
<div x-data class="meals space-y-4"> <div x-data class="meals space-y-4">
@foreach($meals as $key => $meal) @foreach($meals as $key => $meal)
<div class="meal draggable w-full"> <div class="meal draggable w-full">
<x-inputs.input type="hidden" name="meal[value][]" :value="$key" /> <x-inputs.input type="hidden" name="meal[value][]" :value="$meal['value']" />
<x-inputs.input type="hidden" name="meal[weight][]" :value="$meal['weight'] ?? null" /> <x-inputs.input type="hidden" name="meal[weight][]" :value="$meal['weight'] ?? null" />
<div class="flex flex-row space-x-4 w-full items-center"> <div class="flex flex-row space-x-4 w-full items-center">
<div class="draggable-handle self-center text-gray-500 bg-gray-100 w-auto p-2 cursor-move"> <div class="w-1/6 sm:w-1/12">
<svg class="h-6 w-6 mx-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor"> <div class="draggable-handle self-center text-gray-500 bg-gray-100 p-2 cursor-move">
<path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd" /> <svg class="h-6 w-6 mx-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
</svg> <path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd" />
</svg>
</div>
</div> </div>
<x-inputs.input name="meal[label][]" <x-inputs.input name="meal[label][]"
type="text" type="text"
size="5" size="5"
placeholder="Breakfast, lunch, dinner, etc." placeholder="Breakfast, lunch, dinner, etc."
class="block w-full" class="block w-4/6 sm:w-5/6"
:value="$meal['label'] ?? null" /> :value="$meal['label'] ?? null" />
<x-inputs.input type="checkbox" name="meal[enabled][]" value="1" checked="checked" /> <div class="w-1/6 sm:w-1/12 text-center">
<x-inputs.input name="meal[enabled][]"
type="checkbox"
value="1"
:checked="$meal['enabled'] ?? null" />
</div>
</div> </div>
</div> </div>
@endforeach @endforeach