Em português, nas cores branca, preta e cinza. Cria e com todas as dependências implementadas. Rodando local. <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Gestão de Casos Penais - Juiz</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> <style> :root { --primary-color: #2c3e50; --secondary-color: #3498db; --accent-color: #e74c3c; --light-color: #ecf0f1; --dark-color: #2c3e50; } body { background-color: #f8f9fa; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } .sidebar { background: linear-gradient(180deg, var(--primary-color), #1a2530); color: white; height: 100vh; position: fixed; padding-top: 20px; } .main-content { margin-left: 250px; } .header { background: white; box-shadow: 0 2px 10px rgba(0,0,0,0.1); padding: 15px 30px; } .card-custom { border-radius: 10px; box-shadow: 0 4px 15px rgba(0,0,0,0.08); transition: transform 0.3s ease; border: none; margin-bottom: 20px; } .card-custom:hover { transform: translateY(-5px); box-shadow: 0 6px 20px rgba(0,0,0,0.15); } .status-badge { padding: 5px 12px; border-radius: 20px; font-size: 0.85em; font-weight: 500; } .status-em-andamento { background-color: #fff3cd; color: #856404; } .status-concluido { background-color: #d4edda; color: #155724; } .status-arquivado { background-color: #f8d7da; color: #721c24; } .status-aguardando { background-color: #cce7ff; color: #004085; } .priority-high { color: #e74c3c; } .priority-medium { color: #f39c12; } .priority-low { color: #27ae60; } .btn-custom { border-radius: 30px; padding: 8px 20px; font-weight: 500; } .table th { border-top: none; font-weight: 600; } .stat-card { text-align: center; padding: 20px; border-radius: 10px; color: white; } .stat-card i { font-size: 2.5rem; margin-bottom: 15px; } .chart-container { background: white; border-radius: 10px; padding: 20px; box-shadow: 0 4px 15px rgba(0,0,0,0.08); height: 300px; } .sidebar .nav-link { color: rgba(255,255,255,0.8); padding: 12px 20px; margin: 5px 15px; border-radius: 5px; transition: all 0.3s; } .sidebar .nav-link:hover, .sidebar .nav-link.active { background-color: rgba(255,255,255,0.1); color: white; } .sidebar .nav-link i { margin-right: 10px; width: 20px; text-align: center; } .section-title { border-bottom: 2px solid var(--secondary-color); padding-bottom: 10px; margin-bottom: 20px; color: var(--dark-color); } .practice-card { background: white; border-radius: 10px; padding: 20px; margin-bottom: 15px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); border-left: 4px solid var(--secondary-color); } .practice-card h5 { color: var(--primary-color); } .notification-badge { position: absolute; top: 5px; right: 5px; background-color: var(--accent-color); color: white; border-radius: 50%; width: 20px; height: 20px; font-size: 0.7rem; display: flex; align-items: center; justify-content: center; } </style> </head> <body> <div class="container-fluid"> <div class="row"> <!-- Sidebar --> <nav class="col-md-3 col-lg-2 d-md-block sidebar collapse"> <div class="position-sticky pt-3"> <div class="text-center mb-4"> <h4><i class="fas fa-gavel me-2"></i>Sistema Penal</h4> <p class="text-muted small">Gestão Judicial</p> </div> <ul class="nav flex-column"> <li class="nav-item"> <a class="nav-link active" href="#dashboard"> <i class="fas fa-tachometer-alt"></i> Dashboard </a> </li> <li class="nav-item"> <a class="nav-link" href="#casos"> <i class="fas fa-balance-scale"></i> Casos Penais </a> </li> <li class="nav-item"> <a class="nav-link" href="#audiencias"> <i class="fas fa-calendar-alt"></i> Audiências </a> </li> <li class="nav-item"> <a class="nav-link" href="#praticas"> <i class="fas fa-lightbulb"></i> Melhores Práticas </a> </li> <li class="nav-item"> <a class="nav-link" href="#relatorios"> <i class="fas fa-chart-bar"></i> Relatórios </a> </li> </ul> </div> </nav> <!-- Main Content --> <main class="col-md-9 ms-sm-auto col-lg-10 px-md-4 main-content"> <!-- Header --> <div class="header d-flex justify-content-between align-items-center"> <h2 class="mb-0">Gestão de Casos Penais</h2> <div class="d-flex align-items-center"> <div class="position-relative me-4"> <i class="fas fa-bell fa-lg"></i> <span class="notification-badge">3</span> </div> <div> <span class="fw-bold">Juiz Carlos Silva</span><br> <small class="text-muted">Tribunal de Justiça</small> </div> </div> </div> <!-- Dashboard --> <section id="dashboard" class="my-4"> <h3 class="section-title">Dashboard</h3> <div class="row mb-4"> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #3498db, #1a5276);"> <i class="fas fa-balance-scale"></i> <h4 id="total-cases">0</h4> <p>Total de Casos</p> </div> </div> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #2ecc71, #27ae60);"> <i class="fas fa-check-circle"></i> <h4 id="completed-cases">0</h4> <p>Casos Concluídos</p> </div> </div> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #f39c12, #d35400);"> <i class="fas fa-clock"></i> <h4 id="pending-cases">0</h4> <p>Em Andamento</p> </div> </div> <div class="col-md-3"> <div class="stat-card" style="background: linear-gradient(135deg, #e74c3c, #c0392b);"> <i class="fas fa-calendar-alt"></i> <h4 id="today-hearings">0</h4> <p>Audiências Hoje</p> </div> </div> </div> <div class="row"> <div class="col-md-8"> <div class="chart-container"> <h5>Distribuição de Casos por Status</h5> <canvas id="casesChart"></canvas> </div> </div> <div class="col-md-4"> <div class="chart-container"> <h5>Prioridade dos Casos</h5> <canvas id="priorityChart"></canvas> </div> </div> </div> </section> <!-- Casos Penais --> <section id="casos" class="my-4"> <div class="d-flex justify-content-between align-items-center mb-3"> <h3 class="section-title">Casos Penais</h3> <button class="btn btn-primary btn-custom" data-bs-toggle="modal" data-bs-target="#addCaseModal"> <i class="fas fa-plus me-2"></i>Novo Caso </button> </div> <div class="row" id="cases-container"> <!-- Casos serão carregados aqui --> </div> </section> <!-- Audiências --> <section id="audiencias" class="my-4"> <div class="d-flex justify-content-between align-items-center mb-3"> <h3 class="section-title">Audiências</h3> <button class="btn btn-success btn-custom" data-bs-toggle="modal" data-bs-target="#addHearingModal"> <i class="fas fa-plus me-2"></i>Nova Audiência </button> </div> <div class="table-responsive"> <table class="table table-hover"> <thead> <tr> <th>Data/Hora</th> <th>Processo</th> <th>Partes</th> <th>Tipo</th> <th>Status</th> <th>Ações</th> </tr> </thead> <tbody id="hearings-table"> <!-- Audiências serão carregadas aqui --> </tbody> </table> </div> </section> <!-- Melhores Práticas --> <section id="praticas" class="my-4"> <h3 class="section-title">Melhores Práticas</h3> <div class="row"> <div class="col-md-6"> <div class="practice-card"> <h5><i class="fas fa-file-alt me-2"></i>Documentação Completa</h5> <p>Mantenha toda a documentação do processo organizada e atualizada. Isso facilita a tomada de decisões e evita atrasos.</p> </div> <div class="practice-card"> <h5><i class="fas fa-users me-2"></i>Comunicação Clara</h5> <p>Estabeleça canais de comunicação eficazes com promotores, defensores e demais partes envolvidas no processo.</p> </div> </div> <div class="col-md-6"> <div class="practice-card"> <h5><i class="fas fa-clock me-2"></i>Pontualidade</h5> <p>Cumpra rigorosamente os prazos processuais e horários das audiências para garantir a eficiência do sistema.</p> </div> <div class="practice-card"> <h5><i class="fas fa-search me-2"></i>Análise Detalhada</h5> <p>Analise cuidadosamente todas as provas e depoimentos antes de tomar decisões que impactam a vida das pessoas.</p> </div> </div> </div> </section> </main> </div> </div> <!-- Modal Adicionar Caso --> <div class="modal fade" id="addCaseModal" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Adicionar Novo Caso</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <form id="case-form"> <div class="mb-3"> <label for="case-number" class="form-label">Número do Processo</label> <input type="text" class="form-control" id="case-number" required> </div> <div class="mb-3"> <label for="case-title" class="form-label">Título do Caso</label> <input type="text" class="form-control" id="case-title" required> </div> <div class="mb-3"> <label for="case-description" class="form-label">Descrição</label> <textarea class="form-control" id="case-description" rows="3"></textarea> </div> <div class="mb-3"> <label for="case-priority" class="form-label">Prioridade</label> <select class="form-select" id="case-priority"> <option value="alta">Alta</option> <option value="media" selected>Média</option> <option value="baixa">Baixa</option> </select> </div> <div class="mb-3"> <label for="case-status" class="form-label">Status</label> <select class="form-select" id="case-status"> <option value="em-andamento" selected>Em Andamento</option> <option value="concluido">Concluído</option> <option value="arquivado">Arquivado</option> <option value="aguardando">Aguardando</option> </select> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button> <button type="button" class="btn btn-primary" id="save-case-btn">Salvar Caso</button> </div> </div> </div> </div> <!-- Modal Adicionar Audiência --> <div class="modal fade" id="addHearingModal" tabindex="-1"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Agendar Nova Audiência</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <form id="hearing-form"> <div class="mb-3"> <label for="hearing-case" class="form-label">Processo</label> <select class="form-select" id="hearing-case" required> <option value="">Selecione um processo</option> <!-- Opções serão carregadas dinamicamente --> </select> </div> <div class="mb-3"> <label for="hearing-date" class="form-label">Data</label> <input type="date" class="form-control" id="hearing-date" required> </div> <div class="mb-3"> <label for="hearing-time" class="form-label">Hora</label> <input type="time" class="form-control" id="hearing-time" required> </div> <div class="mb-3"> <label for="hearing-type" class="form-label">Tipo de Audiência</label> <select class="form-select" id="hearing-type"> <option value="instrucao">Instrução Processual</option> <option value="julgamento">Julgamento</option> <option value="conciliacao">Conciliação</option> <option value="outras">Outras</option> </select> </div> <div class="mb-3"> <label for="hearing-parties" class="form-label">Partes Envolvidas</label> <input type="text" class="form-control" id="hearing-parties" placeholder="Promotor, Defensor, Réu..."> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button> <button type="button" class="btn btn-success" id="save-hearing-btn">Agendar Audiência</button> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> // Dados iniciais let cases = JSON.parse(localStorage.getItem('cases')) || []; let hearings = JSON.parse(localStorage.getItem('hearings')) || []; // Função para salvar dados no localStorage function saveData() { localStorage.setItem('cases', JSON.stringify(cases)); localStorage.setItem('hearings', JSON.stringify(hearings)); renderData(); } // Função para gerar ID único function generateId() { return Date.now().toString(36) + Math.random().toString(36).substr(2); } // Função para formatar data function formatDate(dateString) { const options = { year: 'numeric', month: '2-digit', day: '2-digit' }; return new Date(dateString).toLocaleDateString('pt-BR', options); } // Função para renderizar casos function renderCases() { const container = document.getElementById('cases-container'); container.innerHTML = ''; cases.forEach(caseItem => { const caseElement = document.createElement('div'); caseElement.className = 'col-md-6 col-lg-4'; caseElement.innerHTML = ` <div class="card card-custom"> <div class="card-body"> <div class="d-flex justify-content-between align-items-start"> <h5 class="card-title">${caseItem.title} <i class="fas fa-circle"></i></span> </div> <p class="card-text text-muted small">${caseItem.number} ${caseItem.description || 'Sem descrição'}</p> <div class="d-flex justify-content-between align-items-center"> <span class="status-badge status-${caseItem.status.replace(' ', '-')}"> ${caseItem.status === 'em-andamento' ? 'Em Andamento' : caseItem.status === 'concluido' ? 'Concluído' : caseItem.status === 'arquivado' ? 'Arquivado' : 'Aguardando'} </span> <div> <button class="btn btn-sm btn-outline-primary me-1" onclick="editCase('${caseItem.id}')"> <i class="fas fa-trash"></i> </button> </div> </div> </div> </div> `; container.appendChild(caseElement); }); } // Função para renderizar audiências function renderHearings() { const tbody = document.getElementById('hearings-table'); tbody.innerHTML = ''; hearings.forEach(hearing => { const caseItem = cases.find(c => c.id === hearing.caseId); const row = document.createElement('tr'); row.innerHTML = ` <td>${formatDate(hearing.date)} ${hearing.time}</td> <td>${caseItem ? caseItem.number : 'Processo não encontrado'} ${hearing.parties || 'Não especificado'}</td> <td>${hearing.type === 'instrucao' ? 'Instrução Processual' : hearing.type === 'julgamento' ? 'Julgamento' : hearing.type === 'conciliacao' ? 'Conciliação' : 'Outras'} Agendada<i class="fas fa-edit"></i> </button> <button class="btn btn-sm btn-outline-danger" onclick="deleteHearing('${hearing.id}')"> `; tbody.appendChild(row); }); } // Função para atualizar estatísticas function updateStats() { document.getElementById('total-cases').textContent = cases.length; const completedCases = cases.filter(c => c.status === 'concluido').length; document.getElementById('completed-cases').textContent = completedCases; const pendingCases = cases.filter(c => c.status === 'em-andamento').length; document.getElementById('pending-cases').textContent = pendingCases; const today = new Date().toISOString().split('T')[0]; const todayHearings = hearings.filter(h => h.date === today).length; document.getElementById('today-hearings').textContent = todayHearings; } // Função para renderizar gráficos function renderCharts() { // Gráfico de status dos casos const statusCtx = document.getElementById('casesChart').getContext('2d'); new Chart(statusCtx, { type: 'doughnut', data: { labels: ['Em Andamento', 'Concluídos', 'Arquivados', 'Aguardando'], datasets: [{ data: [ cases.filter(c => c.status === 'em-andamento').length, cases.filter(c => c.status === 'concluido').length, cases.filter(c => c.status === 'arquivado').length, cases.filter(c => c.status === 'aguardando').length ], backgroundColor: ['#3498db', '#2ecc71', '#e74c3c', '#f39c12'] }] }, options: { responsive: true, maintainAspectRatio: false } }); // Gráfico de prioridade const priorityCtx = document.getElementById('priorityChart').getContext('2d'); new Chart(priorityCtx, { type: 'pie', data: { labels: ['Alta', 'Média', 'Baixa'], datasets: [{ data: [ cases.filter(c => c.priority === 'alta').length, cases.filter(c => c.priority === 'media').length, cases.filter(c => c.priority === 'baixa').length ], backgroundColor: ['#e74c3c', '#f39c12', '#27ae60'] }] }, options: { responsive: true, maintainAspectRatio: false } }); } // Função para popular select de casos function populateCaseSelect() { const select = document.getElementById('hearing-case'); select.innerHTML = ' Selecione um processo '; cases.forEach(caseItem => { const option = document.createElement('option'); option.value = caseItem.id; option.textContent = `${caseItem.number} - ${caseItem.title}`; select.appendChild(option); }); } // Função para renderizar todos os dados function renderData() { renderCases(); renderHearings(); updateStats(); renderCharts(); populateCaseSelect(); } // Event Listeners document.getElementById('save-case-btn').addEventListener('click', function() { const number = document.getElementById('case-number').value; const title = document.getElementById('case-title').value; const description = document.getElementById('case-description').value; const priority = document.getElementById('case-priority').value; const status = document.getElementById('case-status').value; if (number && title) { const newCase = { id: generateId(), number: number, title: title, description: description, priority: priority, status: status, createdAt: new Date().toISOString() }; cases.push(newCase); saveData(); // Limpar formulário document.getElementById('case-form').reset(); bootstrap.Modal.getInstance(document.getElementById('addCaseModal')).hide(); } }); document.getElementById('save-hearing-btn').addEventListener('click', function() { const caseId = document.getElementById('hearing-case').value; const date = document.getElementById('hearing-date').value; const time = document.getElementById('hearing-time').value; const type = document.getElementById('hearing-type').value; const parties = document.getElementById('hearing-parties').value; if (caseId && date && time) { const newHearing = { id: generateId(), caseId: caseId, date: date, time: time, type: type, parties: parties }; hearings.push(newHearing); saveData(); // Limpar formulário document.getElementById('hearing-form').reset(); bootstrap.Modal.getInstance(document.getElementById('addHearingModal')).hide(); } }); // Funções para editar e deletar (simplificadas) function editCase(id) { alert('Função de edição em desenvolvimento'); } function deleteCase(id) { if (confirm('Tem certeza que deseja excluir este caso?')) { cases = cases.filter(c => c.id !== id); hearings = hearings.filter(h => h.caseId !== id); saveData(); } } function editHearing(id) { alert('Função de edição em desenvolvimento'); } function deleteHearing(id) { if (confirm('Tem certeza que deseja excluir esta audiência?')) { hearings = hearings.filter(h => h.id !== id); saveData(); } } // Inicialização document.addEventListener('DOMContentLoaded', function() { // Adicionar dados de exemplo se não houver dados if (cases.length === 0) { cases = [ { id: generateId(), number: '0012345-67.2023.8.26.0001', title: 'Homicídio Qualificado', description: 'Crime de homicídio qualificado ocorrido em 15/03/2023', priority: 'alta', status: 'em-andamento', createdAt: new Date().toISOString() }, { id: generateId(), number: '0023456-78.2023.8.26.0002', title: 'Furto Qualificado', description: 'Furto em estabelecimento comercial', priority: 'media', status: 'aguardando', createdAt: new Date().toISOString() }, { id: generateId(), number: '0034567-89.2023.8.26.0003', title: 'Tráfico de Drogas', description: 'Organização criminosa envolvida em tráfico de entorpecentes', priority: 'alta', status: 'em-andamento', createdAt: new Date().toISOString() } ]; } if (hearings.length === 0) { hearings = [ { id: generateId(), caseId: cases[0].id, date: new Date(Date.now() + 86400000).toISOString().split('T')[0], time: '10:00', type: 'instrucao', parties: 'Promotor, Defensor Público' }, { id: generateId(), caseId: cases[2].id, date: new Date(Date.now() + 172800000).toISOString().split('T')[0], time: '14:30', type: 'julgamento', parties: 'Promotor, Defesa Técnica' } ]; } saveData(); }); </script> </body> </html> - Initial Deployment
Browse files- README.md +7 -5
- index.html +542 -19
README.md
CHANGED
@@ -1,10 +1,12 @@
|
|
1 |
---
|
2 |
-
title:
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: static
|
7 |
pinned: false
|
|
|
|
|
8 |
---
|
9 |
|
10 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
1 |
---
|
2 |
+
title: testegestor
|
3 |
+
emoji: 🐳
|
4 |
+
colorFrom: green
|
5 |
+
colorTo: yellow
|
6 |
sdk: static
|
7 |
pinned: false
|
8 |
+
tags:
|
9 |
+
- deepsite
|
10 |
---
|
11 |
|
12 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
index.html
CHANGED
@@ -1,19 +1,542 @@
|
|
1 |
-
<!
|
2 |
-
<html>
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!DOCTYPE html>
|
2 |
+
<html lang="pt-BR">
|
3 |
+
<head>
|
4 |
+
<meta charset="UTF-8">
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
6 |
+
<title>Gestão de Casos Penais - Juiz</title>
|
7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
8 |
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
9 |
+
<style>
|
10 |
+
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap');
|
11 |
+
|
12 |
+
body {
|
13 |
+
font-family: 'Open Sans', sans-serif;
|
14 |
+
}
|
15 |
+
|
16 |
+
.status-badge {
|
17 |
+
padding: 0.25rem 0.75rem;
|
18 |
+
border-radius: 9999px;
|
19 |
+
font-size: 0.75rem;
|
20 |
+
font-weight: 600;
|
21 |
+
}
|
22 |
+
|
23 |
+
.status-em-andamento { background-color: #e5e7eb; color: #4b5563; }
|
24 |
+
.status-concluido { background-color: #d1d5db; color: #1f2937; }
|
25 |
+
.status-arquivado { background-color: #9ca3af; color: #111827; }
|
26 |
+
.status-aguardando { background-color: #f3f4f6; color: #6b7280; }
|
27 |
+
|
28 |
+
.priority-high { color: #ef4444; }
|
29 |
+
.priority-medium { color: #f59e0b; }
|
30 |
+
.priority-low { color: #10b981; }
|
31 |
+
|
32 |
+
.sidebar {
|
33 |
+
transition: all 0.3s ease;
|
34 |
+
}
|
35 |
+
|
36 |
+
.sidebar-link {
|
37 |
+
transition: all 0.2s ease;
|
38 |
+
}
|
39 |
+
|
40 |
+
.sidebar-link:hover, .sidebar-link.active {
|
41 |
+
background-color: rgba(255, 255, 255, 0.1);
|
42 |
+
}
|
43 |
+
|
44 |
+
.card-hover {
|
45 |
+
transition: transform 0.2s ease, box-shadow 0.2s ease;
|
46 |
+
}
|
47 |
+
|
48 |
+
.card-hover:hover {
|
49 |
+
transform: translateY(-2px);
|
50 |
+
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
|
51 |
+
}
|
52 |
+
|
53 |
+
.stat-card {
|
54 |
+
transition: transform 0.2s ease;
|
55 |
+
}
|
56 |
+
|
57 |
+
.stat-card:hover {
|
58 |
+
transform: translateY(-3px);
|
59 |
+
}
|
60 |
+
|
61 |
+
.section-title {
|
62 |
+
position: relative;
|
63 |
+
padding-bottom: 0.5rem;
|
64 |
+
}
|
65 |
+
|
66 |
+
.section-title::after {
|
67 |
+
content: '';
|
68 |
+
position: absolute;
|
69 |
+
bottom: 0;
|
70 |
+
left: 0;
|
71 |
+
width: 3rem;
|
72 |
+
height: 2px;
|
73 |
+
background-color: #6b7280;
|
74 |
+
}
|
75 |
+
|
76 |
+
.practice-card {
|
77 |
+
border-left: 4px solid #6b7280;
|
78 |
+
}
|
79 |
+
|
80 |
+
/* Custom scrollbar */
|
81 |
+
::-webkit-scrollbar {
|
82 |
+
width: 8px;
|
83 |
+
}
|
84 |
+
|
85 |
+
::-webkit-scrollbar-track {
|
86 |
+
background: #f1f1f1;
|
87 |
+
}
|
88 |
+
|
89 |
+
::-webkit-scrollbar-thumb {
|
90 |
+
background: #9ca3af;
|
91 |
+
border-radius: 4px;
|
92 |
+
}
|
93 |
+
|
94 |
+
::-webkit-scrollbar-thumb:hover {
|
95 |
+
background: #6b7280;
|
96 |
+
}
|
97 |
+
</style>
|
98 |
+
</head>
|
99 |
+
<body class="bg-gray-100 text-gray-900">
|
100 |
+
<div class="flex h-screen overflow-hidden">
|
101 |
+
<!-- Sidebar -->
|
102 |
+
<div class="sidebar hidden md:flex md:flex-shrink-0">
|
103 |
+
<div class="flex flex-col w-64 bg-gray-900 text-white">
|
104 |
+
<div class="flex items-center justify-center h-16 px-4 border-b border-gray-800">
|
105 |
+
<div class="flex items-center">
|
106 |
+
<i class="fas fa-gavel text-xl mr-2 text-gray-300"></i>
|
107 |
+
<span class="text-xl font-semibold">Sistema Penal</span>
|
108 |
+
</div>
|
109 |
+
</div>
|
110 |
+
<div class="flex flex-col flex-grow px-4 py-4 overflow-y-auto">
|
111 |
+
<nav class="flex-1 space-y-2">
|
112 |
+
<a href="#dashboard" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white active">
|
113 |
+
<i class="fas fa-tachometer-alt mr-3"></i>
|
114 |
+
Dashboard
|
115 |
+
</a>
|
116 |
+
<a href="#casos" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
|
117 |
+
<i class="fas fa-balance-scale mr-3"></i>
|
118 |
+
Casos Penais
|
119 |
+
</a>
|
120 |
+
<a href="#audiencias" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
|
121 |
+
<i class="fas fa-calendar-alt mr-3"></i>
|
122 |
+
Audiências
|
123 |
+
</a>
|
124 |
+
<a href="#praticas" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
|
125 |
+
<i class="fas fa-lightbulb mr-3"></i>
|
126 |
+
Melhores Práticas
|
127 |
+
</a>
|
128 |
+
<a href="#relatorios" class="sidebar-link flex items-center px-4 py-3 rounded-lg text-gray-300 hover:text-white">
|
129 |
+
<i class="fas fa-chart-bar mr-3"></i>
|
130 |
+
Relatórios
|
131 |
+
</a>
|
132 |
+
</nav>
|
133 |
+
</div>
|
134 |
+
<div class="p-4 border-t border-gray-800">
|
135 |
+
<div class="flex items-center">
|
136 |
+
<div class="ml-3">
|
137 |
+
<p class="text-sm font-medium text-white">Juiz Carlos Silva</p>
|
138 |
+
<p class="text-xs text-gray-400">Tribunal de Justiça</p>
|
139 |
+
</div>
|
140 |
+
</div>
|
141 |
+
</div>
|
142 |
+
</div>
|
143 |
+
</div>
|
144 |
+
|
145 |
+
<!-- Main Content -->
|
146 |
+
<div class="flex-1 overflow-auto">
|
147 |
+
<!-- Header -->
|
148 |
+
<header class="bg-white shadow-sm">
|
149 |
+
<div class="flex items-center justify-between px-6 py-4">
|
150 |
+
<h1 class="text-2xl font-semibold text-gray-800">Gestão de Casos Penais</h1>
|
151 |
+
<div class="flex items-center space-x-4">
|
152 |
+
<div class="relative">
|
153 |
+
<button class="p-2 text-gray-600 hover:text-gray-900">
|
154 |
+
<i class="fas fa-bell"></i>
|
155 |
+
<span class="absolute top-0 right-0 w-5 h-5 bg-red-500 text-white text-xs rounded-full flex items-center justify-center">3</span>
|
156 |
+
</button>
|
157 |
+
</div>
|
158 |
+
<div class="flex items-center">
|
159 |
+
<div class="w-10 h-10 rounded-full bg-gray-300 flex items-center justify-center">
|
160 |
+
<i class="fas fa-user text-gray-600"></i>
|
161 |
+
</div>
|
162 |
+
</div>
|
163 |
+
</div>
|
164 |
+
</div>
|
165 |
+
</header>
|
166 |
+
|
167 |
+
<main class="p-6">
|
168 |
+
<!-- Dashboard Section -->
|
169 |
+
<section id="dashboard" class="mb-8">
|
170 |
+
<h2 class="section-title text-xl font-semibold mb-6">Dashboard</h2>
|
171 |
+
|
172 |
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
|
173 |
+
<div class="stat-card bg-white rounded-lg shadow p-6">
|
174 |
+
<div class="flex items-center">
|
175 |
+
<div class="p-3 rounded-full bg-gray-100 mr-4">
|
176 |
+
<i class="fas fa-balance-scale text-gray-600 text-xl"></i>
|
177 |
+
</div>
|
178 |
+
<div>
|
179 |
+
<p class="text-gray-500 text-sm">Total de Casos</p>
|
180 |
+
<h3 id="total-cases" class="text-2xl font-bold">0</h3>
|
181 |
+
</div>
|
182 |
+
</div>
|
183 |
+
</div>
|
184 |
+
|
185 |
+
<div class="stat-card bg-white rounded-lg shadow p-6">
|
186 |
+
<div class="flex items-center">
|
187 |
+
<div class="p-3 rounded-full bg-gray-100 mr-4">
|
188 |
+
<i class="fas fa-check-circle text-gray-600 text-xl"></i>
|
189 |
+
</div>
|
190 |
+
<div>
|
191 |
+
<p class="text-gray-500 text-sm">Casos Concluídos</p>
|
192 |
+
<h3 id="completed-cases" class="text-2xl font-bold">0</h3>
|
193 |
+
</div>
|
194 |
+
</div>
|
195 |
+
</div>
|
196 |
+
|
197 |
+
<div class="stat-card bg-white rounded-lg shadow p-6">
|
198 |
+
<div class="flex items-center">
|
199 |
+
<div class="p-3 rounded-full bg-gray-100 mr-4">
|
200 |
+
<i class="fas fa-clock text-gray-600 text-xl"></i>
|
201 |
+
</div>
|
202 |
+
<div>
|
203 |
+
<p class="text-gray-500 text-sm">Em Andamento</p>
|
204 |
+
<h3 id="pending-cases" class="text-2xl font-bold">0</h3>
|
205 |
+
</div>
|
206 |
+
</div>
|
207 |
+
</div>
|
208 |
+
|
209 |
+
<div class="stat-card bg-white rounded-lg shadow p-6">
|
210 |
+
<div class="flex items-center">
|
211 |
+
<div class="p-3 rounded-full bg-gray-100 mr-4">
|
212 |
+
<i class="fas fa-calendar-alt text-gray-600 text-xl"></i>
|
213 |
+
</div>
|
214 |
+
<div>
|
215 |
+
<p class="text-gray-500 text-sm">Audiências Hoje</p>
|
216 |
+
<h3 id="today-hearings" class="text-2xl font-bold">0</h3>
|
217 |
+
</div>
|
218 |
+
</div>
|
219 |
+
</div>
|
220 |
+
</div>
|
221 |
+
|
222 |
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-8">
|
223 |
+
<div class="bg-white rounded-lg shadow p-6">
|
224 |
+
<h3 class="font-semibold text-gray-800 mb-4">Distribuição de Casos por Status</h3>
|
225 |
+
<div class="h-64">
|
226 |
+
<canvas id="casesChart"></canvas>
|
227 |
+
</div>
|
228 |
+
</div>
|
229 |
+
|
230 |
+
<div class="bg-white rounded-lg shadow p-6">
|
231 |
+
<h3 class="font-semibold text-gray-800 mb-4">Prioridade dos Casos</h3>
|
232 |
+
<div class="h-64">
|
233 |
+
<canvas id="priorityChart"></canvas>
|
234 |
+
</div>
|
235 |
+
</div>
|
236 |
+
</div>
|
237 |
+
</section>
|
238 |
+
|
239 |
+
<!-- Casos Penais Section -->
|
240 |
+
<section id="casos" class="mb-8">
|
241 |
+
<div class="flex justify-between items-center mb-6">
|
242 |
+
<h2 class="section-title text-xl font-semibold">Casos Penais</h2>
|
243 |
+
<button onclick="openAddCaseModal()" class="bg-gray-900 hover:bg-gray-800 text-white px-4 py-2 rounded-lg flex items-center">
|
244 |
+
<i class="fas fa-plus mr-2"></i> Novo Caso
|
245 |
+
</button>
|
246 |
+
</div>
|
247 |
+
|
248 |
+
<div id="cases-container" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
249 |
+
<!-- Cases will be loaded here -->
|
250 |
+
</div>
|
251 |
+
</section>
|
252 |
+
|
253 |
+
<!-- Audiências Section -->
|
254 |
+
<section id="audiencias" class="mb-8">
|
255 |
+
<div class="flex justify-between items-center mb-6">
|
256 |
+
<h2 class="section-title text-xl font-semibold">Audiências</h2>
|
257 |
+
<button onclick="openAddHearingModal()" class="bg-gray-900 hover:bg-gray-800 text-white px-4 py-2 rounded-lg flex items-center">
|
258 |
+
<i class="fas fa-plus mr-2"></i> Nova Audiência
|
259 |
+
</button>
|
260 |
+
</div>
|
261 |
+
|
262 |
+
<div class="bg-white rounded-lg shadow overflow-hidden">
|
263 |
+
<div class="overflow-x-auto">
|
264 |
+
<table class="min-w-full divide-y divide-gray-200">
|
265 |
+
<thead class="bg-gray-50">
|
266 |
+
<tr>
|
267 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Data/Hora</th>
|
268 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Processo</th>
|
269 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Partes</th>
|
270 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Tipo</th>
|
271 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Status</th>
|
272 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Ações</th>
|
273 |
+
</tr>
|
274 |
+
</thead>
|
275 |
+
<tbody id="hearings-table" class="bg-white divide-y divide-gray-200">
|
276 |
+
<!-- Hearings will be loaded here -->
|
277 |
+
</tbody>
|
278 |
+
</table>
|
279 |
+
</div>
|
280 |
+
</div>
|
281 |
+
</section>
|
282 |
+
|
283 |
+
<!-- Melhores Práticas Section -->
|
284 |
+
<section id="praticas" class="mb-8">
|
285 |
+
<h2 class="section-title text-xl font-semibold mb-6">Melhores Práticas</h2>
|
286 |
+
|
287 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
288 |
+
<div class="practice-card bg-white rounded-lg shadow p-6">
|
289 |
+
<div class="flex items-start">
|
290 |
+
<div class="flex-shrink-0 mt-1 mr-4">
|
291 |
+
<i class="fas fa-file-alt text-gray-600"></i>
|
292 |
+
</div>
|
293 |
+
<div>
|
294 |
+
<h3 class="font-semibold text-gray-800 mb-2">Documentação Completa</h3>
|
295 |
+
<p class="text-gray-600">Mantenha toda a documentação do processo organizada e atualizada. Isso facilita a tomada de decisões e evita atrasos.</p>
|
296 |
+
</div>
|
297 |
+
</div>
|
298 |
+
</div>
|
299 |
+
|
300 |
+
<div class="practice-card bg-white rounded-lg shadow p-6">
|
301 |
+
<div class="flex items-start">
|
302 |
+
<div class="flex-shrink-0 mt-1 mr-4">
|
303 |
+
<i class="fas fa-users text-gray-600"></i>
|
304 |
+
</div>
|
305 |
+
<div>
|
306 |
+
<h3 class="font-semibold text-gray-800 mb-2">Comunicação Clara</h3>
|
307 |
+
<p class="text-gray-600">Estabeleça canais de comunicação eficazes com promotores, defensores e demais partes envolvidas no processo.</p>
|
308 |
+
</div>
|
309 |
+
</div>
|
310 |
+
</div>
|
311 |
+
|
312 |
+
<div class="practice-card bg-white rounded-lg shadow p-6">
|
313 |
+
<div class="flex items-start">
|
314 |
+
<div class="flex-shrink-0 mt-1 mr-4">
|
315 |
+
<i class="fas fa-clock text-gray-600"></i>
|
316 |
+
</div>
|
317 |
+
<div>
|
318 |
+
<h3 class="font-semibold text-gray-800 mb-2">Pontualidade</h3>
|
319 |
+
<p class="text-gray-600">Cumpra rigorosamente os prazos processuais e horários das audiências para garantir a eficiência do sistema.</p>
|
320 |
+
</div>
|
321 |
+
</div>
|
322 |
+
</div>
|
323 |
+
|
324 |
+
<div class="practice-card bg-white rounded-lg shadow p-6">
|
325 |
+
<div class="flex items-start">
|
326 |
+
<div class="flex-shrink-0 mt-1 mr-4">
|
327 |
+
<i class="fas fa-search text-gray-600"></i>
|
328 |
+
</div>
|
329 |
+
<div>
|
330 |
+
<h3 class="font-semibold text-gray-800 mb-2">Análise Detalhada</h3>
|
331 |
+
<p class="text-gray-600">Analise cuidadosamente todas as provas e depoimentos antes de tomar decisões que impactam a vida das pessoas.</p>
|
332 |
+
</div>
|
333 |
+
</div>
|
334 |
+
</div>
|
335 |
+
</div>
|
336 |
+
</section>
|
337 |
+
</main>
|
338 |
+
</div>
|
339 |
+
</div>
|
340 |
+
|
341 |
+
<!-- Add Case Modal -->
|
342 |
+
<div id="addCaseModal" class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 hidden">
|
343 |
+
<div class="bg-white rounded-lg shadow-lg w-full max-w-md">
|
344 |
+
<div class="flex justify-between items-center border-b border-gray-200 px-6 py-4">
|
345 |
+
<h3 class="text-lg font-semibold text-gray-800">Adicionar Novo Caso</h3>
|
346 |
+
<button onclick="closeModal('addCaseModal')" class="text-gray-500 hover:text-gray-700">
|
347 |
+
<i class="fas fa-times"></i>
|
348 |
+
</button>
|
349 |
+
</div>
|
350 |
+
<div class="p-6">
|
351 |
+
<form id="case-form">
|
352 |
+
<div class="mb-4">
|
353 |
+
<label for="case-number" class="block text-gray-700 text-sm font-medium mb-2">Número do Processo</label>
|
354 |
+
<input type="text" id="case-number" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
|
355 |
+
</div>
|
356 |
+
<div class="mb-4">
|
357 |
+
<label for="case-title" class="block text-gray-700 text-sm font-medium mb-2">Título do Caso</label>
|
358 |
+
<input type="text" id="case-title" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
|
359 |
+
</div>
|
360 |
+
<div class="mb-4">
|
361 |
+
<label for="case-description" class="block text-gray-700 text-sm font-medium mb-2">Descrição</label>
|
362 |
+
<textarea id="case-description" rows="3" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500"></textarea>
|
363 |
+
</div>
|
364 |
+
<div class="grid grid-cols-2 gap-4 mb-4">
|
365 |
+
<div>
|
366 |
+
<label for="case-priority" class="block text-gray-700 text-sm font-medium mb-2">Prioridade</label>
|
367 |
+
<select id="case-priority" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500">
|
368 |
+
<option value="alta">Alta</option>
|
369 |
+
<option value="media" selected>Média</option>
|
370 |
+
<option value="baixa">Baixa</option>
|
371 |
+
</select>
|
372 |
+
</div>
|
373 |
+
<div>
|
374 |
+
<label for="case-status" class="block text-gray-700 text-sm font-medium mb-2">Status</label>
|
375 |
+
<select id="case-status" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500">
|
376 |
+
<option value="em-andamento" selected>Em Andamento</option>
|
377 |
+
<option value="concluido">Concluído</option>
|
378 |
+
<option value="arquivado">Arquivado</option>
|
379 |
+
<option value="aguardando">Aguardando</option>
|
380 |
+
</select>
|
381 |
+
</div>
|
382 |
+
</div>
|
383 |
+
</form>
|
384 |
+
</div>
|
385 |
+
<div class="flex justify-end border-t border-gray-200 px-6 py-4 space-x-3">
|
386 |
+
<button onclick="closeModal('addCaseModal')" class="px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50">Cancelar</button>
|
387 |
+
<button onclick="saveCase()" class="px-4 py-2 bg-gray-900 text-white rounded-lg hover:bg-gray-800">Salvar Caso</button>
|
388 |
+
</div>
|
389 |
+
</div>
|
390 |
+
</div>
|
391 |
+
|
392 |
+
<!-- Add Hearing Modal -->
|
393 |
+
<div id="addHearingModal" class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 hidden">
|
394 |
+
<div class="bg-white rounded-lg shadow-lg w-full max-w-md">
|
395 |
+
<div class="flex justify-between items-center border-b border-gray-200 px-6 py-4">
|
396 |
+
<h3 class="text-lg font-semibold text-gray-800">Agendar Nova Audiência</h3>
|
397 |
+
<button onclick="closeModal('addHearingModal')" class="text-gray-500 hover:text-gray-700">
|
398 |
+
<i class="fas fa-times"></i>
|
399 |
+
</button>
|
400 |
+
</div>
|
401 |
+
<div class="p-6">
|
402 |
+
<form id="hearing-form">
|
403 |
+
<div class="mb-4">
|
404 |
+
<label for="hearing-case" class="block text-gray-700 text-sm font-medium mb-2">Processo</label>
|
405 |
+
<select id="hearing-case" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
|
406 |
+
<option value="">Selecione um processo</option>
|
407 |
+
<!-- Options will be loaded dynamically -->
|
408 |
+
</select>
|
409 |
+
</div>
|
410 |
+
<div class="grid grid-cols-2 gap-4 mb-4">
|
411 |
+
<div>
|
412 |
+
<label for="hearing-date" class="block text-gray-700 text-sm font-medium mb-2">Data</label>
|
413 |
+
<input type="date" id="hearing-date" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
|
414 |
+
</div>
|
415 |
+
<div>
|
416 |
+
<label for="hearing-time" class="block text-gray-700 text-sm font-medium mb-2">Hora</label>
|
417 |
+
<input type="time" id="hearing-time" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" required>
|
418 |
+
</div>
|
419 |
+
</div>
|
420 |
+
<div class="mb-4">
|
421 |
+
<label for="hearing-type" class="block text-gray-700 text-sm font-medium mb-2">Tipo de Audiência</label>
|
422 |
+
<select id="hearing-type" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500">
|
423 |
+
<option value="instrucao">Instrução Processual</option>
|
424 |
+
<option value="julgamento">Julgamento</option>
|
425 |
+
<option value="conciliacao">Conciliação</option>
|
426 |
+
<option value="outras">Outras</option>
|
427 |
+
</select>
|
428 |
+
</div>
|
429 |
+
<div class="mb-4">
|
430 |
+
<label for="hearing-parties" class="block text-gray-700 text-sm font-medium mb-2">Partes Envolvidas</label>
|
431 |
+
<input type="text" id="hearing-parties" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-gray-500" placeholder="Promotor, Defensor, Réu...">
|
432 |
+
</div>
|
433 |
+
</form>
|
434 |
+
</div>
|
435 |
+
<div class="flex justify-end border-t border-gray-200 px-6 py-4 space-x-3">
|
436 |
+
<button onclick="closeModal('addHearingModal')" class="px-4 py-2 border border-gray-300 text-gray-700 rounded-lg hover:bg-gray-50">Cancelar</button>
|
437 |
+
<button onclick="saveHearing()" class="px-4 py-2 bg-gray-900 text-white rounded-lg hover:bg-gray-800">Agendar Audiência</button>
|
438 |
+
</div>
|
439 |
+
</div>
|
440 |
+
</div>
|
441 |
+
|
442 |
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
443 |
+
<script>
|
444 |
+
// Dados iniciais
|
445 |
+
let cases = JSON.parse(localStorage.getItem('cases')) || [];
|
446 |
+
let hearings = JSON.parse(localStorage.getItem('hearings')) || [];
|
447 |
+
|
448 |
+
// Funções para abrir/fechar modais
|
449 |
+
function openAddCaseModal() {
|
450 |
+
document.getElementById('addCaseModal').classList.remove('hidden');
|
451 |
+
}
|
452 |
+
|
453 |
+
function openAddHearingModal() {
|
454 |
+
populateCaseSelect();
|
455 |
+
document.getElementById('addHearingModal').classList.remove('hidden');
|
456 |
+
}
|
457 |
+
|
458 |
+
function closeModal(modalId) {
|
459 |
+
document.getElementById(modalId).classList.add('hidden');
|
460 |
+
document.getElementById(modalId === 'addCaseModal' ? 'case-form' : 'hearing-form').reset();
|
461 |
+
}
|
462 |
+
|
463 |
+
// Função para salvar dados no localStorage
|
464 |
+
function saveData() {
|
465 |
+
localStorage.setItem('cases', JSON.stringify(cases));
|
466 |
+
localStorage.setItem('hearings', JSON.stringify(hearings));
|
467 |
+
renderData();
|
468 |
+
}
|
469 |
+
|
470 |
+
// Função para gerar ID único
|
471 |
+
function generateId() {
|
472 |
+
return Date.now().toString(36) + Math.random().toString(36).substr(2);
|
473 |
+
}
|
474 |
+
|
475 |
+
// Função para formatar data
|
476 |
+
function formatDate(dateString) {
|
477 |
+
const date = new Date(dateString);
|
478 |
+
return date.toLocaleDateString('pt-BR', { day: '2-digit', month: '2-digit', year: 'numeric' });
|
479 |
+
}
|
480 |
+
|
481 |
+
// Função para formatar hora
|
482 |
+
function formatTime(timeString) {
|
483 |
+
return timeString.substring(0, 5); // Remove seconds if present
|
484 |
+
}
|
485 |
+
|
486 |
+
// Função para renderizar casos
|
487 |
+
function renderCases() {
|
488 |
+
const container = document.getElementById('cases-container');
|
489 |
+
container.innerHTML = '';
|
490 |
+
|
491 |
+
cases.forEach(caseItem => {
|
492 |
+
const priorityClass = caseItem.priority === 'alta' ? 'priority-high' :
|
493 |
+
caseItem.priority === 'media' ? 'priority-medium' : 'priority-low';
|
494 |
+
|
495 |
+
const statusText = caseItem.status === 'em-andamento' ? 'Em Andamento' :
|
496 |
+
caseItem.status === 'concluido' ? 'Concluído' :
|
497 |
+
caseItem.status === 'arquivado' ? 'Arquivado' : 'Aguardando';
|
498 |
+
|
499 |
+
const caseElement = document.createElement('div');
|
500 |
+
caseElement.className = 'card-hover bg-white rounded-lg shadow overflow-hidden flex flex-col';
|
501 |
+
caseElement.innerHTML = `
|
502 |
+
<div class="p-6 flex-grow">
|
503 |
+
<div class="flex justify-between items-start mb-2">
|
504 |
+
<h3 class="font-semibold text-gray-800">${caseItem.title}</h3>
|
505 |
+
<div class="flex items-center">
|
506 |
+
<span class="${priorityClass} text-xs font-semibold mr-1">${caseItem.priority.toUpperCase()}</span>
|
507 |
+
<i class="fas fa-circle text-xs ${priorityClass}"></i>
|
508 |
+
</div>
|
509 |
+
</div>
|
510 |
+
<p class="text-sm text-gray-500 mb-4">${caseItem.number}</p>
|
511 |
+
<p class="text-gray-600 text-sm mb-4">${caseItem.description || 'Sem descrição'}</p>
|
512 |
+
<div class="flex justify-between items-center">
|
513 |
+
<span class="status-badge status-${caseItem.status}">${statusText}</span>
|
514 |
+
<div class="flex space-x-2">
|
515 |
+
<button onclick="editCase('${caseItem.id}')" class="text-gray-500 hover:text-gray-700">
|
516 |
+
<i class="fas fa-edit"></i>
|
517 |
+
</button>
|
518 |
+
<button onclick="deleteCase('${caseItem.id}')" class="text-gray-500 hover:text-red-500">
|
519 |
+
<i class="fas fa-trash"></i>
|
520 |
+
</button>
|
521 |
+
</div>
|
522 |
+
</div>
|
523 |
+
</div>
|
524 |
+
`;
|
525 |
+
container.appendChild(caseElement);
|
526 |
+
});
|
527 |
+
}
|
528 |
+
|
529 |
+
// Função para renderizar audiências
|
530 |
+
function renderHearings() {
|
531 |
+
const tbody = document.getElementById('hearings-table');
|
532 |
+
tbody.innerHTML = '';
|
533 |
+
|
534 |
+
hearings.forEach(hearing => {
|
535 |
+
const caseItem = cases.find(c => c.id === hearing.caseId);
|
536 |
+
const hearingType = hearing.type === 'instrucao' ? 'Instrução Processual' :
|
537 |
+
hearing.type === 'julgamento' ? 'Julgamento' :
|
538 |
+
hearing.type === 'conciliacao' ? 'Conciliação' : 'Outras';
|
539 |
+
|
540 |
+
const status = 'Agendada'; // You
|
541 |
+
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=alexandremoraisdarosa/testegestor" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
|
542 |
+
</html>
|