- Sistema FOT (Formatura Operations Tracking): * Tela de Gestão FOT (/cursos) com tabela Excel-style * Modal CourseForm com 10 campos (FOT, Empresa, Instituição, etc) * Validação de FOT (5 dígitos numéricos) * Edição de turmas ao clicar na linha * Integração com API backend (empresas, níveis educacionais, universidades) - Dashboard renovado (/painel): * Tabela com 8 colunas (FOT, Data, Curso, Instituição, Ano, Empresa, Tipo, Status) * Filtros avançados: FOT (busca numérica), Data, Tipo de Evento * Removidos filtros de Estado e Cidade * Página de detalhes com tabela vertical (12 informações) * Botão Aprovar redireciona para modal de equipe - Sistema de Aprovação Dupla (/aprovacao): * 2 tabelas separadas por abas (Usuários Normais e Profissionais) * Coluna Universidade renomeada para Empresa * Coluna Função nos profissionais * Workflow de aprovação com atribuição de equipe - Cadastro Profissional (/cadastro-profissional): * Formulário específico para fotógrafos * Dropdown de Função Profissional da API * Tratamento de erro quando backend offline - Modal de Criar Evento: * Tipo de Evento como primeiro campo * Nome do Evento (Opcional) como segundo campo - Componentes novos: * EventTable.tsx - Tabela de eventos com ordenação * EventFiltersBar.tsx - Filtros avançados (3 filtros) * CourseForm.tsx - Formulário FOT completo * ProfessionalForm.tsx - Cadastro profissional - API Service: * Integração com backend Go * Endpoints: /api/empresas, /api/funcoes, /api/niveis-educacionais, /api/universidades, /graduation-years - Documentação: * README.md principal atualizado * frontend/README.md atualizado * Documentação completa de componentes e features
523 lines
14 KiB
Markdown
523 lines
14 KiB
Markdown
# Frontend - Photum Formaturas
|
|
|
|
Sistema de gerenciamento FOT (Formatura Operations Tracking) e eventos desenvolvido com React, TypeScript e Vite.
|
|
|
|
## 📋 Índice
|
|
|
|
- [Tecnologias](#tecnologias)
|
|
- [Estrutura do Projeto](#estrutura-do-projeto)
|
|
- [Instalação](#instalação)
|
|
- [Scripts Disponíveis](#scripts-disponíveis)
|
|
- [Arquitetura](#arquitetura)
|
|
- [Componentes](#componentes)
|
|
- [Páginas](#páginas)
|
|
- [Novidades e Features](#novidades-e-features)
|
|
- [Contextos](#contextos)
|
|
- [Serviços](#serviços)
|
|
- [Tipos](#tipos)
|
|
- [Configuração](#configuração)
|
|
|
|
## 🚀 Tecnologias
|
|
|
|
- **React 19.2.0** - Biblioteca para construção de interfaces
|
|
- **TypeScript 5.8.2** - Superset JavaScript com tipagem estática
|
|
- **Vite 6.2.0** - Build tool e dev server de alta performance
|
|
- **React Router DOM 7.9.6** - Navegação entre páginas
|
|
- **Mapbox GL 3.16.0** - Mapas interativos
|
|
- **Google GenAI 1.30.0** - Integração com IA generativa do Google
|
|
- **Lucide React 0.554.0** - Ícones modernos
|
|
- **TailwindCSS** - Framework CSS utility-first (via classes inline)
|
|
|
|
## 📁 Estrutura do Projeto
|
|
|
|
```
|
|
frontend/
|
|
├── components/ # Componentes reutilizáveis
|
|
│ ├── Button.tsx # Botão customizável
|
|
│ ├── CourseForm.tsx # Formulário de cadastro FOT
|
|
│ ├── EventCard.tsx # Card de exibição de eventos
|
|
│ ├── EventForm.tsx # Formulário de criação/edição de eventos
|
|
│ ├── EventTable.tsx # Tabela Excel-style (8 colunas)
|
|
│ ├── EventFiltersBar.tsx # Filtros avançados (FOT, Data, Tipo)
|
|
│ ├── Input.tsx # Input customizável
|
|
│ ├── InstitutionForm.tsx # Formulário de instituições
|
|
│ ├── MapboxMap.tsx # Componente de mapa interativo
|
|
│ ├── Navbar.tsx # Barra de navegação
|
|
│ └── ProfessionalForm.tsx # Formulário cadastro profissional
|
|
│
|
|
├── contexts/ # Context API para gerenciamento de estado
|
|
│ ├── AuthContext.tsx # Autenticação e usuários
|
|
│ └── DataContext.tsx # Eventos e instituições
|
|
│
|
|
├── pages/ # Páginas da aplicação
|
|
│ ├── Calendar.tsx # Calendário de eventos
|
|
│ ├── CourseManagement.tsx # Gestão FOT (Turmas)
|
|
│ ├── Dashboard.tsx # Painel principal (Tabela de eventos)
|
|
│ ├── Finance.tsx # Gestão financeira
|
|
│ ├── Home.tsx # Página inicial/landing
|
|
│ ├── Inspiration.tsx # Galeria de inspirações
|
|
│ ├── LGPD.tsx # Página de conformidade LGPD
|
|
│ ├── Login.tsx # Página de login
|
|
│ ├── PrivacyPolicy.tsx # Política de privacidade
|
|
│ ├── ProfessionalRegister.tsx # Cadastro profissional
|
|
│ ├── Register.tsx # Cadastro de novos usuários
|
|
│ ├── Settings.tsx # Configurações do sistema
|
|
│ ├── Team.tsx # Gestão de equipe
|
|
│ ├── TermsOfUse.tsx # Termos de uso
|
|
│ └── UserApproval.tsx # Aprovação de cadastros (2 tabelas)
|
|
│
|
|
├── services/ # Serviços externos e APIs
|
|
│ ├── apiService.ts # API REST do backend Go
|
|
│ ├── genaiService.ts # Integração com Google GenAI
|
|
│ ├── mapboxService.ts # Serviços do Mapbox
|
|
│ └── mockGeoService.ts # Mock para testes de geolocalização
|
|
│
|
|
├── public/ # Arquivos estáticos
|
|
├── App.tsx # Componente raiz da aplicação
|
|
├── index.tsx # Ponto de entrada da aplicação
|
|
├── types.ts # Definições de tipos TypeScript
|
|
├── constants.ts # Constantes da aplicação
|
|
├── vite.config.ts # Configuração do Vite
|
|
├── tsconfig.json # Configuração do TypeScript
|
|
└── package.json # Dependências e scripts
|
|
```
|
|
|
|
## 🔧 Instalação
|
|
|
|
```bash
|
|
# Instalar dependências
|
|
npm install
|
|
|
|
# Configurar variáveis de ambiente
|
|
cp .env.example .env.local
|
|
|
|
# Editar .env.local com suas credenciais
|
|
# VITE_MAPBOX_TOKEN=seu_token_aqui
|
|
# GEMINI_API_KEY=sua_chave_aqui
|
|
```
|
|
|
|
## 📜 Scripts Disponíveis
|
|
|
|
```bash
|
|
# Iniciar servidor de desenvolvimento (porta 3000)
|
|
npm run dev
|
|
|
|
# Build para produção
|
|
npm run build
|
|
|
|
# Preview da build de produção
|
|
npm run preview
|
|
```
|
|
|
|
## 🏗️ Arquitetura
|
|
|
|
### Gerenciamento de Estado
|
|
|
|
O projeto utiliza **Context API** do React para gerenciar estado global:
|
|
|
|
- **AuthContext**: Gerencia autenticação, usuários e permissões
|
|
- **DataContext**: Gerencia eventos, instituições e dados relacionados
|
|
|
|
### Roteamento
|
|
|
|
Navegação baseada em estados internos controlada pelo componente `App.tsx`, sem uso de React Router para simplicidade.
|
|
|
|
### Estilização
|
|
|
|
Utiliza **Tailwind CSS** (via classes inline) com tema customizado:
|
|
|
|
- Cores principais: roxo (`brand-purple`) e preto (`brand-black`)
|
|
- Design responsivo mobile-first
|
|
- Componentes reutilizáveis estilizados
|
|
|
|
## 🧩 Componentes
|
|
|
|
### Button.tsx
|
|
|
|
Botão reutilizável com variantes de estilo e estados de carregamento.
|
|
|
|
### CourseForm.tsx
|
|
|
|
Modal completo para cadastro e edição de FOTs (turmas) com 10 campos:
|
|
- FOT ID (5 dígitos, validação numérica)
|
|
- Empresa (dropdown da API)
|
|
- Nível Educacional (dropdown da API)
|
|
- Observações
|
|
- Instituição (dropdown de universidades da API)
|
|
- Ano Formatura (dropdown da API)
|
|
- Cidade e Estado
|
|
- Gastos Captação e Pré Venda
|
|
|
|
**Features:**
|
|
- Validação de FOT (apenas números, máximo 5 dígitos)
|
|
- Carregamento automático de dados ao editar
|
|
- Integração completa com backend
|
|
|
|
### EventTable.tsx
|
|
|
|
Tabela Excel-style para exibição de eventos com **8 colunas**:
|
|
1. FOT
|
|
2. Data
|
|
3. Curso
|
|
4. Instituição
|
|
5. Ano Formatura
|
|
6. Empresa
|
|
7. Tipo Evento
|
|
8. Status
|
|
9. Ações (condicional para empresa)
|
|
|
|
**Features:**
|
|
- Ordenação por todas as colunas
|
|
- Click na linha abre detalhes
|
|
- Botão "Aprovar" abre modal de equipe
|
|
- Design responsivo
|
|
|
|
### EventFiltersBar.tsx
|
|
|
|
Barra de filtros avançados com **3 filtros**:
|
|
- **FOT**: Campo de busca numérico (5 dígitos)
|
|
- **Data**: Seletor de data
|
|
- **Tipo de Evento**: Dropdown
|
|
|
|
**Features:**
|
|
- Busca em tempo real
|
|
- Exibição de filtros ativos
|
|
- Botão limpar filtros
|
|
- Grid responsivo (3 colunas)
|
|
|
|
### EventCard.tsx
|
|
|
|
Card para exibição visual de eventos com informações principais (data, tipo, status).
|
|
|
|
### EventForm.tsx
|
|
|
|
Formulário completo para criar e editar eventos com validação de campos.
|
|
|
|
**Nova ordem de campos:**
|
|
1. Tipo de Evento* (primeiro)
|
|
2. Nome do Evento (Opcional)
|
|
3. Data e horários
|
|
4. Demais campos...
|
|
|
|
### Input.tsx
|
|
|
|
Input customizado com suporte a diferentes tipos e validação.
|
|
|
|
### InstitutionForm.tsx
|
|
|
|
Formulário para cadastro e edição de instituições de ensino.
|
|
|
|
### MapboxMap.tsx
|
|
|
|
Componente de mapa interativo usando Mapbox GL para visualização de localizações.
|
|
|
|
### Navbar.tsx
|
|
|
|
Barra de navegação responsiva com menu e controle de autenticação.
|
|
|
|
### ProfessionalForm.tsx
|
|
|
|
Formulário específico para cadastro de profissionais (fotógrafos).
|
|
|
|
**Features:**
|
|
- Campo "Função Profissional" com dropdown da API
|
|
- Tratamento de erro quando backend não está rodando
|
|
- Mensagem: "❌ Erro ao carregar funções. Verifique se o backend está rodando"
|
|
|
|
## 📄 Páginas
|
|
|
|
### Home.tsx
|
|
|
|
Landing page com apresentação da empresa, serviços e informações de contato.
|
|
|
|
### Login.tsx / Register.tsx / ProfessionalRegister.tsx
|
|
|
|
Páginas de autenticação para acesso ao sistema:
|
|
- **Login**: Autenticação de usuários
|
|
- **Register**: Cadastro de usuários normais
|
|
- **ProfessionalRegister**: Cadastro específico para fotógrafos
|
|
|
|
### Dashboard.tsx (`/painel`)
|
|
|
|
Painel principal com visualização e gerenciamento de eventos.
|
|
|
|
**Features:**
|
|
- Tabela Excel-style com 8 colunas
|
|
- Filtros avançados (FOT, Data, Tipo)
|
|
- Busca por nome
|
|
- Filtros rápidos (Todos, Ativos, Pendentes)
|
|
- Click na linha → Detalhes do evento
|
|
- Página de detalhes com tabela vertical (12 informações)
|
|
|
|
### CourseManagement.tsx (`/cursos`)
|
|
|
|
Gestão FOT - Cadastro e edição de turmas.
|
|
|
|
**Features:**
|
|
- Tabela Excel-style com todas as turmas
|
|
- Botão "Cadastrar Turma" no header
|
|
- Click na linha para editar
|
|
- Modal CourseForm integrado
|
|
- 11 colunas de informações
|
|
|
|
### UserApproval.tsx (`/aprovacao`)
|
|
|
|
Aprovação de cadastros com **2 tabelas separadas**:
|
|
|
|
**Aba "Usuários Normais":**
|
|
- Filtra `role !== 'PHOTOGRAPHER'`
|
|
- Colunas: Nome, Email, Telefone, Data, Status, Ações
|
|
|
|
**Aba "Profissionais":**
|
|
- Filtra profissionais fotógrafos
|
|
- Colunas: Nome, Email, Telefone, **Função**, Data, Status, Ações
|
|
|
|
### Calendar.tsx
|
|
|
|
Visualização de eventos em formato de calendário mensal.
|
|
|
|
### Team.tsx
|
|
|
|
Gestão da equipe de fotógrafos e colaboradores.
|
|
|
|
### Finance.tsx
|
|
|
|
Controle financeiro e relatórios de eventos.
|
|
|
|
### Settings.tsx
|
|
|
|
Configurações do sistema e preferências do usuário.
|
|
|
|
### Inspiration.tsx
|
|
|
|
Galeria de fotos e inspirações para clientes.
|
|
|
|
### PrivacyPolicy.tsx / TermsOfUse.tsx / LGPD.tsx
|
|
|
|
Páginas legais e de conformidade.
|
|
|
|
## 🎯 Novidades e Features
|
|
|
|
### ✨ Sistema FOT Completo
|
|
- Cadastro de turmas com 10 campos
|
|
- Validação de FOT (5 dígitos numéricos)
|
|
- Integração com API para dropdowns
|
|
- Edição em modal
|
|
|
|
### ✨ Dashboard Renovado
|
|
- Tabela de 8 colunas (FOT, Data, Curso, Instituição, Ano, Empresa, Tipo, Status)
|
|
- Filtro de busca por FOT
|
|
- Detalhes do evento em tabela vertical
|
|
|
|
### ✨ Sistema de Aprovação Dupla
|
|
- 2 tabelas separadas (Normais e Profissionais)
|
|
- Aprovação de eventos abre modal de equipe
|
|
- Workflow completo de aprovação
|
|
|
|
### ✨ Cadastro Profissional
|
|
- Formulário específico para fotógrafos
|
|
- Dropdown de funções da API
|
|
- Tratamento de erro quando backend offline
|
|
|
|
### ✨ Filtros Avançados
|
|
- Busca por FOT (numérico, 5 dígitos)
|
|
- Filtro por Data
|
|
- Filtro por Tipo de Evento
|
|
- Removidos filtros de Estado e Cidade
|
|
|
|
### ✨ Modal de Evento Reorganizado
|
|
- "Tipo de Evento" como primeiro campo
|
|
- "Nome do Evento" como opcional em segundo
|
|
|
|
## 🔄 Contextos
|
|
|
|
### AuthContext
|
|
|
|
```typescript
|
|
interface AuthContextType {
|
|
user: User | null;
|
|
login: (email: string) => Promise<boolean>;
|
|
logout: () => void;
|
|
availableUsers: User[]; // Para demo
|
|
}
|
|
```
|
|
|
|
**Usuários Mock Disponíveis:**
|
|
|
|
- SuperAdmin: `admin@photum.com`
|
|
- Business Owner: `empresa@photum.com`
|
|
- Fotógrafo: `foto@photum.com`
|
|
- Cliente: `cliente@photum.com`
|
|
|
|
### DataContext
|
|
|
|
```typescript
|
|
interface DataContextType {
|
|
events: EventData[];
|
|
institutions: Institution[];
|
|
addEvent: (event: EventData) => void;
|
|
updateEventStatus: (id: string, status: EventStatus) => void;
|
|
assignPhotographer: (eventId: string, photographerId: string) => void;
|
|
getEventsByRole: (userId: string, role: string) => EventData[];
|
|
addInstitution: (institution: Institution) => void;
|
|
updateInstitution: (id: string, institution: Partial<Institution>) => void;
|
|
getInstitutionsByUserId: (userId: string) => Institution[];
|
|
getInstitutionById: (id: string) => Institution | undefined;
|
|
}
|
|
```
|
|
|
|
## 🛠️ Serviços
|
|
|
|
### genaiService.ts
|
|
|
|
Integração com Google Gemini AI para funcionalidades de IA generativa.
|
|
|
|
### mapboxService.ts
|
|
|
|
Serviços de mapeamento e geolocalização usando Mapbox API.
|
|
|
|
### mockGeoService.ts
|
|
|
|
Serviço mock para testes de geolocalização sem consumir API externa.
|
|
|
|
## 📝 Tipos
|
|
|
|
### UserRole (Enum)
|
|
|
|
- `SUPERADMIN`: Acesso total ao sistema
|
|
- `BUSINESS_OWNER`: Proprietário do negócio
|
|
- `EVENT_OWNER`: Cliente/dono do evento
|
|
- `PHOTOGRAPHER`: Fotógrafo
|
|
|
|
### EventStatus (Enum)
|
|
|
|
- `PENDING_APPROVAL`: Aguardando aprovação
|
|
- `PLANNING`: Em planejamento
|
|
- `CONFIRMED`: Confirmado
|
|
- `IN_PROGRESS`: Em execução
|
|
- `DELIVERED`: Entregue
|
|
- `ARCHIVED`: Arquivado
|
|
|
|
### EventType (Enum)
|
|
|
|
- `WEDDING`: Casamento
|
|
- `CORPORATE`: Corporativo
|
|
- `BIRTHDAY`: Aniversário
|
|
- `DEBUTANTE`: Debutante
|
|
- `OTHER`: Outro
|
|
|
|
### Interfaces Principais
|
|
|
|
```typescript
|
|
interface User {
|
|
id: string;
|
|
name: string;
|
|
email: string;
|
|
role: UserRole;
|
|
avatar?: string;
|
|
institutionId?: string;
|
|
}
|
|
|
|
interface Institution {
|
|
id: string;
|
|
name: string;
|
|
type: string;
|
|
cnpj?: string;
|
|
phone: string;
|
|
email: string;
|
|
address?: Address;
|
|
description?: string;
|
|
ownerId: string;
|
|
}
|
|
|
|
interface EventData {
|
|
id: string;
|
|
name: string;
|
|
date: string;
|
|
time: string;
|
|
type: EventType;
|
|
status: EventStatus;
|
|
address: Address;
|
|
contacts: Contact[];
|
|
checklist: ChecklistItem[];
|
|
briefing: string;
|
|
coverImage: string;
|
|
ownerId: string;
|
|
photographerIds: string[];
|
|
institutionId?: string;
|
|
}
|
|
```
|
|
|
|
## ⚙️ Configuração
|
|
|
|
### vite.config.ts
|
|
|
|
```typescript
|
|
- Porta padrão: 3000
|
|
- Host: 0.0.0.0 (acesso externo)
|
|
- Variáveis de ambiente: GEMINI_API_KEY
|
|
- Alias: '@' aponta para a raiz do frontend
|
|
```
|
|
|
|
### Variáveis de Ambiente
|
|
|
|
Crie um arquivo `.env.local`:
|
|
|
|
```env
|
|
VITE_MAPBOX_TOKEN=seu_token_mapbox
|
|
GEMINI_API_KEY=sua_chave_gemini
|
|
```
|
|
|
|
## 🎨 Design System
|
|
|
|
### Cores Principais
|
|
|
|
- **brand-purple**: Cor primária da marca
|
|
- **brand-black**: Cor secundária/texto
|
|
- Tons de cinza para backgrounds e bordas
|
|
|
|
### Breakpoints Responsivos
|
|
|
|
- Mobile: < 640px
|
|
- Tablet: 640px - 1024px
|
|
- Desktop: > 1024px
|
|
|
|
## 📱 Funcionalidades
|
|
|
|
- ✅ Autenticação multi-perfil (SuperAdmin, Owner, Photographer, Client)
|
|
- ✅ CRUD completo de eventos
|
|
- ✅ Gestão de instituições de ensino
|
|
- ✅ Calendário visual de eventos
|
|
- ✅ Mapas interativos com Mapbox
|
|
- ✅ Sistema de checklists para eventos
|
|
- ✅ Galeria de inspirações
|
|
- ✅ Gestão de equipe
|
|
- ✅ Controle financeiro
|
|
- ✅ Páginas de conformidade legal (LGPD, Termos, Privacidade)
|
|
|
|
## 🔒 Segurança
|
|
|
|
- Autenticação baseada em contexto
|
|
- Validação de permissões por role
|
|
- Proteção de rotas baseada em autenticação
|
|
- Conformidade com LGPD
|
|
|
|
## 🚧 Desenvolvimento
|
|
|
|
O projeto está configurado com:
|
|
|
|
- Hot Module Replacement (HMR)
|
|
- TypeScript strict mode
|
|
- Linting automático
|
|
- Path aliases
|
|
|
|
## 📞 Suporte
|
|
|
|
Para dúvidas ou problemas:
|
|
|
|
- Email: contato@photum.com.br
|
|
- Tel: (19) 3405 5024 | (19) 3621 4621
|
|
|
|
---
|
|
|
|
**Desenvolvido por Photum Formaturas** © 2025
|