Skip to main content

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

1

Open Edital Modal

In the Editais view, click โ€+ Novo Editalโ€ in the top-right corner.
2

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: []
};
3

Add Disciplines

After creating the edital, click โ€+ Adicionar Disciplinaโ€ to add subjects.
4

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: []
};
5

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);
6

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:
1

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
2

Open Bulk Import

In the discipline view, click โ€œImportar em Loteโ€ or similar option.
3

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.
Use โ€œAssuntosโ€ for official syllabus topics and โ€œAulasโ€ for your study materials. This separation keeps your progress tracking accurate.

Build docs developers (and LLMs) love