diff --git a/resources/views/components/⚡create-product.blade.php b/resources/views/components/⚡create-product.blade.php new file mode 100644 index 0000000..0946df2 --- /dev/null +++ b/resources/views/components/⚡create-product.blade.php @@ -0,0 +1,66 @@ +validate(); + + Product::create([ + 'sku' => $this->sku, + 'name' => $this->name, + 'description' => $this->description ?: null, + 'price' => $this->price, + 'active' => $this->active, + ]); + + $this->reset(); + Flux::modal('create-product')->close(); + $this->dispatch('product-created'); + } +}; +?> + +
+ + + New Product + + + + +
+ Create Product + + + + + + + +
+ + Create +
+ +
+
\ No newline at end of file diff --git a/resources/views/components/⚡edit-product.blade.php b/resources/views/components/⚡edit-product.blade.php new file mode 100644 index 0000000..818e7d5 --- /dev/null +++ b/resources/views/components/⚡edit-product.blade.php @@ -0,0 +1,86 @@ +productId = $productId; + $product = Product::findOrFail($productId); + + $this->sku = $product->sku; + $this->name = $product->name; + $this->description = $product->description ?? ''; + $this->price = (string) $product->getRawOriginal('price') / 100; + $this->active = $product->active; + + $this->resetValidation(); + Flux::modal('edit-product')->show(); + } + + public function save(): void + { + $this->validate([ + 'sku' => 'required|string|max:50|unique:products,sku,' . $this->productId, + 'name' => 'required|string|max:255', + 'description' => 'nullable|string|max:1000', + 'price' => 'required|numeric|min:0', + 'active' => 'boolean', + ]); + + $product = Product::findOrFail($this->productId); + $product->update([ + 'sku' => $this->sku, + 'name' => $this->name, + 'description' => $this->description ?: null, + 'price' => $this->price, + 'active' => $this->active, + ]); + + $this->reset(); + Flux::modal('edit-product')->close(); + $this->dispatch('product-updated'); + } +}; +?> + +
+ +
+ Edit Product + + + + + + + +
+ + Save +
+ +
+
\ No newline at end of file diff --git a/resources/views/components/⚡product-list.blade.php b/resources/views/components/⚡product-list.blade.php new file mode 100644 index 0000000..69efa70 --- /dev/null +++ b/resources/views/components/⚡product-list.blade.php @@ -0,0 +1,93 @@ +sortBy === $column) { + $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; + } else { + $this->sortBy = $column; + $this->sortDirection = 'asc'; + } + } + + #[On('product-created')] + #[On('product-updated')] + public function refresh(): void {} + + #[Computed] + public function products() + { + return Product::orderBy($this->sortBy, $this->sortDirection)->paginate(10); + } +}; +?> + + +
+ + + + SKU + + + Name + + + Description + + + Price + + + Status + + + + + + @foreach($this->products as $product) + + {{ $product->sku }} + {{ $product->name }} + {{ $product->description }} + {{ $product->price }} + + + {{ $product->active ? 'Active' : 'Inactive' }} + + + + + + + + + + Edit + + + + + + @endforeach + + +
\ No newline at end of file diff --git a/resources/views/layouts/app/sidebar.blade.php b/resources/views/layouts/app/sidebar.blade.php index 0e3dac3..ddc9445 100644 --- a/resources/views/layouts/app/sidebar.blade.php +++ b/resources/views/layouts/app/sidebar.blade.php @@ -20,10 +20,14 @@ {{ __('Clients') }} - + {{ __('Contacts') }} + + {{ __('Products') }} + + diff --git a/resources/views/products/index.blade.php b/resources/views/products/index.blade.php new file mode 100644 index 0000000..7bdceed --- /dev/null +++ b/resources/views/products/index.blade.php @@ -0,0 +1,9 @@ + +
+
+ +
+ + +
+
\ No newline at end of file diff --git a/routes/web.php b/routes/web.php index bcf58a7..5bcde0e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,6 +11,7 @@ Route::middleware(['auth', 'verified'])->group(function () { Route::view('dashboard', 'dashboard')->name('dashboard'); Route::view('clients', 'clients.index')->name('clients'); Route::view('contacts', 'contacts.index')->name('contacts'); + Route::view('products', 'products.index')->name('products'); }); // Route::view('dashboard', 'dashboard')