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
+
+
+
+
+
+
+
\ 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');
+ }
+};
+?>
+
+
\ 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')