6.7 KiB
Resumo das Alterações
- Home do Vereador: Novos cards de acesso rápido
- OnlyOffice: Correções no salvamento de documentos
- Listagem de Proposições: Nova UI minimalista com status visual
- Detalhes da Proposição: Layout moderno e intuitivo
1. Tela Home do Vereador
Arquivos Alterados
sapl/templates/index.htmlsapl/base/views.py
Mudanças
Novo card "Matérias Legislativas"
- Adicionado na seção do vereador (
is_parlamentar) - Permite pesquisar projetos de lei e proposições
- Link para
/materia/pesquisar-materia
Novo card "Minhas Matérias"
- Substitui o antigo card "Fluxo de Proposições"
- Filtra automaticamente as matérias pelo autor logado
- Permite ao vereador visualizar e assinar documentos de sua autoria
Alteração na View
IndexViewagora passaautor_idno contexto- Usado para filtrar matérias por autor na pesquisa
2. Correções no OnlyOffice
Arquivos Alterados
sapl/materia/onlyoffice_views.pysapl/templates/materia/onlyoffice_editor.htmlsapl/materia/views.py
Problema Resolvido
Ao tentar enviar uma proposição, aparecia o erro:
"Proposição não possui nenhum tipo de Texto associado"
Isso ocorria porque o callback do OnlyOffice não conseguia salvar o documento corretamente.
Soluções Implementadas
1. Correção no Callback
# Antes: só substituía localhost:8001
if 'localhost:8001' in download_url:
download_url = download_url.replace('localhost:8001', 'onlyoffice:80')
# Depois: substitui qualquer URL externa
download_url = re.sub(r'https?://[^/]+', 'http://onlyoffice:80', download_url)
2. Botão "Salvar e Voltar" no Editor
- Força o fechamento do editor (triggering callback)
- Aguarda 3 segundos para o callback processar
- Redireciona para a página de detalhes
3. Mensagem de Erro Melhorada
- Orienta o usuário a usar o OnlyOffice
- Explica como salvar o documento antes de enviar
4. Aviso no Template de Detalhes
- Alerta quando a proposição não tem texto
- Instrui o usuário a criar o documento
3. Listagem de Proposições (/proposicao/)
Arquivos Alterados
sapl/templates/materia/proposicao_list.htmlsapl/materia/views.py
Nova Interface
Design Minimalista
- Layout limpo com max-width de 900px
- Cards com bordas sutis ao invés de sombras pesadas
- Tipografia clara e espaçamento consistente
Header com Estatísticas
Proposições 5 total 2 em elaboração 1 enviadas
Cards de Proposição Cada card mostra:
- Tipo (ex: Requerimento)
- Status com badge colorido
- Data de envio
- Ementa (truncada em 40 palavras)
- Alerta de devolução (se aplicável)
- Links: Abrir / Editar
Status com Cores
| Status | Cor | Descrição |
|---|---|---|
| Em Elaboração | Cinza | Proposição ainda não enviada |
| Aguardando | Azul | Enviada, aguardando recebimento |
| Incorporada | Verde | Recebida pela Mesa |
| Devolvida | Laranja | Devolvida com justificativa |
| Cancelada | Cinza escuro | Proposição cancelada |
Paginação
- 10 itens por página
- Navegação: Anterior / Números / Próxima
- Indicador "Página X de Y"
Código da View
class ListView(Crud.ListView):
paginate_by = 10
def get_context_data(self, **kwargs):
# Estatísticas
context['stats'] = {
'total': qs.count(),
'elaboracao': qs.filter(data_envio__isnull=True).count(),
# ...
}
# Lista processada com status
for obj in page_obj.object_list:
if obj.cancelado:
status = 'cancelada'
elif obj.data_devolucao:
status = 'devolvida'
# ...
# Paginação
context['is_paginated'] = paginator.num_pages > 1
context['page_obj'] = page_obj
context['page_range'] = make_pagination(...)
4. Detalhes da Proposição (/proposicao/{id})
Arquivos Alterados
sapl/templates/materia/proposicao_detail.html
Nova Interface
Header
- Link "Voltar para lista"
- Título: Tipo + Número/Ano ou "Rascunho"
- Badge de status colorido
Alertas Contextuais
- Vermelho: Proposição devolvida (mostra justificativa)
- Azul: Aguardando recebimento
- Amarelo: Documento não criado
Barra de Ações Muda conforme o estado da proposição:
Em Elaboração:
- Editar Documento (OnlyOffice)
- Enviar Proposição (se tem texto)
- Editar Dados
- Excluir
Enviada:
- Ver Recibo
- Retornar Proposição (se não recebida)
- Baixar Documento
Seções de Conteúdo
-
Ementa - Texto descritivo em destaque
-
Informações - Grid com:
- Tipo
- Número
- Data de Envio
- Data de Recebimento
- Data de Devolução
- Status do Documento (Criado/Não criado)
-
Observação - Se houver
-
Vínculos - Links para:
- Matéria gerada
- Matéria anexadora
-
Info do Sistema (só admin) - Usuário, IP, Última edição, Hash
Página de Acesso Negado
- Ícone de cadeado
- Mensagem clara
- Botão para voltar à lista
Fluxo do Vereador
1. Acessar Home
└── Card "Proposições" → Criar / Listar
2. Criar Proposição
└── Preencher tipo e ementa
└── Redirecionado para OnlyOffice
3. Editar Documento (OnlyOffice)
└── Escrever texto da proposição
└── Clicar "Salvar e Voltar"
4. Enviar Proposição
└── Verificar dados
└── Clicar "Enviar Proposição"
└── Aguardar recebimento
5. Acompanhar Status
└── Listagem mostra status atual
└── Ver detalhes para mais informações
└── Se devolvida, ver justificativa e corrigir
Considerações Técnicas
Compatibilidade Docker
O OnlyOffice roda em container separado. As URLs são convertidas:
- Browser → OnlyOffice:
localhost:8001 - SAPL → OnlyOffice:
onlyoffice:80 - OnlyOffice → SAPL:
sapl-dev:8000
Paginação
Usa a função make_pagination do CRUD base para gerar o range de páginas com reticências.
CSS
Estilos inline no template usando o bloco webpack_loader_chunks_css para evitar conflitos com o CSS global.
Arquivos Modificados (Resumo)
sapl/
├── base/
│ └── views.py # IndexView com autor_id
├── materia/
│ ├── views.py # ListView e mensagens de erro
│ └── onlyoffice_views.py # Correção do callback
└── templates/
├── index.html # Cards do vereador
└── materia/
├── proposicao_list.html # Nova listagem
├── proposicao_detail.html # Novos detalhes
└── onlyoffice_editor.html # Botão salvar e voltar