Skip to content

Commit ebd0e4f

Browse files
author
chechojgb
committed
refactor: entrega update de productos
Se termino el modal para editar un producto y mandar el prop al front. Tambien se creo la maquetacion de como va ser la pagina de la marcacion para implementar la estructura y funcionamiento.
1 parent 0a7eaaf commit ebd0e4f

File tree

7 files changed

+234
-19
lines changed

7 files changed

+234
-19
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use Illuminate\Http\Request;
6+
use Inertia\Inertia;
7+
use Illuminate\Support\Facades\Auth;
8+
9+
class BLMarcacionController extends Controller
10+
{
11+
public function index()
12+
{
13+
$user = Auth::user();
14+
return Inertia::render('BLMarcacion', [
15+
'user' => $user,
16+
]);
17+
}
18+
}

app/Http/Controllers/BlProductoController.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,7 @@ public function update(Request $request, BlProducto $producto)
214214
'color_id' => 'required|exists:bl_colores,id',
215215
]));
216216

217-
return redirect()->back()->with([
218-
'toast' => [
219-
'type' => 'success',
220-
'message' => 'Producto actualizado'
221-
]
222-
]);
217+
return redirect()->back()->with('success', 'Producto actualizado correctamente');
223218
}
224219

225220
public function show($id)

resources/js/components/BL/EditProductModal.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const EditarProductForm = ({ productDetail, onSave, onCancel, onClose, colores }
3232
const handleSubmit = (e) => {
3333
e.preventDefault();
3434
// pasamos la descripcion calculada al guardar
35-
onSave({ ...formData, descripcion });
35+
onSave({ ...formData, descripcion, id: productDetail.id });
3636
};
3737

3838
const hasColors = colores && colores.length > 0;

resources/js/components/BL/tablaProdBL.jsx

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ import { usePage } from '@inertiajs/react';
1111
import axios from 'axios';
1212
import EditarProductForm from './EditProductModal';
1313
import AgentModalWrapper from '../agentsModalWrapper';
14+
import { router } from '@inertiajs/react';
15+
import { Toast } from "flowbite-react";
16+
import { useEffect } from 'react';
17+
import { HiCheck, HiX } from "react-icons/hi";
1418

1519
export default function TablaProductosBL({ productos, openModal, search }) {
1620
const { props } = usePage();
@@ -19,6 +23,22 @@ export default function TablaProductosBL({ productos, openModal, search }) {
1923
const [productDetail, setProductDetail] = useState(null);
2024
const [colores, setColores] = useState(null);
2125
const [modalOpenProductEdit, setModalOpenProductEdit] = useState(false);
26+
const [toast, setToast] = useState({
27+
show: false,
28+
success: false,
29+
message: "",
30+
});
31+
32+
useEffect(() => {
33+
if (toast.show) {
34+
const timer = setTimeout(() => {
35+
setToast({ show: false, success: false, message: '' });
36+
}, 4000);
37+
38+
return () => clearTimeout(timer);
39+
}
40+
}, [toast]);
41+
2242
const openModalEditProduct = async(id) => {
2343
try {
2444
const response = await axios.get(`BLProductShow/${id}`);
@@ -32,16 +52,18 @@ export default function TablaProductosBL({ productos, openModal, search }) {
3252
const closeModal = () => {
3353
setModalOpenProductEdit(false);
3454
};
35-
const handleEditarProducto = (clientData) => {
36-
console.log('datos producto',clientData);
37-
router.post(route(`clientesBL.update`, clientData.id), clientData, {
55+
const handleEditarProducto = (productData) => {
56+
console.log("➡️ productData recibido:", productData);
57+
console.log("➡️ id:", productData?.id);
58+
router.put(route(`productBL.update`, {producto: productData.id}), productData, {
3859
preserveState: true,
3960
onSuccess: () => {
4061
setToast({
4162
show: true,
4263
success: true,
43-
message: "cliente editado correctamente"
64+
message: "producto editado correctamente"
4465
});
66+
// closeModal();
4567
// Refrescar la lista de clientes
4668
// router.visit(route('clientes.index'));
4769
},
@@ -50,7 +72,7 @@ export default function TablaProductosBL({ productos, openModal, search }) {
5072
setToast({
5173
show: true,
5274
success: false,
53-
message: primerError || "Error al editar el cliente"
75+
message: primerError || "Error al editar el producto"
5476
});
5577
},
5678
onFinish: (visit) => {
@@ -153,6 +175,20 @@ export default function TablaProductosBL({ productos, openModal, search }) {
153175
</AgentModalWrapper>
154176
)
155177
}
178+
{toast.show && (
179+
<div className="fixed bottom-6 right-6 z-51">
180+
<Toast>
181+
<div
182+
className={`inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ${
183+
toast.success ? "bg-green-100 text-green-500" : "bg-red-100 text-red-500"
184+
}`}
185+
>
186+
{toast.success ? <HiCheck className="h-5 w-5" /> : <HiX className="h-5 w-5" />}
187+
</div>
188+
<div className="ml-3 text-sm font-normal">{toast.message}</div>
189+
</Toast>
190+
</div>
191+
)}
156192
</>
157193
);
158194
}

resources/js/components/app-sidebar.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ import {
2323
HeadphonesIcon,
2424
Terminal,
2525
CalendarHeart,
26-
ListOrderedIcon
26+
ListOrderedIcon,
27+
BadgeCheck
2728
} from 'lucide-react';
2829
import AppLogo from './app-logo';
2930
import { userHasArea } from '@/components/utils/useAuthUtils';
@@ -102,6 +103,12 @@ const staticNavItems = [
102103
href: '/BLproductosInventario/BLClientes',
103104
icon: SquareUserRound,
104105
proyectosPermitidos: ['Button Lovers', 'AZZU'],
106+
},
107+
{
108+
title: 'Marcacion',
109+
href: '/BLproductosInventario/BLMarcacion',
110+
icon: BadgeCheck,
111+
proyectosPermitidos: ['Button Lovers', 'AZZU'],
105112
}
106113
];
107114

resources/js/pages/BLMarcacion.jsx

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// resources/js/pages/BLHistorico.jsx
2+
3+
import AppLayout from "@/layouts/app-layout";
4+
import { Head } from "@inertiajs/react";
5+
import { useState } from "react";
6+
import { Button } from "flowbite-react";
7+
8+
const breadcrumbs = [
9+
{ title: "Marcacion BL", href: "/BLproductosInventario/BLMarcacion" }
10+
];
11+
12+
export default function MarcadoPage() {
13+
const [marcados, setMarcados] = useState([
14+
{
15+
id: 1,
16+
cliente: "Cliente A",
17+
producto: "Botón 1222 Azul",
18+
trabajador: "Pedro",
19+
fecha: "2025-09-03",
20+
},
21+
{
22+
id: 2,
23+
cliente: "Cliente B",
24+
producto: "Botón 1544 Rojo",
25+
trabajador: "María",
26+
fecha: "2025-09-03",
27+
},
28+
]);
29+
30+
const [nuevo, setNuevo] = useState({
31+
cliente: "",
32+
producto: "",
33+
trabajador: "",
34+
fecha: "",
35+
});
36+
37+
const handleChange = (e) => {
38+
setNuevo({ ...nuevo, [e.target.name]: e.target.value });
39+
};
40+
41+
const agregarMarcado = () => {
42+
if (!nuevo.cliente || !nuevo.producto || !nuevo.trabajador || !nuevo.fecha)
43+
return;
44+
setMarcados([
45+
...marcados,
46+
{ id: marcados.length + 1, ...nuevo },
47+
]);
48+
setNuevo({ cliente: "", producto: "", trabajador: "", fecha: "" });
49+
};
50+
51+
return (
52+
<AppLayout breadcrumbs={breadcrumbs}>
53+
<Head title="Histórico de Productos" />
54+
55+
<div className="p-6 max-w-7xl mx-auto">
56+
<h1 className="text-2xl font-bold mb-6">📋 Registro de Marcado</h1>
57+
58+
<div className="grid grid-cols-1 lg:grid-cols-4 gap-6">
59+
{/* Columna Izquierda: Formulario + Tabla */}
60+
<div className="lg:col-span-3 space-y-6">
61+
{/* Formulario */}
62+
<div className="bg-white dark:bg-gray-800 shadow-md rounded-2xl p-4">
63+
<h2 className="text-lg font-semibold mb-4">Agregar Marcado</h2>
64+
<div className="grid grid-cols-1 md:grid-cols-4 gap-4">
65+
<input
66+
type="text"
67+
name="cliente"
68+
placeholder="Cliente"
69+
value={nuevo.cliente}
70+
onChange={handleChange}
71+
className="border rounded-lg p-2 w-full"
72+
/>
73+
<input
74+
type="text"
75+
name="producto"
76+
placeholder="Producto"
77+
value={nuevo.producto}
78+
onChange={handleChange}
79+
className="border rounded-lg p-2 w-full"
80+
/>
81+
<input
82+
type="text"
83+
name="trabajador"
84+
placeholder="Trabajador"
85+
value={nuevo.trabajador}
86+
onChange={handleChange}
87+
className="border rounded-lg p-2 w-full"
88+
/>
89+
<input
90+
type="date"
91+
name="fecha"
92+
value={nuevo.fecha}
93+
onChange={handleChange}
94+
className="border rounded-lg p-2 w-full"
95+
/>
96+
</div>
97+
<div className="mt-4">
98+
<Button onClick={agregarMarcado}>Agregar</Button>
99+
</div>
100+
</div>
101+
102+
{/* Tabla */}
103+
<div className="overflow-x-auto shadow-md rounded-2xl">
104+
<table className="w-full text-sm text-left text-gray-500 dark:text-gray-400">
105+
<thead className="text-xs uppercase bg-gray-100 dark:bg-gray-700 dark:text-gray-300">
106+
<tr>
107+
<th className="px-4 py-3">Cliente</th>
108+
<th className="px-4 py-3">Producto</th>
109+
<th className="px-4 py-3">Trabajador</th>
110+
<th className="px-4 py-3">Fecha</th>
111+
</tr>
112+
</thead>
113+
<tbody>
114+
{marcados.map((m) => (
115+
<tr
116+
key={m.id}
117+
className="border-b dark:border-gray-600 hover:bg-gray-50 dark:hover:bg-gray-800"
118+
>
119+
<td className="px-4 py-3">{m.cliente}</td>
120+
<td className="px-4 py-3">{m.producto}</td>
121+
<td className="px-4 py-3">{m.trabajador}</td>
122+
<td className="px-4 py-3">{m.fecha}</td>
123+
</tr>
124+
))}
125+
</tbody>
126+
</table>
127+
</div>
128+
</div>
129+
130+
{/* Columna Derecha: Timeline */}
131+
<div className="bg-white dark:bg-gray-800 shadow-md rounded-2xl p-3">
132+
<h2 className="text-base font-semibold mb-3">🕒 Línea de Tiempo</h2>
133+
<ol className="relative border-l border-gray-300 dark:border-gray-700 text-sm">
134+
{marcados.map((m) => (
135+
<li key={m.id} className="mb-6 ml-6">
136+
<span className="absolute w-3 h-3 bg-blue-500 rounded-full -left-1.5 border border-white"></span>
137+
<h3 className="font-medium text-gray-900 dark:text-white">
138+
{m.producto}
139+
</h3>
140+
<time className="block text-xs text-gray-500 dark:text-gray-400">
141+
{m.fecha}
142+
</time>
143+
<p className="mt-1 text-gray-600 dark:text-gray-300 text-xs">
144+
Cliente: <strong>{m.cliente}</strong>
145+
</p>
146+
<p className="text-gray-600 dark:text-gray-300 text-xs">
147+
Trabajador: <strong>{m.trabajador}</strong>
148+
</p>
149+
</li>
150+
))}
151+
</ol>
152+
</div>
153+
</div>
154+
</div>
155+
</AppLayout>
156+
);
157+
}

routes/web.php

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use App\Http\Controllers\SshSessionController;
1010
use App\Http\Controllers\BlProductoController;
1111
use App\Http\Controllers\BlEmpaqueController;
12+
use App\Http\Controllers\BLMarcacionController;
1213
use App\Http\Controllers\BlMovimientoController;
1314
use App\Http\Controllers\BLPedidosController;
1415
use App\Http\Controllers\DashboardController;
@@ -158,20 +159,21 @@
158159

159160
Route::prefix('BLproductosInventario')->group(function () {
160161
Route::get('BLProductos', [BlProductoController::class, 'index'])->name('productos.index');
161-
Route::get('BLAnalisis', [BlProductoController::class, 'indexAnalisis'])->name('analisis.index');
162-
Route::get('BLHistorico', [BlProductoController::class, 'indexHistorico'])->name('historico.index');
163162
Route::get('colores', [BlProductoController::class, 'index'])->name('colores.index');
164-
Route::post('productos', [BlProductoController::class, 'store'])->name('productosBL.store');
165-
Route::post('colores', [BlProductoController::class, 'storeColor'])->name('coloresBL.store');
166-
Route::put('productos/{producto}', [BlProductoController::class, 'update'])->name('productos.update');
167163
Route::get('BLPedidos', [BLPedidosController::class, 'index'])->name('pedidos.index');
168164
Route::get('BLClientes', [BLClientesController::class, 'index'])->name('clientes.index');
165+
Route::get('BLAnalisis', [BlProductoController::class, 'indexAnalisis'])->name('analisis.index');
166+
Route::get('BLHistorico', [BlProductoController::class, 'indexHistorico'])->name('historico.index');
169167
Route::post('clientes', [BLClientesController::class, 'store'])->name('clientesBL.store');
170-
Route::post('cliente/{cliente}', [BLClientesController::class, 'update'])->name('clientesBL.update');
168+
Route::post('productos', [BlProductoController::class, 'store'])->name('productosBL.store');
171169
Route::post('pedidos', [BLPedidosController::class, 'store'])->name('pedidosBL.store');
170+
Route::post('colores', [BlProductoController::class, 'storeColor'])->name('coloresBL.store');
172171
Route::get('BLPedidosShow/{id}', [BLPedidosController::class, 'show'])->name('pedidosBL.show');
173172
Route::get('BLClientesShow/{id}', [BLClientesController::class, 'show'])->name('ClientesBL.show');
174173
Route::get('BLProductShow/{id}', [BlProductoController::class, 'show'])->name('ProductBL.show');
174+
Route::post('cliente/{cliente}', [BLClientesController::class, 'update'])->name('clientesBL.update');
175+
Route::put('productos/{producto}', [BlProductoController::class, 'update'])->name('productBL.update');
176+
Route::get('BLMarcacion', [BLMarcacionController::class, 'index'])->name('marcacion.index');
175177
});
176178
});
177179

0 commit comments

Comments
 (0)