From 37ce8e8afb67592c3c5c7837f9a9e07de6104a0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Faleiros?= Date: Tue, 8 Sep 2026 09:56:25 -0300 Subject: [PATCH] feat: filter cms courses by trail --- pages/SuperAdmin.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pages/SuperAdmin.tsx b/pages/SuperAdmin.tsx index ff294d5..0e25d78 100644 --- a/pages/SuperAdmin.tsx +++ b/pages/SuperAdmin.tsx @@ -85,11 +85,19 @@ const BannerManager: React.FC<{ courses: CourseOption[] }> = ({ courses }) => { }; const CoursesPanel: React.FC<{ courses: CourseOption[]; onManage: () => void }> = ({ courses, onManage }) => { + const [query, setQuery] = useState(''); + const [selectedTrail, setSelectedTrail] = useState('all'); + const trails: string[] = [...new Set(courses.map((course) => course.category))].sort((left, right) => left.localeCompare(right, 'pt-BR')); + const visibleCourses = courses.filter((course) => { + const matchesTrail = selectedTrail === 'all' || course.category === selectedTrail; + const normalized = query.trim().toLocaleLowerCase('pt-BR'); + return matchesTrail && (!normalized || `${course.title} ${course.category}`.toLocaleLowerCase('pt-BR').includes(normalized)); + }); const byTrail: Record = {}; - courses.forEach((course) => { + visibleCourses.forEach((course) => { (byTrail[course.category] ||= []).push(course); }); - return

Cursos

Visualize cada curso pela sua capa e Trilha.

{courses.length === 0 ?

Nenhum curso cadastrado.

:
{Object.entries(byTrail).sort(([a], [b]) => a.localeCompare(b, 'pt-BR')).map(([trail, trailCourses]) =>

{trail}

{trailCourses.length} {trailCourses.length === 1 ? 'curso' : 'cursos'}
{trailCourses.map((course) =>
{course.coverImageUrl ? :
}

{course.title}

{course.status === 'published' ? 'Publicado' : 'Rascunho'}
)}
)}
}
; + return

Cursos

Visualize cada curso pela sua capa e Trilha.

{courses.length === 0 ?

Nenhum curso cadastrado.

: <>
setQuery(event.target.value)} placeholder="Buscar curso" className="min-w-0 flex-1 rounded-xl border border-white/10 bg-zinc-900 px-3 py-2.5 text-sm text-white" />
{visibleCourses.length === 0 ?

Nenhum curso encontrado.

:
{Object.entries(byTrail).sort(([a], [b]) => a.localeCompare(b, 'pt-BR')).map(([trail, trailCourses]) =>

{trail}

{trailCourses.length} {trailCourses.length === 1 ? 'curso' : 'cursos'}
{trailCourses.map((course) =>
{course.coverImageUrl ? :
}

{course.title}

{course.status === 'published' ? 'Publicado' : 'Rascunho'}
)}
)}
}}
; }; const PathManager: React.FC<{ title: string; description: string; paths: LearningPath[]; onNew: () => void; onEdit: (path: LearningPath) => void; onDelete: (path: LearningPath) => void }> = ({ title, description, paths, onNew, onEdit, onDelete }) =>

{title}

{description}

{paths.length === 0 ?
Nenhuma {title.toLowerCase()} criada ainda.
: paths.map((path) =>
{path.coverImageUrl ? : }

{path.title}

{path.courses.length} {path.courses.length === 1 ? 'curso' : 'cursos'} ยท {path.status === 'published' ? 'Publicada' : 'Rascunho'}

)}
;