freezer app completed
This commit is contained in:
12
app/Models/Item.php
Normal file
12
app/Models/Item.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Item extends Model
|
||||
{
|
||||
/** @use HasFactory<\Database\Factories\ItemFactory> */
|
||||
use HasFactory;
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"jzonta/faker-restaurant": "^2.0",
|
||||
"laravel/framework": "^12.0",
|
||||
"laravel/tinker": "^2.10.1"
|
||||
},
|
||||
|
||||
174
composer.lock
generated
174
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "169957dd64cb1b1fe48bbed8097aa550",
|
||||
"content-hash": "fcafb5796123bc88493435c346f3619a",
|
||||
"packages": [
|
||||
{
|
||||
"name": "brick/math",
|
||||
@@ -510,6 +510,69 @@
|
||||
],
|
||||
"time": "2025-03-06T22:45:56+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"version": "v1.24.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/FakerPHP/Faker.git",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.4 || ^8.0",
|
||||
"psr/container": "^1.0 || ^2.0",
|
||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"fzaninotto/faker": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.4.1",
|
||||
"doctrine/persistence": "^1.3 || ^2.0",
|
||||
"ext-intl": "*",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"symfony/phpunit-bridge": "^5.4.16"
|
||||
},
|
||||
"suggest": {
|
||||
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
|
||||
"ext-curl": "Required by Faker\\Provider\\Image to download images.",
|
||||
"ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
|
||||
"ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
|
||||
"ext-mbstring": "Required for multibyte Unicode string functionality."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Faker\\": "src/Faker/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "François Zaninotto"
|
||||
}
|
||||
],
|
||||
"description": "Faker is a PHP library that generates fake data for you.",
|
||||
"keywords": [
|
||||
"data",
|
||||
"faker",
|
||||
"fixtures"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/FakerPHP/Faker/issues",
|
||||
"source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
|
||||
},
|
||||
"time": "2024-11-21T13:46:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fruitcake/php-cors",
|
||||
"version": "v1.3.0",
|
||||
@@ -1054,6 +1117,52 @@
|
||||
],
|
||||
"time": "2025-02-03T10:55:03+00:00"
|
||||
},
|
||||
{
|
||||
"name": "jzonta/faker-restaurant",
|
||||
"version": "2.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/jzonta/FakerRestaurant.git",
|
||||
"reference": "4e10ff08dc8ca08603a3daf7abe48d412b013cf4"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/jzonta/FakerRestaurant/zipball/4e10ff08dc8ca08603a3daf7abe48d412b013cf4",
|
||||
"reference": "4e10ff08dc8ca08603a3daf7abe48d412b013cf4",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"fakerphp/faker": "^1.9.1",
|
||||
"php": ">=7.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"friendsofphp/php-cs-fixer": "^2.17",
|
||||
"phpstan/phpstan": "^0.12.66",
|
||||
"phpunit/phpunit": "^9"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"FakerRestaurant\\": "src"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "João Zonta"
|
||||
}
|
||||
],
|
||||
"description": "Food and Beverage names generate using fakerphp/faker",
|
||||
"homepage": "https://github.com/jzonta/FakerRestaurant",
|
||||
"support": {
|
||||
"issues": "https://github.com/jzonta/FakerRestaurant/issues",
|
||||
"source": "https://github.com/jzonta/FakerRestaurant/tree/v2.0.1"
|
||||
},
|
||||
"time": "2021-11-15T11:21:22+00:00"
|
||||
},
|
||||
{
|
||||
"name": "laravel/framework",
|
||||
"version": "v12.4.0",
|
||||
@@ -5925,69 +6034,6 @@
|
||||
},
|
||||
"time": "2024-12-07T21:18:45+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fakerphp/faker",
|
||||
"version": "v1.24.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/FakerPHP/Faker.git",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.4 || ^8.0",
|
||||
"psr/container": "^1.0 || ^2.0",
|
||||
"symfony/deprecation-contracts": "^2.2 || ^3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"fzaninotto/faker": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"bamarni/composer-bin-plugin": "^1.4.1",
|
||||
"doctrine/persistence": "^1.3 || ^2.0",
|
||||
"ext-intl": "*",
|
||||
"phpunit/phpunit": "^9.5.26",
|
||||
"symfony/phpunit-bridge": "^5.4.16"
|
||||
},
|
||||
"suggest": {
|
||||
"doctrine/orm": "Required to use Faker\\ORM\\Doctrine",
|
||||
"ext-curl": "Required by Faker\\Provider\\Image to download images.",
|
||||
"ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.",
|
||||
"ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.",
|
||||
"ext-mbstring": "Required for multibyte Unicode string functionality."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Faker\\": "src/Faker/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "François Zaninotto"
|
||||
}
|
||||
],
|
||||
"description": "Faker is a PHP library that generates fake data for you.",
|
||||
"keywords": [
|
||||
"data",
|
||||
"faker",
|
||||
"fixtures"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/FakerPHP/Faker/issues",
|
||||
"source": "https://github.com/FakerPHP/Faker/tree/v1.24.1"
|
||||
},
|
||||
"time": "2024-11-21T13:46:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fidry/cpu-core-counter",
|
||||
"version": "1.2.0",
|
||||
|
||||
29
database/factories/ItemFactory.php
Normal file
29
database/factories/ItemFactory.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace Database\Factories;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\Factory;
|
||||
|
||||
/**
|
||||
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Item>
|
||||
*/
|
||||
class ItemFactory extends Factory
|
||||
{
|
||||
/**
|
||||
* Define the model's default state.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function definition(): array
|
||||
{
|
||||
$faker = \Faker\Factory::create();
|
||||
$faker->addProvider(new \FakerRestaurant\Provider\en_US\Restaurant($faker));
|
||||
|
||||
return [
|
||||
"name" => $faker->foodName(),
|
||||
"description" => null,
|
||||
"in_date" => fake()->date("d-m-Y"),
|
||||
"quantity" => fake()->numberBetween(1, 5)
|
||||
];
|
||||
}
|
||||
}
|
||||
31
database/migrations/2025_03_31_094736_create_items_table.php
Normal file
31
database/migrations/2025_03_31_094736_create_items_table.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('items', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string("name");
|
||||
$table->string("description")->nullable();
|
||||
$table->date("in_date");
|
||||
$table->integer("quantity");
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('items');
|
||||
}
|
||||
};
|
||||
@@ -1,5 +1,7 @@
|
||||
@import 'tailwindcss';
|
||||
|
||||
@custom-variant dark (&:where(.dark, .dark *));
|
||||
|
||||
@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
|
||||
@source '../../storage/framework/views/*.php';
|
||||
@source '../**/*.blade.php';
|
||||
|
||||
4
resources/views/add.blade.php
Normal file
4
resources/views/add.blade.php
Normal file
@@ -0,0 +1,4 @@
|
||||
<x-layout>
|
||||
<h1 class="m-4 text-2xl text-center">Aggiungi elemento</h1>
|
||||
<x-form method="POST" action="/add"></x-form>
|
||||
</x-layout>
|
||||
58
resources/views/components/form.blade.php
Normal file
58
resources/views/components/form.blade.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<form {{ $attributes }}>
|
||||
@csrf
|
||||
<div class="p-4">
|
||||
<div>
|
||||
<label for="name"
|
||||
class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
|
||||
Nome
|
||||
</label>
|
||||
<input required type="text" id="name" name="name"
|
||||
class="bg-gray-50 border border-gray-300
|
||||
text-gray-900 text-sm rounded-lg focus:ring-blue-500
|
||||
focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700
|
||||
dark:border-gray-600 dark:placeholder-gray-400 dark:text-white
|
||||
dark:focus:ring-blue-500 dark:focus:border-blue-500">
|
||||
</div>
|
||||
<div>
|
||||
<label for="description"
|
||||
class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
|
||||
Descrizione
|
||||
</label>
|
||||
<input type="text" id="description" name="description"
|
||||
class="bg-gray-50 border border-gray-300
|
||||
text-gray-900 text-sm rounded-lg focus:ring-blue-500
|
||||
focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700
|
||||
dark:border-gray-600 dark:placeholder-gray-400 dark:text-white
|
||||
dark:focus:ring-blue-500 dark:focus:border-blue-500">
|
||||
</div>
|
||||
<div>
|
||||
<label for="in_date"
|
||||
class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
|
||||
Data inserimento
|
||||
</label>
|
||||
<input required type="date" id="in_date" name="in_date"
|
||||
class="bg-gray-50 border border-gray-300
|
||||
text-gray-900 text-sm rounded-lg focus:ring-blue-500
|
||||
focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700
|
||||
dark:border-gray-600 dark:placeholder-gray-400 dark:text-white
|
||||
dark:focus:ring-blue-500 dark:focus:border-blue-500">
|
||||
</div>
|
||||
<div>
|
||||
<label for="quantity"
|
||||
class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">
|
||||
Quantitá
|
||||
</label>
|
||||
<input required type="number" id="quantity" name="quantity"
|
||||
class="bg-gray-50 border border-gray-300
|
||||
text-gray-900 text-sm rounded-lg focus:ring-blue-500
|
||||
focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700
|
||||
dark:border-gray-600 dark:placeholder-gray-400 dark:text-white
|
||||
dark:focus:ring-blue-500 dark:focus:border-blue-500">
|
||||
</div>
|
||||
<input type="submit" value="Aggiungi"
|
||||
class="mt-4 text-white bg-sky-700 hover:bg-sky-800
|
||||
focus:ring-4 focus:outline-none focus:ring-sky-300
|
||||
font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5
|
||||
text-center dark:bg-sky-600 dark:hover:bg-sky-700 dark:focus:ring-sky-800">
|
||||
</div>
|
||||
</form>
|
||||
16
resources/views/components/layout.blade.php
Normal file
16
resources/views/components/layout.blade.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
@vite('resources/css/app.css')
|
||||
<title>Document</title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="p-4">
|
||||
<x-navigation></x-navigation>
|
||||
{{ $slot }}
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
1
resources/views/components/link.blade.php
Normal file
1
resources/views/components/link.blade.php
Normal file
@@ -0,0 +1 @@
|
||||
<a {{ $attributes }} class="m-2 p-2 bg-sky-100 rounded-lg hover:bg-sky-200">{{ $slot }}</a>
|
||||
4
resources/views/components/navigation.blade.php
Normal file
4
resources/views/components/navigation.blade.php
Normal file
@@ -0,0 +1,4 @@
|
||||
<nav>
|
||||
<x-link href="/">Home</x-link>
|
||||
<x-link href="/add">Aggiungi</x-link>
|
||||
</nav>
|
||||
77
resources/views/components/table.blade.php
Normal file
77
resources/views/components/table.blade.php
Normal file
@@ -0,0 +1,77 @@
|
||||
<table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400">
|
||||
<thead class="text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
|
||||
<tr>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Id
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Nome
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Descrizione
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Data inserimento
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Quantitá
|
||||
</th>
|
||||
<th scope="col" class="px-6 py-3">
|
||||
Azioni
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach($items as $item)
|
||||
<tr class="bg-white border-b dark:bg-gray-800 dark:border-gray-700 border-gray-200">
|
||||
<td class="px-6 py-4">
|
||||
{{ $item->id }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ $item->name }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ $item->description }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ $item->in_date }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
{{ $item->quantity }}
|
||||
</td>
|
||||
<td class="px-6 py-4">
|
||||
@if ($item->quantity == 0)
|
||||
<form method="POST" action="/delete/{{ $item->id }}">
|
||||
@csrf
|
||||
@method("DELETE")
|
||||
<input type="submit" class="text-white bg-red-700 hover:bg-red-800
|
||||
focus:ring-4 focus:outline-none focus:ring-red-300
|
||||
font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5
|
||||
text-center dark:bg-red-600 dark:hover:bg-red-700 dark:focus:ring-red-800" value="Cancella">
|
||||
</form>
|
||||
@else
|
||||
<div class="flex row">
|
||||
<form method="POST" action="/reduce/{{ $item->id }}">
|
||||
@csrf
|
||||
@method("PUT")
|
||||
<input type="submit" class="mr-2 text-white bg-yellow-700 hover:bg-yellow-800
|
||||
focus:ring-4 focus:outline-none focus:ring-yellow-300
|
||||
font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5
|
||||
text-center dark:bg-yellow-600 dark:hover:bg-yellow-700 dark:focus:ring-yellow-800" value="-1">
|
||||
</form>
|
||||
<form method="POST" action="/increase/{{ $item->id }}">
|
||||
@csrf
|
||||
@method("PUT")
|
||||
<input type="submit" class="text-white bg-green-700 hover:bg-green-800
|
||||
focus:ring-4 focus:outline-none focus:ring-green-300
|
||||
font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5
|
||||
text-center dark:bg-green-600 dark:hover:bg-green-700 dark:focus:ring-green-800" value="+1">
|
||||
</form>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
</table>
|
||||
7
resources/views/freezer.blade.php
Normal file
7
resources/views/freezer.blade.php
Normal file
@@ -0,0 +1,7 @@
|
||||
<x-layout>
|
||||
<h1 class="m-4 text-2xl text-center">Freezer App</h1>
|
||||
<x-table :items="$items"></x-table>
|
||||
<div class="mt-2">
|
||||
{{ $items->links() }}
|
||||
</div>
|
||||
</x-layout>
|
||||
@@ -1,7 +1,48 @@
|
||||
<?php
|
||||
|
||||
use App\Models\Item;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::get('/', function () {
|
||||
Route::get('/laravel', function () {
|
||||
return view('welcome');
|
||||
});
|
||||
|
||||
Route::get("/", function () {
|
||||
$items = Item::orderBy("id", "desc")->simplePaginate(8);
|
||||
return view("freezer", [
|
||||
"items" => $items
|
||||
]);
|
||||
});
|
||||
|
||||
Route::get("/add", function() {
|
||||
return view("add");
|
||||
});
|
||||
|
||||
Route::post("/add", function(){
|
||||
Item::insert([
|
||||
"name"=>request("name"),
|
||||
"description"=>request("description"),
|
||||
"in_date"=>request("in_date"),
|
||||
"quantity"=>request("quantity"),
|
||||
]);
|
||||
return redirect("/");
|
||||
});
|
||||
|
||||
Route::put("/reduce/{id}", function($id){
|
||||
$item = Item::find($id);
|
||||
$item->quantity = $item->quantity - 1;
|
||||
$item->save();
|
||||
return redirect("/");
|
||||
});
|
||||
|
||||
Route::put("/increase/{id}", function($id){
|
||||
$item = Item::find($id);
|
||||
$item->quantity = $item->quantity + 1;
|
||||
$item->save();
|
||||
return redirect("/");
|
||||
});
|
||||
|
||||
Route::delete("/delete/{id}", function($id){
|
||||
Item::find($id)->delete();
|
||||
return redirect("/");
|
||||
});
|
||||
Reference in New Issue
Block a user