Skip to main content

Black Friday 2025! Only until December 1st: coupon FRIDAY25 for 40% off Yearly/Lifetime membership!

Read more here

JustinByrne/Mealing

99 stars
6 code files
View JustinByrne/Mealing on GitHub

app/Http/Controllers/IngredientController.php

Open in GitHub
use Auth;
use Gate;
use App\Models\Ingredient;
use Illuminate\Http\Request;
use Illuminate\Contracts\View\View;
use Illuminate\Http\RedirectResponse;
use App\Http\Requests\StoreIngredientRequest;
use App\Http\Requests\UpdateIngredientRequest;
 
class IngredientController extends Controller
{
public function index(): View
{
abort_if(Gate::denies('ingredient_access'), 403);
 
return view('admin.ingredients.index');
}
 
public function create(): View
{
abort_if(Gate::denies('ingredient_create'), 403);
 
return view('admin.ingredients.create');
}
 
public function store(StoreIngredientRequest $request): RedirectResponse
{
$ingredient = Auth::User()->Ingredients()->create($request->validated());
 
return redirect($ingredient->path());
}
 
public function show(Ingredient $ingredient): View
{
abort_if(Gate::denies('ingredient_show'), 403);
 
$ingredient->load('recipes.media', 'recipes.ratings');
 
return view('admin.ingredients.show', compact('ingredient'));
}
 
public function edit(Ingredient $ingredient): View
{
abort_if(Gate::denies('ingredient_edit'), 403);
 
abort_if($ingredient->user->id != \Auth::id(), 403);
 
return view('admin.ingredients.edit', compact('ingredient'));
}
 
public function update(UpdateIngredientRequest $request, Ingredient $ingredient): RedirectResponse
{
abort_if($ingredient->user->id != \Auth::id(), 403);
 
$ingredient->update($request->validated());
 
return redirect($ingredient->path());
}
 
public function destroy(Ingredient $ingredient): RedirectResponse
{
abort_if(Gate::denies('ingredient_delete')
|| $ingredient->user_id != \Auth::id(), 403);
 
$ingredient->delete();
 
return redirect()->route('admin.ingredients.index');
}
}

routes/web.php

Open in GitHub
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\IngredientController;
 
Route::middleware(['auth', 'verified', 'approved'])->group(function() {
//
Route::prefix('admin')->name('admin.')->group(function() {
//
Route::resource('ingredients', IngredientController::class);
});
});

views/admin/ingredients/index.blade.php

Open in GitHub
@extends('admin.layout')
 
@section('title', 'Ingredients')
 
@section('admin.content')
@livewire('ingredients.index')
@endsection

resources/views/admin/ingredients/create.blade.php

Open in GitHub
@extends('admin.layout')
 
@section('title', 'Create New Ingrident')
 
@section('admin.content')
<div class="w-full p-4 bg-white border-b border-gray-200 rounded-t-md dark:bg-gray-700">
<p class="font-bold dark:text-gray-200">
Create new Ingredient
</p>
</div>
<form action="{{ route('admin.ingredients.store') }}" method="POST" class="p-4 space-y-4">
@csrf
<div class="grid grid-cols-1 lg:grid-cols-6">
<label for="name" class="dark:text-gray-200 self-center">
Name
</label>
<input type="text" name="name" id="name" value="{{ old('name') }}" class="border-1 border-gray-100 shadow bg-opacity-20 rounded-lg placeholder-gray-500 w-full lg:w-60 focus:outline-none focus:ring-1 focus:border-green-500 focus:ring-green-500 dark:bg-gray-900 dark:border-transparent dark:text-gray-200">
</div>
<div>
<button type="submit" class="w-full lg:w-auto rounded shadow-md py-2 px-4 bg-green-700 text-white hover:bg-green-500">
Create Ingredient
</button>
</div>
</form>
@endsection

resources/views/admin/ingredients/edit.blade.php

Open in GitHub
@extends('admin.layout')
 
@section('title', 'Edit - ' . $ingredient->name)
 
@section('admin.content')
<div class="w-full p-4 bg-white border-b border-gray-200 rounded-t-md dark:bg-gray-700">
<p class="font-bold dark:text-gray-200">
Edit Ingredient - {{ $ingredient->name }}
</p>
</div>
<form action="{{ route('admin.ingredients.update', $ingredient) }}" method="POST" class="p-4 space-y-4">
@csrf
@method('PATCH')
<div class="grid grid-cols-1 lg:grid-cols-6">
<label for="name" class="dark:text-gray-200 self-center">
Name
</label>
<input type="text" name="name" id="name" value="{{ old('name', $ingredient->name) }}" class="border-1 border-gray-100 shadow bg-opacity-20 rounded-lg placeholder-gray-500 w-full lg:w-60 focus:outline-none focus:ring-1 focus:border-green-500 focus:ring-green-500 dark:bg-gray-900 dark:border-transparent dark:text-gray-200">
</div>
<div>
<button type="submit" class="w-full lg:w-auto rounded shadow-md py-2 px-4 bg-green-700 text-white hover:bg-green-500">
Save Changes
</button>
</div>
</form>
@endsection

resources/views/admin/ingredients/show.blade.php

Open in GitHub
@extends('admin.layout')
 
@section('title', $ingredient->name)
 
@section('admin.content')
<div class="w-full p-4 bg-white border-b border-gray-200 rounded-t-md dark:bg-gray-700">
<p class="font-bold dark:text-gray-200">
{{ $ingredient->name }}
</p>
</div>
<div class="p-4 space-y-4">
@if ($ingredient->recipes()->count() > 0)
<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-6 mb-5">
@foreach ($ingredient->recipes as $recipe)
<a href="{{ route('recipes.show', $recipe) }}">
<div class="w-full h-full rounded-md shadow-md dark:bg-gray-700">
<div>
@if ($recipe->getMedia()->count() > 0)
<img src="{{ $recipe->getFirstMediaUrl('default', 'thumb') }}" class="w-full max-h-32 object-cover rounded-t-md">
@else
<img src="https://via.placeholder.com/640x360.png?text=No+Image" class="w-full h-32 object-cover rounded-t-md">
@endif
</div>
<div class="bg-white p-4 rounded-b-md dark:bg-gray-700 dark:text-gray-200">
<p class="mb-2">
{{ $recipe->name }}
</p>
<p class="text-sm text-yellow-400" title="{{ $recipe->avg_rating > 0 ? $recipe->avg_rating : '0' }}">
@for ($x = 0; $x < 5; $x++)
@if (floor($recipe->avg_rating)-$x >= 1)
<i class="fas fa-star"></i>
@elseif ($recipe->avg_rating-$x > 0)
<i class="fas fa-star-half-alt"></i>
@else
<i class="far fa-star"></i>
@endif
@endfor
</p>
</div>
</div>
</a>
@endforeach
</div>
@else
No Recipes are using this ingredient.
@endif
</div>
@endsection

We'd Love Your Feedback

Tell us what you like or what we can improve

Feel free to share anything you like or dislike about this page or the platform in general.