@@ -8,27 +8,20 @@ import {
88import { useState } from 'react' ;
99import { themeByProject } from '../utils/theme' ;
1010import { usePage } from '@inertiajs/react' ;
11- import axios from 'axios' ;
12- import EditarProductForm from './EditProductModal' ;
13- import AgentModalWrapper from '../agentsModalWrapper' ;
1411import { router } from '@inertiajs/react' ;
1512import { Toast } from "flowbite-react" ;
1613import { useEffect } from 'react' ;
1714import { HiCheck , HiX } from "react-icons/hi" ;
1815
19- export default function TablaProductosBL ( ) {
16+ export default function TablaMarcacionBL ( { itemsPedidos , search } ) {
2017 const { props } = usePage ( ) ;
2118 const proyecto = props ?. auth ?. user ?. proyecto || 'AZZU' ;
2219 const theme = themeByProject [ proyecto ] ;
23- const [ productDetail , setProductDetail ] = useState ( null ) ;
24- const [ colores , setColores ] = useState ( null ) ;
25- const [ modalOpenProductEdit , setModalOpenProductEdit ] = useState ( false ) ;
2620 const [ toast , setToast ] = useState ( {
27- show : false ,
28- success : false ,
29- message : "" ,
21+ show : false ,
22+ success : false ,
23+ message : "" ,
3024 } ) ;
31-
3225 useEffect ( ( ) => {
3326 if ( toast . show ) {
3427 const timer = setTimeout ( ( ) => {
@@ -39,86 +32,82 @@ export default function TablaProductosBL() {
3932 }
4033 } , [ toast ] ) ;
4134
42- const openModalEditProduct = async ( id ) => {
43- try {
44- const response = await axios . get ( `BLProductShow/${ id } ` ) ;
45- setProductDetail ( response . data . productDetails ) ;
46- setColores ( response . data . colores ) ;
47- setModalOpenProductEdit ( true ) ;
48- } catch ( error ) {
49- console . error ( "Error al cargar el producto" , error ) ;
50- }
51- }
52- const closeModal = ( ) => {
53- setModalOpenProductEdit ( false ) ;
54- } ;
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 , {
59- preserveState : true ,
60- onSuccess : ( ) => {
61- setToast ( {
62- show : true ,
63- success : true ,
64- message : "producto editado correctamente"
65- } ) ;
66- // closeModal();
67- // Refrescar la lista de clientes
68- // router.visit(route('clientes.index'));
69- } ,
70- onError : ( errors ) => {
71- const primerError = Object . values ( errors ) [ 0 ] ;
72- setToast ( {
73- show : true ,
74- success : false ,
75- message : primerError || "Error al editar el producto"
76- } ) ;
77- } ,
78- onFinish : ( visit ) => {
79- // Si hubo error de servidor (status 500 o más)
80- if ( visit . response ?. status >= 500 ) {
81- const msg = visit . response ?. data ?. message || "Error interno del servidor" ;
82- setToast ( {
83- show : true ,
84- success : false ,
85- message : msg
86- } ) ;
87- }
88- }
89- } ) ;
90- } ;
91-
92- // <th className="px-2 sm:px-4 py-2 sm:py-3">Cliente</th>
93- // <th className="px-2 sm:px-4 py-2 sm:py-3">Pedido</th>
94- // <th className="px-2 sm:px-4 py-2 sm:py-3">Referencia</th>
95- // <th className="px-2 sm:px-4 py-2 sm:py-3">Cantidad</th>
96- // <th className="px-2 sm:px-4 py-2 sm:py-3">Nota</th>
97- // <th className="px-2 sm:px-4 py-2 sm:py-3">Estado</th>
9835 const columns = [
99- { accessorKey : 'cliente' , header : 'cliente' } ,
100- { accessorKey : 'pedido' , header : 'pedido' } ,
101- { accessorKey : 'cantidad' , header : 'cantidad' } ,
36+ { accessorKey : 'pedido.cliente.nombre' , header : 'cliente' } ,
37+ {
38+ header : 'pedido' ,
39+ accessorFn : ( row ) => 'PED #' + ( row . pedido_id ? row . pedido_id : '' ) + ' - ' + ( row . empaque ?. producto ?. descripcion ?? '—' ) ?? '—'
40+ } ,
41+ { accessorKey : 'cantidad_empaques' , header : 'cantidad' } ,
10242 { accessorKey : 'nota' , header : 'nota' } ,
103- { accessorKey : 'estado' , header : 'estado' } ,
10443 {
105- id : 'acciones' ,
106- header : 'Editar Producto' ,
107- cell : ( { row } ) => (
108- < button
109- className = { `${ theme . text } font-medium hover:underline cursor-pointer` }
110- onClick = { ( ) => openModalEditProduct ( row . original . id ) }
111- >
112- Editar
113- </ button >
114- ) ,
44+ header : 'Estado' ,
45+ accessorKey : 'estado' ,
46+ cell : ( { row } ) => {
47+ const value = row . getValue ( "estado" ) ; // estado actual
48+ const itemId = row . original . id ; // ID del item
49+ const handleChange = ( nuevoEstado ) => {
50+ router . patch ( route ( 'bl-historicos.actualizar-estado' , itemId ) , { estado : nuevoEstado } , {
51+ preserveState : true ,
52+ onSuccess : ( ) => {
53+ setToast ( {
54+ show : true ,
55+ success : true ,
56+ message : "Item actualizado correctamente"
57+ } ) ;
58+ // Refrescar la lista de productos
59+ // router.visit(route('productos.index'));
60+ } ,
61+ onError : ( errors ) => {
62+ const primerError = Object . values ( errors ) [ 0 ] ;
63+ setToast ( {
64+ show : true ,
65+ success : false ,
66+ message : primerError || "Error al guardar el estado del item"
67+ } ) ;
68+ } ,
69+ onFinish : ( visit ) => {
70+ // Si hubo error de servidor (status 500 o más)
71+ if ( visit . response ?. status >= 500 ) {
72+ const msg = visit . response ?. data ?. message || "Error interno del servidor" ;
73+ setToast ( {
74+ show : true ,
75+ success : false ,
76+ message : msg
77+ } ) ;
78+ }
79+ }
80+ } ) ;
81+ } ;
82+
83+
84+ return (
85+ < select
86+ value = { value }
87+ onChange = { ( e ) => handleChange ( e . target . value ) }
88+ className = { `px-2 py-1 rounded text-xs font-semibold border
89+ ${ value === "completado" ? "bg-green-100 text-green-800" :
90+ value === "pendiente" ? "bg-red-100 text-red-800" :
91+ "bg-yellow-100 text-yellow-800" }
92+ ` }
93+ >
94+ < option value = "pendiente" > Pendiente</ option >
95+ < option value = "en proceso" > En proceso</ option >
96+ < option value = "completado" > Completado</ option >
97+ </ select >
98+ ) ;
99+ }
115100 } ,
101+ {
102+ header : 'Completado por' ,
103+ accessorFn : row => row . marcaciones ?. [ 0 ] ?. trabajador ?. name ?? 'Sin asignar'
104+ }
116105 ] ;
117106
118107 const [ sorting , setSorting ] = useState ( [ ] ) ;
119108
120109 const table = useReactTable ( {
121- data : productos ,
110+ data : itemsPedidos ,
122111 columns,
123112 state : {
124113 sorting,
@@ -175,25 +164,19 @@ export default function TablaProductosBL() {
175164 ) ) }
176165 </ tbody >
177166 </ table >
178- { modalOpenProductEdit && (
179- < AgentModalWrapper closeModal = { closeModal } >
180- < EditarProductForm onClose = { closeModal } productDetail = { productDetail } onSave = { handleEditarProducto } colores = { colores } />
181- </ AgentModalWrapper >
182- )
183- }
184167 { toast . show && (
185- < div className = "fixed bottom-6 right-6 z-51" >
186- < Toast >
187- < div
188- className = { `inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ${
189- toast . success ? "bg-green-100 text-green-500" : "bg-red-100 text-red-500"
190- } `}
191- >
192- { toast . success ? < HiCheck className = "h-5 w-5" /> : < HiX className = "h-5 w-5" /> }
168+ < div className = "fixed bottom-6 right-6 z-51" >
169+ < Toast >
170+ < div
171+ className = { `inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-lg ${
172+ toast . success ? "bg-green-100 text-green-500" : "bg-red-100 text-red-500"
173+ } `}
174+ >
175+ { toast . success ? < HiCheck className = "h-5 w-5" /> : < HiX className = "h-5 w-5" /> }
176+ </ div >
177+ < div className = "ml-3 text-sm font-normal" > { toast . message } </ div >
178+ </ Toast >
193179 </ div >
194- < div className = "ml-3 text-sm font-normal" > { toast . message } </ div >
195- </ Toast >
196- </ div >
197180 ) }
198181 </ >
199182 ) ;
0 commit comments