Tela: Editar Evento da Agenda (/Agenda/Edit/{id})
?? Tela: Editar Evento da Agenda
Rota: /Agenda/Edit/{id}
Método HTTP: GET (exibir formulário) / POST (atualizar evento)
Permissão necessária: Administrador ou Gerente
?? Visão Geral da Tela
Formulário simplificado para edição de eventos existentes. Campos pré-preenchidos com dados atuais do evento. Interface mais enxuta que o Create.
?? Elementos da Interface
1. Cabeçalho da Página
- Breadcrumb: Home ? Agenda ? Editar
- Título: "Editar Evento" (ícone ti-edit)
- Subtitle: Título do evento sendo editado
- Botão secundário: "Voltar" (link para /Agenda/Details/{id})
2. Layout do Formulário
Formulário dividido em 2 colunas:
- Coluna principal (col-lg-8): 2 cards com campos de dados
- Sidebar (col-lg-4): 2 cards com data/horário e botões de ação
?? Campos do Formulário
Campos Hidden
- Id: Campo hidden com ID do evento (obrigatório para update)
Card 1: Informações Básicas
| Campo | Tipo | Obrigatório | Observação |
|---|---|---|---|
| Titulo | text | Sim | Pré-preenchido com Model.Titulo |
| Descricao | textarea (4 rows) | Não | Pré-preenchido com Model.Descricao |
| TurmaId | select (Choices.js) | Não | SelectList com ViewBag.Turmas, seleção atual em Model.TurmaId |
Card 2: Local e Tipo
| Campo | Tipo | Largura | Observação |
|---|---|---|---|
| Local | text | col-md-8 | Pré-preenchido com Model.Local |
| Tipo | text | col-md-4 | Pré-preenchido com Model.Tipo |
Sidebar Card 1: Data e Horário
| Campo | Tipo | Obrigatório | Observação |
|---|---|---|---|
| DataEvento | date | Sim | Pré-preenchido com Model.DataEvento |
| HoraEvento | time | Não | Pré-preenchido com Model.HoraEvento |
| IsPublico | checkbox switch | Não | Marcado se Model.IsPublico = true |
Sidebar Card 2: Botões de Ação
- Salvar Alterações: Botão primário com ícone ti-device-floppy (submit)
- Cancelar: Botão light (link para /Agenda/Details/{id})
?? Funcionalidades JavaScript
Choices.js - Autocomplete de Turma
new Choices(turmaSelect, {
searchEnabled: true,
searchPlaceholderValue: "Buscar turma...",
noResultsText: "Nenhuma turma encontrada",
itemSelectText: "Clique para selecionar",
shouldSort: false,
removeItemButton: true,
placeholder: true,
placeholderValue: "Selecione uma turma"
});
? Validação do Formulário
Validação HTML5
- Atributo
requiredem: Titulo, DataEvento - Validação de tipo: date, time
Validação Server-Side
- ModelState valida campos obrigatórios
- asp-validation-for em cada campo
- Retorna view com erros se validação falhar
?? Notificações e Feedback
Sucesso
Alert verde dismissível após atualização: "Evento atualizado com sucesso!" (via TempData)
Erro
Alert vermelho dismissível com descrição do erro (via TempData)
?? Regras de Negócio
- ID do evento é obrigatório e validado
- Apenas o proprietário/admin pode editar
- Título e Data são obrigatórios
- Campos vazios/null mantêm valores anteriores (a menos que explicitamente alterados)
- TurmaId vazio = Evento Geral
- IsPublico desmarcado = false
- Tipo de evento pode ser alterado livremente
?? Integração com API
GET /Agenda/Edit/{id}
- Retorna view com Model (Evento) pré-preenchido
- ViewBag.Turmas: IEnumerable<Turma>
- Validação: Evento existe e pertence ao tenant
- Redirect para Index se não encontrado
POST /Agenda/Edit/{id}
- Content-Type: application/x-www-form-urlencoded
- Antiforgery token obrigatório
- Route parameter: id
- Model binding para Evento (com Id hidden)
- Validação: ID do route = ID do model
- Redirect após sucesso: /Agenda/Details/{id}
?? Navegação
- Ao salvar com sucesso: Redireciona para /Agenda/Details/{id}
- Ao clicar em "Cancelar": Redireciona para /Agenda/Details/{id}
- Ao clicar em "Voltar": Redireciona para /Agenda/Details/{id}
- Breadcrumb Home: /Dashboard/Index
- Breadcrumb Agenda: /Agenda/Index
?? Responsividade
- Layout 2 colunas em desktop (8/4), empilha em mobile
- Campos lado a lado em tablet+, empilhados em mobile
- Choices.js é responsivo por padrão
?? Bibliotecas Externas
- Choices.js 10.2.0: Autocomplete para select de turma
- estudio-autocomplete.js: Script customizado (se existir)
- Bootstrap 5: Grid, forms
- Tabler Icons: Ícones de interface