Overview
The Editais (Exam Syllabi) module is your central repository for managing civil service exam content. Create exams (editais), add disciplines, define topics, and track your progress through each subject.
Editais are the foundation of the app. Study events, revisions, and analytics all link back to the disciplines and topics defined here.
Core Concepts
Hierarchy
Edital (Exam)
โโโ Disciplina (Discipline/Subject)
โ โโโ Assuntos (Syllabus Topics from official exam)
โ โ โโโ Assunto 1
โ โ โโโ Assunto 2
โ โ โโโ ...
โ โโโ Aulas (Your study materials/lessons)
โ โโโ Aula 1
โ โโโ Aula 2
โ โโโ ...
โโโ Disciplina 2
โโโ ...
Edital : The exam youโre preparing for (e.g., โTRF 2024โ, โINSS 2025โ)
Disciplina : A subject within the exam (e.g., โDireito Constitucionalโ, โMatemรกticaโ)
Assunto : Official syllabus topic from the exam notice
Aula : Your personal study materials (video lessons, PDF chapters, etc.)
Data Structure
Edital Object
{
id : 'edt_1234567890' ,
nome : 'TRF 2ยช Regiรฃo - Juiz Federal' ,
dataProva : '2026-06-15' ,
disciplinas : [
{
id: 'disc_abc' ,
nome: 'Direito Constitucional' ,
icone: 'โ๏ธ' ,
cor: '#3b82f6' ,
assuntos: [
{
id: 'ass_xyz' ,
nome: 'Direitos Fundamentais' ,
concluido: false ,
dataConclusao: null ,
revisoesFetas: [],
adiamentos: 0
}
],
aulas: [
{
id: 'aul_123' ,
nome: 'Aula 01 - Introduรงรฃo' ,
estudada: false ,
fonte: 'Estratรฉgia Concursos' ,
duracao: 90
}
]
}
]
}
Editais Interface
Exam Cards
Main view shows all exams as cards:
// Exam card rendering (views.js - renderEditais function)
state . editais . map ( edital => {
const totalAssuntos = edital . disciplinas . reduce (( s , d ) => s + d . assuntos . length , 0 );
const concluidos = edital . disciplinas . reduce (( s , d ) =>
s + d . assuntos . filter ( a => a . concluido ). length , 0 );
const progresso = totalAssuntos > 0 ? Math . round (( concluidos / totalAssuntos ) * 100 ) : 0 ;
return `
<div class="edital-card">
<h3> ${ edital . nome } </h3>
<div class="progress-bar" style="width: ${ progresso } %"></div>
<p> ${ concluidos } / ${ totalAssuntos } tรณpicos concluรญdos</p>
</div>
` ;
});
Discipline List
Click an exam to view its disciplines:
Icon and color
Discipline name
Progress bar (completed topics / total topics)
Action buttons (Edit, Delete, Open Dashboard)
Creating an Edital
Open Edital Modal
In the Editais view, click โ+ Novo Editalโ in the top-right corner.
Enter Exam Details
Nome : Exam name (e.g., โTRF 2ยช Regiรฃoโ)
Data da Prova : Exam date (optional, used for countdown)
const novoEdital = {
id: 'edt_' + Date . now (),
nome: nomeInput . value . trim (),
dataProva: dataProvaInput . value || null ,
disciplinas: []
};
Add Disciplines
After creating the edital, click โ+ Adicionar Disciplinaโ to add subjects.
Configure Each Discipline
Nome : Subject name
รcone : Emoji icon (choose from picker or type manually)
Cor : Color for visual identification
const novaDisciplina = {
id: 'disc_' + Date . now (),
nome: 'Direito Constitucional' ,
icone: 'โ๏ธ' ,
cor: '#3b82f6' ,
assuntos: [],
aulas: []
};
Add Topics (Assuntos)
Click โ+ Adicionar Assuntoโ within a discipline to add official syllabus topics: const novoAssunto = {
id: 'ass_' + uid (),
nome: 'Direitos Fundamentais - Art. 5ยบ' ,
concluido: false ,
dataConclusao: null ,
revisoesFetas: [],
adiamentos: 0
};
disciplina . assuntos . push ( novoAssunto );
Add Study Materials (Aulas)
Optionally add your personal study materials (video lessons, PDF chapters): const novaAula = {
id: 'aul_' + uid (),
nome: 'Aula 03 - Estratรฉgia Concursos' ,
estudada: false ,
fonte: 'Estratรฉgia Concursos' ,
duracao: 120 // minutes
};
disciplina . aulas . push ( novaAula );
Bulk Import
Import topics from a text list:
Prepare Text List
Copy syllabus topics from the official exam notice, one per line: Direitos Fundamentais
Organizaรงรฃo do Estado
Poderes da Uniรฃo
Controle de Constitucionalidade
Open Bulk Import
In the discipline view, click โImportar em Loteโ or similar option.
Paste and Confirm
Paste your list and click โImportarโ. Each line becomes a new topic: const linhas = textarea . value . split ( ' \n ' ). filter ( l => l . trim ());
linhas . forEach ( linha => {
disciplina . assuntos . push ({
id: 'ass_' + uid (),
nome: linha . trim (),
concluido: false
});
});
Bulk import is ideal for quickly populating a discipline from the official exam syllabus PDF.
Discipline Dashboard
Click on a discipline to open its detailed dashboard:
Progress Overview
Total topics and completion percentage
Study time invested in this discipline
Question performance (correct/wrong)
Topic List
All assuntos with status badges (Pendente, Concluรญdo, Revisรฃo)
Click to view details or mark as complete
Color-coded priority (if using Banca Intelligence)
Lesson List (Aulas)
Personal study materials
Mark as studied
Link to create study events
Getting All Disciplines
The app provides a utility to flatten all disciplines across exams:
// Get all disciplines (logic.js:280-294)
export function getAllDisciplinas () {
if ( _discCache ) return _discCache ;
const result = [];
_discIndex = new Map ();
for ( const edital of state . editais ) {
if ( ! edital . disciplinas ) continue ;
for ( const disc of edital . disciplinas ) {
const entry = { disc , edital };
result . push ( entry );
_discIndex . set ( disc . id , entry );
}
}
_discCache = result ;
return result ;
}
Returns: Array of { disc, edital } objects
Caching: Results are cached for performance. Invalidate with invalidateDiscCache().
Getting a Specific Discipline
// Get discipline by ID (logic.js:296-299)
export function getDisc ( id ) {
if ( ! _discIndex ) getAllDisciplinas ();
return _discIndex . get ( id ) || null ;
}
// Usage example
const discEntry = getDisc ( 'disc_abc' );
if ( discEntry ) {
console . log ( discEntry . disc . nome ); // "Direito Constitucional"
console . log ( discEntry . edital . nome ); // "TRF 2ยช Regiรฃo"
}
Progress Tracking
Topic Completion
Mark topics as complete via Session Registration:
// Auto-completion logic (registro-sessao.js:651-668)
if ( statusTopico === 'finalizado' && discId ) {
const d = getDisc ( discId );
if ( d && assId ) {
const ass = d . disc . assuntos . find ( a => a . id === assId );
if ( ass && ! ass . concluido ) {
ass . concluido = true ;
ass . dataConclusao = todayStr ();
ass . revisoesFetas = []; // Triggers spaced repetition
}
}
}
Lesson Completion
// Mark lesson as studied (registro-sessao.js:654-658)
if ( aulaId ) {
const achadoAula = d . disc . aulas ?. find ( a => a . id === aulaId );
if ( achadoAula && ! achadoAula . estudada ) {
achadoAula . estudada = true ;
}
}
Syllabus Progress Calculation
// Calculate overall progress (logic.js:330-342)
export function getSyllabusProgress () {
let totalAssuntos = 0 ;
let totalConcluidos = 0 ;
state . editais . forEach ( ed => {
ed . disciplinas . forEach ( d => {
totalAssuntos += d . assuntos . length ;
totalConcluidos += d . assuntos . filter ( a => a . concluido ). length ;
});
});
return { totalAssuntos , totalConcluidos };
}
Color and Icon Pickers
Color Palette
// Available colors (views.js:24-28)
export const COLORS = [
'#3b82f6' , '#10b981' , '#f59e0b' , '#ef4444' , '#8b5cf6' ,
'#ec4899' , '#06b6d4' , '#84cc16' , '#f97316' , '#6366f1' ,
'#14b8a6' , '#e11d48' , '#0ea5e9' , '#a855f7' , '#22c55e' ,
'#eab308' , '#d946ef' , '#64748b'
];
Icon Library
// Available icons (views.js:31-35)
export const DISC_ICONS = [
'๐' , '๐' , '๐' , '๐' , '๐' , '๐' , '๐ฌ' , '๐งช' , '๐งฎ' , '๐ป' ,
'๐' , '๐๏ธ' , 'โ๏ธ' , '๐ง ' , '๐ก' , '๐' , '๐ข' , '๐๏ธ' , '๐' , '๐ฏ' ,
'๐ฉบ' , '๐ง' , '๐จ' , '๐ต' , '๐' , '๐ฑ' , '๐ฐ' , '๐ก' , '๐' , '๐ฆ'
];
Best Practices
Create separate editais for each exam youโre preparing for. Donโt mix syllabi from different exams in one edital.
Copy topic names exactly as they appear in the exam notice. This helps when using Banca Intelligence for relevance analysis.
Give each discipline a unique color. This makes the Calendar and Dashboard much easier to read visually.
Track Materials Separately
Use โAssuntosโ for official syllabus topics and โAulasโ for your study materials. This separation keeps your progress tracking accurate.