fix #148: Refactorización para limpieza y generalidad

This commit is contained in:
2026-03-04 14:53:23 -06:00
parent 020caf4e68
commit fa200acbfd

View File

@@ -94,9 +94,10 @@ function DatosGenerales({
}: { }: {
onPersistDato: (clave: string, value: string) => void onPersistDato: (clave: string, value: string) => void
}) { }) {
const { asignaturaId } = useParams({ const { asignaturaId, planId } = useParams({
from: '/planes/$planId/asignaturas/$asignaturaId', from: '/planes/$planId/asignaturas/$asignaturaId',
}) })
const navigate = useNavigate()
const { data: data, isLoading: isLoading } = useSubject(asignaturaId) const { data: data, isLoading: isLoading } = useSubject(asignaturaId)
const updateAsignatura = useUpdateAsignatura() const updateAsignatura = useUpdateAsignatura()
@@ -228,11 +229,29 @@ function DatosGenerales({
clave={key} clave={key}
title={cardTitle} title={cardTitle}
initialContent={currentContent} initialContent={currentContent}
xColumn={xColumn}
placeholder={placeholder} placeholder={placeholder}
description={description} description={description}
onPersist={(clave, value) => onPersistDato(clave, value)} onPersist={({ clave, value }) =>
onOpenEvaluationEditor={openEvaluationEditor} onPersistDato(String(clave ?? key), String(value ?? ''))
}
onClickEditButton={({ startEditing }) => {
switch (xColumn) {
case 'contenido_tematico': {
navigate({
to: '/planes/$planId/asignaturas/$asignaturaId/contenido',
params: { planId, asignaturaId },
})
return
}
case 'criterios_de_evaluacion': {
openEvaluationEditor()
return
}
default: {
startEditing()
}
}
}}
/> />
) )
}, },
@@ -268,8 +287,7 @@ function DatosGenerales({
containerRef={evaluationCardRef} containerRef={evaluationCardRef}
forceEditToken={evaluationForceEditToken} forceEditToken={evaluationForceEditToken}
highlightToken={evaluationHighlightToken} highlightToken={evaluationHighlightToken}
onOpenEvaluationEditor={openEvaluationEditor} onPersist={({ value }) => persistCriteriosEvaluacion(value)}
onPersistEvaluation={persistCriteriosEvaluacion}
/> />
</div> </div>
</div> </div>
@@ -285,13 +303,15 @@ interface InfoCardProps {
initialContent: any initialContent: any
placeholder?: string placeholder?: string
description?: string description?: string
xColumn?: string
required?: boolean // Nueva prop para el asterisco required?: boolean // Nueva prop para el asterisco
type?: 'text' | 'requirements' | 'evaluation' type?: 'text' | 'requirements' | 'evaluation'
onEnhanceAI?: (content: any) => void onEnhanceAI?: (content: any) => void
onPersist?: (clave: string, value: string) => void onPersist?: (payload: {
onPersistEvaluation?: (rows: Array<CriterioEvaluacionRow>) => Promise<void> type: NonNullable<InfoCardProps['type']>
onOpenEvaluationEditor?: () => void clave?: string
value: any
}) => void | Promise<void>
onClickEditButton?: (helpers: { startEditing: () => void }) => void
containerRef?: React.RefObject<HTMLDivElement | null> containerRef?: React.RefObject<HTMLDivElement | null>
forceEditToken?: number forceEditToken?: number
@@ -305,12 +325,10 @@ function InfoCard({
initialContent, initialContent,
placeholder, placeholder,
description, description,
xColumn,
required, required,
type = 'text', type = 'text',
onPersist, onPersist,
onPersistEvaluation, onClickEditButton,
onOpenEvaluationEditor,
containerRef, containerRef,
forceEditToken, forceEditToken,
highlightToken, highlightToken,
@@ -401,15 +419,15 @@ function InfoCard({
) )
setIsEditing(false) setIsEditing(false)
void onPersistEvaluation?.(cleaned) void onPersist?.({ type, clave, value: cleaned })
return return
} }
setData(tempText) setData(tempText)
setIsEditing(false) setIsEditing(false)
if (type === 'text' && clave && onPersist) { if (type === 'text') {
onPersist(clave, String(tempText ?? '')) void onPersist?.({ type, clave, value: String(tempText ?? '') })
} }
} }
@@ -499,22 +517,14 @@ function InfoCard({
size="icon" size="icon"
className="h-8 w-8 text-slate-400" className="h-8 w-8 text-slate-400"
onClick={() => { onClick={() => {
switch (xColumn) { const startEditing = () => setIsEditing(true)
case 'contenido_tematico': {
navigate({ if (onClickEditButton) {
to: '/planes/$planId/asignaturas/$asignaturaId/contenido', onClickEditButton({ startEditing })
params: { planId, asignaturaId: asignaturaId! }, return
})
return
}
case 'criterios_de_evaluacion': {
onOpenEvaluationEditor?.()
return
}
default: {
setIsEditing(true)
}
} }
startEditing()
}} }}
> >
<Pencil className="h-3 w-3" /> <Pencil className="h-3 w-3" />
@@ -537,7 +547,7 @@ function InfoCard({
{evalRows.map((row) => ( {evalRows.map((row) => (
<div <div
key={row.id} key={row.id}
className="grid grid-cols-[1fr_96px_32px] items-center gap-2" className="grid grid-cols-[2fr_1fr_1ch_32px] items-center gap-2"
> >
<Input <Input
value={row.label} value={row.label}
@@ -602,6 +612,13 @@ function InfoCard({
}} }}
/> />
<div
className="flex w-[1ch] items-center justify-center text-sm text-slate-600"
aria-hidden
>
%
</div>
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"