diff --git a/src/components/asignaturas/detalle/BibliographyItem.tsx b/src/components/asignaturas/detalle/BibliographyItem.tsx index 2560cba..170feb0 100644 --- a/src/components/asignaturas/detalle/BibliographyItem.tsx +++ b/src/components/asignaturas/detalle/BibliographyItem.tsx @@ -1,14 +1,44 @@ -import { useState } from 'react'; -import { Plus, Search, BookOpen, Trash2, Library, Edit3, Save } from 'lucide-react'; -import { Card, CardContent } from '@/components/ui/card'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Textarea } from '@/components/ui/textarea'; -import { Badge } from '@/components/ui/badge'; -import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; -import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '@/components/ui/alert-dialog'; -import { cn } from '@/lib/utils'; +import { useEffect, useState } from 'react' +import { + Plus, + Search, + BookOpen, + Trash2, + Library, + Edit3, + Save, +} from 'lucide-react' +import { Card, CardContent } from '@/components/ui/card' +import { Button } from '@/components/ui/button' +import { Input } from '@/components/ui/input' +import { Textarea } from '@/components/ui/textarea' +import { Badge } from '@/components/ui/badge' +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogTrigger, +} from '@/components/ui/dialog' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from '@/components/ui/alert-dialog' +import { cn } from '@/lib/utils' +import { useSubjectBibliografia } from '@/data/hooks/useSubjects' //import { toast } from 'sonner'; //import { mockLibraryResources } from '@/data/mockMateriaData'; @@ -20,7 +50,7 @@ export const mockLibraryResources = [ editorial: 'MIT Press', anio: 2016, isbn: '9780262035613', - disponible: true + disponible: true, }, { id: 'lib-2', @@ -29,102 +59,154 @@ export const mockLibraryResources = [ editorial: 'Pearson', anio: 2020, isbn: '9780134610993', - disponible: true + disponible: true, }, { id: 'lib-3', titulo: 'Hands-On Machine Learning', autor: 'Aurélien Géron', - editorial: 'O\'Reilly Media', + editorial: "O'Reilly Media", anio: 2019, isbn: '9781492032649', - disponible: false - } -]; + disponible: false, + }, +] // --- Interfaces --- export interface BibliografiaEntry { - id: string; - tipo: 'BASICA' | 'COMPLEMENTARIA'; - cita: string; - fuenteBibliotecaId?: string; - fuenteBiblioteca?: any; + id: string + tipo: 'BASICA' | 'COMPLEMENTARIA' + cita: string + tipo_fuente?: 'MANUAL' | 'BIBLIOTECA' + biblioteca_item_id?: string | null + fuenteBibliotecaId?: string + fuenteBiblioteca?: any } interface BibliografiaTabProps { - bibliografia: BibliografiaEntry[]; - onSave: (bibliografia: BibliografiaEntry[]) => void; - isSaving: boolean; + bibliografia: BibliografiaEntry[] + onSave: (bibliografia: BibliografiaEntry[]) => void + isSaving: boolean } -export function BibliographyItem({ bibliografia, onSave, isSaving }: BibliografiaTabProps) { - const [entries, setEntries] = useState(bibliografia); - const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); - const [isLibraryDialogOpen, setIsLibraryDialogOpen] = useState(false); - const [deleteId, setDeleteId] = useState(null); - const [editingId, setEditingId] = useState(null); - const [newEntryType, setNewEntryType] = useState<'BASICA' | 'COMPLEMENTARIA'>('BASICA'); +export function BibliographyItem({ + bibliografia, + onSave, + isSaving, +}: BibliografiaTabProps) { + const { data: bibliografia2, isLoading: loadinmateria } = + useSubjectBibliografia('9d4dda6a-488f-428a-8a07-38081592a641') + const [entries, setEntries] = useState(bibliografia) + const [isAddDialogOpen, setIsAddDialogOpen] = useState(false) + const [isLibraryDialogOpen, setIsLibraryDialogOpen] = useState(false) + const [deleteId, setDeleteId] = useState(null) + const [editingId, setEditingId] = useState(null) + const [newEntryType, setNewEntryType] = useState<'BASICA' | 'COMPLEMENTARIA'>( + 'BASICA', + ) - const basicaEntries = entries.filter(e => e.tipo === 'BASICA'); - const complementariaEntries = entries.filter(e => e.tipo === 'COMPLEMENTARIA'); + useEffect(() => { + if (bibliografia2 && Array.isArray(bibliografia2)) { + setEntries(bibliografia2) + } else if (bibliografia) { + // Fallback a la prop inicial si la API no devuelve nada + setEntries(bibliografia) + } + }, [bibliografia2, bibliografia]) + + const basicaEntries = entries.filter((e) => e.tipo === 'BASICA') + const complementariaEntries = entries.filter( + (e) => e.tipo === 'COMPLEMENTARIA', + ) + console.log(bibliografia2) const handleAddManual = (cita: string) => { - const newEntry: BibliografiaEntry = { id: `manual-${Date.now()}`, tipo: newEntryType, cita }; - setEntries([...entries, newEntry]); - setIsAddDialogOpen(false); + const newEntry: BibliografiaEntry = { + id: `manual-${Date.now()}`, + tipo: newEntryType, + cita, + } + setEntries([...entries, newEntry]) + setIsAddDialogOpen(false) //toast.success('Referencia manual añadida'); - }; + } - const handleAddFromLibrary = (resource: any, tipo: 'BASICA' | 'COMPLEMENTARIA') => { - const cita = `${resource.autor} (${resource.anio}). ${resource.titulo}. ${resource.editorial}.`; + const handleAddFromLibrary = ( + resource: any, + tipo: 'BASICA' | 'COMPLEMENTARIA', + ) => { + const cita = `${resource.autor} (${resource.anio}). ${resource.titulo}. ${resource.editorial}.` const newEntry: BibliografiaEntry = { id: `lib-ref-${Date.now()}`, tipo, cita, fuenteBibliotecaId: resource.id, fuenteBiblioteca: resource, - }; - setEntries([...entries, newEntry]); - setIsLibraryDialogOpen(false); + } + setEntries([...entries, newEntry]) + setIsLibraryDialogOpen(false) //toast.success('Añadido desde biblioteca'); - }; + } const handleUpdateCita = (id: string, cita: string) => { - setEntries(entries.map(e => e.id === id ? { ...e, cita } : e)); - }; + setEntries(entries.map((e) => (e.id === id ? { ...e, cita } : e))) + } return ( -
+
-

Bibliografía

-

- {basicaEntries.length} básica • {complementariaEntries.length} complementaria +

+ Bibliografía +

+

+ {basicaEntries.length} básica • {complementariaEntries.length}{' '} + complementaria

- + - - e.fuenteBibliotecaId || '')} /> + e.fuenteBibliotecaId || '')} + /> - + - + -
@@ -133,14 +215,16 @@ export function BibliographyItem({ bibliografia, onSave, isSaving }: Bibliografi {/* BASICA */}
-
-

Bibliografía Básica

+
+

+ Bibliografía Básica +

- {basicaEntries.map(entry => ( - ( + setEditingId(entry.id)} onStopEditing={() => setEditingId(null)} @@ -154,14 +238,16 @@ export function BibliographyItem({ bibliografia, onSave, isSaving }: Bibliografi {/* COMPLEMENTARIA */}
-
-

Bibliografía Complementaria

+
+

+ Bibliografía Complementaria +

- {complementariaEntries.map(entry => ( - ( + setEditingId(entry.id)} onStopEditing={() => setEditingId(null)} @@ -177,70 +263,143 @@ export function BibliographyItem({ bibliografia, onSave, isSaving }: Bibliografi ¿Eliminar referencia? - La referencia será quitada del plan de estudios. + + La referencia será quitada del plan de estudios. + Cancelar - { setEntries(entries.filter(e => e.id !== deleteId)); setDeleteId(null); }} className="bg-red-600">Eliminar + { + setEntries(entries.filter((e) => e.id !== deleteId)) + setDeleteId(null) + }} + className="bg-red-600" + > + Eliminar +
- ); + ) } // --- Subcomponentes --- -function BibliografiaCard({ entry, isEditing, onEdit, onStopEditing, onUpdateCita, onDelete }: any) { - const [localCita, setLocalCita] = useState(entry.cita); +function BibliografiaCard({ + entry, + isEditing, + onEdit, + onStopEditing, + onUpdateCita, + onDelete, +}: any) { + const [localCita, setLocalCita] = useState(entry.cita) return ( - +
- -
+ +
{isEditing ? (
-