+
+
Productos
+
+
+
+
+
+ {/* Filters */}
+
+
+
+
+ {isEmpty ? (
+
+
No hay productos.
+
+
+
+
+ ) : (
+
+
+
+
+ | Nombre |
+ Medio |
+ Tipo |
+ Precio base |
+ Activo |
+ |
+
+
+
+ {paged.items.map((p: ProductListItem) => (
+
+ | {p.nombre} |
+ {p.medioId} |
+ {p.productTypeId} |
+ {p.basePrice} |
+
+
+ {p.isActive ? 'Activo' : 'Inactivo'}
+
+ |
+
+
+
+
+
+
+
+ |
+
+ ))}
+
+
+
+ )}
+
+ {/* Pagination */}
+ {totalPages > 1 && (
+
+
+
+ Página {page} de {totalPages}
+
+
+
+ )}
+
+ {/* Create dialog */}
+
+
+ {/* Edit dialog */}
+ {editingProduct && (
+
+ )}
+
+ {/* Deactivate confirmation dialog */}
+ {deactivatingProduct && (
+
+ )}
+
+ )
+}
diff --git a/src/web/src/features/products/types.ts b/src/web/src/features/products/types.ts
new file mode 100644
index 0000000..5ff1369
--- /dev/null
+++ b/src/web/src/features/products/types.ts
@@ -0,0 +1,58 @@
+// PRD-002 — shared types for products feature
+
+export interface ProductListItem {
+ id: number
+ nombre: string
+ medioId: number
+ productTypeId: number
+ rubroId: number | null
+ basePrice: number
+ priceDurationDays: number | null
+ isActive: boolean
+}
+
+export interface ProductDetail {
+ id: number
+ nombre: string
+ medioId: number
+ productTypeId: number
+ rubroId: number | null
+ basePrice: number
+ priceDurationDays: number | null
+ isActive: boolean
+ fechaCreacion: string
+ fechaModificacion: string | null
+}
+
+export interface CreateProductRequest {
+ nombre: string
+ medioId: number
+ productTypeId: number
+ rubroId?: number | null
+ basePrice: number
+ priceDurationDays?: number | null
+}
+
+export interface UpdateProductRequest {
+ nombre: string
+ rubroId?: number | null
+ basePrice: number
+ priceDurationDays?: number | null
+}
+
+export interface PagedResult