mirror of https://github.com/kcal-app/kcal.git
Add meals routes and controller (WIP)
This commit is contained in:
parent
33fe04a7e5
commit
be6485372d
|
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
use Illuminate\Contracts\View\View;
|
||||||
|
use Illuminate\Http\Client\Request;
|
||||||
|
use Illuminate\Http\RedirectResponse;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
|
class MealsController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for editing a user's meals data.
|
||||||
|
*/
|
||||||
|
public function edit(): View
|
||||||
|
{
|
||||||
|
return view('meals.edit')->with('meals', Auth::user()->meals);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the user profile data.
|
||||||
|
*/
|
||||||
|
public function update(Request $request): RedirectResponse
|
||||||
|
{
|
||||||
|
// @todo Handle meals update request.
|
||||||
|
Auth::user()->refresh();
|
||||||
|
session()->flash('message', "Meals customizations updated!");
|
||||||
|
return redirect()->route('meals.edit');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -29,6 +29,7 @@
|
||||||
<div class="space-y-2">
|
<div class="space-y-2">
|
||||||
<x-dropdown-link :href="route('profiles.show', Auth::user())">My Profile</x-dropdown-link>
|
<x-dropdown-link :href="route('profiles.show', Auth::user())">My Profile</x-dropdown-link>
|
||||||
<x-dropdown-link :href="route('goals.index')">My Goals</x-dropdown-link>
|
<x-dropdown-link :href="route('goals.index')">My Goals</x-dropdown-link>
|
||||||
|
<x-dropdown-link :href="route('meals.edit')">My Meals</x-dropdown-link>
|
||||||
@can('administer', \App\Models\User::class)
|
@can('administer', \App\Models\User::class)
|
||||||
<hr />
|
<hr />
|
||||||
<x-dropdown-link :href="route('users.index')">Manage Users</x-dropdown-link>
|
<x-dropdown-link :href="route('users.index')">Manage Users</x-dropdown-link>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
<x-app-layout>
|
||||||
|
<x-slot name="title">My Meals</x-slot>
|
||||||
|
<x-slot name="header">
|
||||||
|
<h1 class="font-semibold text-xl text-gray-800 leading-tight">My Meals</h1>
|
||||||
|
</x-slot>
|
||||||
|
<form method="POST" enctype="multipart/form-data" action="{{ route('meals.update') }}">
|
||||||
|
@method('put')
|
||||||
|
@csrf
|
||||||
|
<div class="flex flex-col space-y-4">
|
||||||
|
<div x-data class="meals space-y-4">
|
||||||
|
@foreach($meals as $key => $meal)
|
||||||
|
<div class="meal draggable w-full">
|
||||||
|
<x-inputs.input type="hidden" name="meal[value][]" :value="$key" />
|
||||||
|
<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="draggable-handle self-center text-gray-500 bg-gray-100 w-auto p-2 cursor-move">
|
||||||
|
<svg class="h-6 w-6 mx-auto" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
|
||||||
|
<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>
|
||||||
|
<x-inputs.input name="meal[label][]"
|
||||||
|
type="text"
|
||||||
|
size="5"
|
||||||
|
placeholder="Breakfast, lunch, dinner, etc."
|
||||||
|
class="block w-full"
|
||||||
|
:value="$meal['label'] ?? null" />
|
||||||
|
<x-inputs.input type="checkbox" name="meal[enabled][]" value="1" checked="checked" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endforeach
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex items-center justify-end mt-4">
|
||||||
|
<x-inputs.button>Save</x-inputs.button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
@once
|
||||||
|
@push('scripts')
|
||||||
|
<script src="{{ asset('js/draggable.js') }}"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
// Activate meals sortable.
|
||||||
|
const mealsSortable = new Draggable.Sortable(document.querySelector('.meals'), {
|
||||||
|
draggable: '.draggable',
|
||||||
|
handle: '.draggable-handle',
|
||||||
|
mirror: {
|
||||||
|
appendTo: '.meals',
|
||||||
|
constrainDimensions: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Recalculate weight (order) of all ingredients.
|
||||||
|
mealsSortable.on('drag:stopped', (e) => {
|
||||||
|
Array.from(e.sourceContainer.children)
|
||||||
|
.filter(el => el.classList.contains('draggable'))
|
||||||
|
.forEach((el, index) => {
|
||||||
|
el.querySelector('input[name$="[weight][]"]').value = index;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
@endonce
|
||||||
|
</x-app-layout>
|
||||||
|
|
@ -5,6 +5,7 @@ use App\Http\Controllers\GoalController;
|
||||||
use App\Http\Controllers\IngredientPickerController;
|
use App\Http\Controllers\IngredientPickerController;
|
||||||
use App\Http\Controllers\JournalDateController;
|
use App\Http\Controllers\JournalDateController;
|
||||||
use App\Http\Controllers\JournalEntryController;
|
use App\Http\Controllers\JournalEntryController;
|
||||||
|
use App\Http\Controllers\MealsController;
|
||||||
use App\Http\Controllers\ProfileController;
|
use App\Http\Controllers\ProfileController;
|
||||||
use App\Http\Controllers\RecipeController;
|
use App\Http\Controllers\RecipeController;
|
||||||
use App\Http\Controllers\Auth\AuthenticatedSessionController;
|
use App\Http\Controllers\Auth\AuthenticatedSessionController;
|
||||||
|
|
@ -40,6 +41,10 @@ Route::middleware(['auth'])->group(function () {
|
||||||
Route::resource('journal-entries', JournalEntryController::class);
|
Route::resource('journal-entries', JournalEntryController::class);
|
||||||
Route::get('/journal-entries/{journal_entry}/delete', [JournalEntryController::class, 'delete'])->name('journal-entries.delete');
|
Route::get('/journal-entries/{journal_entry}/delete', [JournalEntryController::class, 'delete'])->name('journal-entries.delete');
|
||||||
|
|
||||||
|
// Meals.
|
||||||
|
Route::get('/meals', [MealsController::class, 'edit'])->name('meals.edit');
|
||||||
|
Route::put('/meals', [MealsController::class, 'update'])->name('meals.update');
|
||||||
|
|
||||||
// Recipes.
|
// Recipes.
|
||||||
Route::resource('recipes', RecipeController::class);
|
Route::resource('recipes', RecipeController::class);
|
||||||
Route::get('/recipes/{recipe}/delete', [RecipeController::class, 'delete'])->name('recipes.delete');
|
Route::get('/recipes/{recipe}/delete', [RecipeController::class, 'delete'])->name('recipes.delete');
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue