diff --git a/pages/ManageCourses.tsx b/pages/ManageCourses.tsx index 9983fc6..8289935 100644 --- a/pages/ManageCourses.tsx +++ b/pages/ManageCourses.tsx @@ -634,7 +634,7 @@ const CourseModal: React.FC<{
@@ -745,7 +745,7 @@ const CourseModal: React.FC<{
- +
@@ -970,7 +970,7 @@ export const ManageCourses: React.FC = () => { const handleDuplicate = async (id: string) => { try { await duplicateCourse(id); - showToast('Cópia criada como rascunho.', 'success'); + showToast('Cópia criada como não publicada.', 'success'); loadData(); } catch (error) { showToast(error instanceof Error ? error.message : 'Não foi possível duplicar este curso.', 'error'); @@ -1123,7 +1123,7 @@ export const ManageCourses: React.FC = () => {
{course.category}
- {course.status === 'draft' &&
Rascunho
} + {course.status === 'draft' &&
Não publicado
} {/* Body */} diff --git a/pages/SuperAdmin.tsx b/pages/SuperAdmin.tsx index 9a44fab..f863b46 100644 --- a/pages/SuperAdmin.tsx +++ b/pages/SuperAdmin.tsx @@ -59,17 +59,17 @@ export const SuperAdmin: React.FC = () => { ; }; -const ContentPanel: React.FC<{ paths: LearningPath[]; homeConfiguration: HomeConfiguration | null; categories: Array<{ id: string; name: string; position: number; isActive: boolean }>; homeCourses: CourseOption[]; newCategory: string; setNewCategory: (value: string) => void; setHomeConfiguration: React.Dispatch>; onCreateCategory: (event: React.FormEvent) => void; onToggleCategory: (category: { id: string; name: string; position: number; isActive: boolean }) => void; onMoveHomeCourse: (courseId: string, direction: -1 | 1) => void; onSaveHome: () => void; onNewPath: () => void; onEditPath: (path: LearningPath) => void; onDeletePath: (path: LearningPath) => void }> = ({ paths, homeConfiguration, categories, homeCourses, newCategory, setNewCategory, setHomeConfiguration, onCreateCategory, onToggleCategory, onMoveHomeCourse, onSaveHome, onNewPath, onEditPath, onDeletePath }) => <>

Formações

Uma sequência ordenada de cursos existentes.

{paths.length === 0 ?
Nenhuma formação criada ainda.
: paths.map((path) =>
{path.coverImageUrl ? : }

{path.title}

{path.status === 'published' ? 'Publicada' : 'Rascunho'}

{path.courses.length} {path.courses.length === 1 ? 'curso' : 'cursos'}

)}

Página inicial

Escolha o curso do banner e a ordem da vitrine de cursos.

{homeConfiguration &&

Ordem da vitrine

{homeCourses.map((course, index) =>
{index + 1}{course.title}
)}
}

Categorias de cursos

Aparecem no editor de cursos e na biblioteca.

setNewCategory(event.target.value)} placeholder="Nome da nova categoria" className="min-w-0 flex-1 rounded-xl border border-white/10 bg-zinc-900 px-3 py-2.5 text-sm text-white" />
{categories.map((category) => )}
; +const ContentPanel: React.FC<{ paths: LearningPath[]; homeConfiguration: HomeConfiguration | null; categories: Array<{ id: string; name: string; position: number; isActive: boolean }>; homeCourses: CourseOption[]; newCategory: string; setNewCategory: (value: string) => void; setHomeConfiguration: React.Dispatch>; onCreateCategory: (event: React.FormEvent) => void; onToggleCategory: (category: { id: string; name: string; position: number; isActive: boolean }) => void; onMoveHomeCourse: (courseId: string, direction: -1 | 1) => void; onSaveHome: () => void; onNewPath: () => void; onEditPath: (path: LearningPath) => void; onDeletePath: (path: LearningPath) => void }> = ({ paths, homeConfiguration, categories, homeCourses, newCategory, setNewCategory, setHomeConfiguration, onCreateCategory, onToggleCategory, onMoveHomeCourse, onSaveHome, onNewPath, onEditPath, onDeletePath }) => <>

Formações

Uma sequência ordenada de cursos existentes.

{paths.length === 0 ?
Nenhuma formação criada ainda.
: paths.map((path) =>
{path.coverImageUrl ? : }

{path.title}

{path.status === 'published' ? 'Publicado' : 'Não publicado'}

{path.courses.length} {path.courses.length === 1 ? 'curso' : 'cursos'}

)}

Página inicial

Escolha o curso do banner e a ordem da vitrine de cursos.

{homeConfiguration &&

Ordem da vitrine

{homeCourses.map((course, index) =>
{index + 1}{course.title}
)}
}

Categorias de cursos

Aparecem no editor de cursos e na biblioteca.

setNewCategory(event.target.value)} placeholder="Nome da nova categoria" className="min-w-0 flex-1 rounded-xl border border-white/10 bg-zinc-900 px-3 py-2.5 text-sm text-white" />
{categories.map((category) => )}
; const PeoplePanel: React.FC<{ users: ManagedUser[]; isLoading: boolean; query: string; setQuery: (value: string) => void; accessLink: string; inviteEmail: string; setInviteEmail: (value: string) => void; inviteRole: 'student' | 'instructor'; setInviteRole: (value: 'student' | 'instructor') => void; selectedUser: ManagedUserDetail | null; setSelectedUser: (user: ManagedUserDetail | null) => void; updatingUserId: string | null; loadingDetailId: string | null; currentUserId?: string; onInvite: (event: React.FormEvent) => void; onUpdateUser: (account: ManagedUser, update: Partial>) => void; onShowDetail: (account: ManagedUser) => void; onResetPassword: (account: ManagedUser) => void; onExport: () => void }> = ({ users, isLoading, query, setQuery, accessLink, inviteEmail, setInviteEmail, inviteRole, setInviteRole, selectedUser, setSelectedUser, updatingUserId, loadingDetailId, currentUserId, onInvite, onUpdateUser, onShowDetail, onResetPassword, onExport }) => <>

Convidar usuário

setInviteEmail(event.target.value)} placeholder="E-mail do convidado" className="flex-1 rounded-xl bg-zinc-900 border border-white/10 px-4 py-2.5 text-sm text-white" />
{accessLink &&
}
{selectedUser &&

Detalhes do usuário

{selectedUser.name}

{selectedUser.email} · {roleLabel[selectedUser.role]}

}

Usuários

setQuery(event.target.value)} placeholder="Buscar por nome ou e-mail" className="w-full sm:w-80 rounded-xl bg-zinc-900 border border-white/10 px-4 py-2.5 text-sm text-white" />
{isLoading ?
:
{users.map((account) => { const isCurrentUser = account.id === currentUserId; const isUpdating = updatingUserId === account.id; return ; })}
UsuárioPerfilStatusCadastroAções
{account.name}
{account.email}
{new Intl.DateTimeFormat('pt-BR').format(new Date(account.createdAt))}
}
; -const PathEditor: React.FC<{ input: LearningPathInput; setInput: React.Dispatch>; courses: CourseOption[]; selectedCourses: CourseOption[]; editing: boolean; isSaving: boolean; isUploadingCover: boolean; coverInputRef: React.RefObject; onClose: () => void; onSave: (event: React.FormEvent) => void; onUpload: (file: File) => void; onToggleCourse: (id: string) => void; onMoveCourse: (id: string, direction: -1 | 1) => void }> = ({ input, setInput, courses, selectedCourses, editing, isSaving, isUploadingCover, coverInputRef, onClose, onSave, onUpload, onToggleCourse, onMoveCourse }) =>

Formação

{editing ? 'Editar formação' : 'Nova formação'}

Organize cursos existentes na ordem em que os alunos devem assisti-los.

{ const file = event.target.files?.[0]; if (file) onUpload(file); event.currentTarget.value = ''; }} /> setInput((current) => ({ ...current, title: event.target.value }))} placeholder="Ex.: Formação em Tráfego Pago" className="input" />