diff --git a/src/pages/Datastage.jsx b/src/pages/Datastage.jsx index 691f230..5591767 100644 --- a/src/pages/Datastage.jsx +++ b/src/pages/Datastage.jsx @@ -117,6 +117,8 @@ function downloadDatastageFile(id, filename) { export default function Datastage() { const focusKeeperRef = useRef(null); const [datastages, setDatastages] = useState([]); + const [currentPage, setCurrentPage] = useState(1); + const [itemsPerPage, setItemsPerPage] = useState(10); const [selected, setSelected] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); @@ -347,7 +349,7 @@ export default function Datastage() { - {datastages.map(item => ( + {datastages.slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage).map(item => ( {item.id} @@ -415,12 +417,12 @@ export default function Datastage() { @@ -428,6 +430,40 @@ export default function Datastage() { ))} + {/* Paginación */} + {datastages.length > itemsPerPage && ( +
+
+ Mostrando {((currentPage - 1) * itemsPerPage) + 1} a {Math.min(currentPage * itemsPerPage, datastages.length)} de {datastages.length} registros +
+
+ + {Array.from({ length: Math.ceil(datastages.length / itemsPerPage) }, (_, i) => i + 1).map(pageNum => ( + + ))} + + +
+
+ )} {/* Tarjetas para móvil/tablet */}
@@ -497,7 +533,7 @@ export default function Datastage() { disabled={item.procesado} > - +
@@ -509,140 +545,140 @@ export default function Datastage() { {/* Modales */} - {/* Modal de creación - estilo Users/Importers */} - {showCreateModal && ( -
-
- {/* Header */} -
-
-
-
- - - -
-
-

Nuevo Datastage

-

Carga un archivo .zip y asigna un contribuyente

-
-
- -
-
- {/* Content */} -
- {error &&
{error}
} -
- - setForm(f => ({ ...f, archivo: e.target.files[0] }))} required /> -
-
- - setForm(f => ({ ...f, contribuyente: e.target.value }))} required /> -
-
- - -
-
-
-
- )} - - - {/* Modal de edición - estilo Users/Importers */} - {showEditModal && ( -
-
- {/* Header */} -
-
-
-
- - - -
-
-

Editar Datastage

-

Actualiza el archivo o el contribuyente

-
-
- -
-
- {/* Content */} -
- {error &&
{error}
} -
- - setForm(f => ({ ...f, archivo: e.target.files[0] }))} /> -
-
- - setForm(f => ({ ...f, contribuyente: e.target.value }))} required /> -
-
- - -
-
-
-
- )} - - - {/* Modal de eliminación - estilo Users/Importers */} - {showDeleteModal && ( -
-
- {/* Header */} -
-
-
-
- - - -
-
-

Eliminar Datastage

-

Esta acción no se puede deshacer.

-
-
- -
-
- {/* Content */} -
-
- - - -
-

¿Eliminar este datastage?

-

¿Seguro que deseas eliminar este datastage? Esta acción no se puede deshacer.

-
- - -
-
+ {/* Modal de creación - estilo Users/Importers */} + {showCreateModal && ( +
+
+ {/* Header */} +
+
+
+
+ + + +
+
+

Nuevo Datastage

+

Carga un archivo .zip y asigna un contribuyente

- )} + +
+
+ {/* Content */} +
+ {error &&
{error}
} +
+ + setForm(f => ({ ...f, archivo: e.target.files[0] }))} required /> +
+
+ + setForm(f => ({ ...f, contribuyente: e.target.value }))} required /> +
+
+ + +
+
+
+
+ )} + + + {/* Modal de edición - estilo Users/Importers */} + {showEditModal && ( +
+
+ {/* Header */} +
+
+
+
+ + + +
+
+

Editar Datastage

+

Actualiza el archivo o el contribuyente

+
+
+ +
+
+ {/* Content */} +
+ {error &&
{error}
} +
+ + setForm(f => ({ ...f, archivo: e.target.files[0] }))} /> +
+
+ + setForm(f => ({ ...f, contribuyente: e.target.value }))} required /> +
+
+ + +
+
+
+
+ )} + + + {/* Modal de eliminación - estilo Users/Importers */} + {showDeleteModal && ( +
+
+ {/* Header */} +
+
+
+
+ + + +
+
+

Eliminar Datastage

+

Esta acción no se puede deshacer.

+
+
+ +
+
+ {/* Content */} +
+
+ + + +
+

¿Eliminar este datastage?

+

¿Seguro que deseas eliminar este datastage? Esta acción no se puede deshacer.

+
+ + +
+
+
+
+ )} {/* Modal de detalle */} {showDetailModal && selected && (